Contas falsas custam dinheiro para as empresas. Bots se cadastram para obter testes gratuitos, abusam de programas de indicação e inundam plataformas com spam. Algumas empresas pagam por softwares de prevenção a fraudes para impedir isso. Outras ainda não podem pagar, ou preferem testar o problema primeiro com ferramentas gratuitas.

Este guia mostra um caminho gratuito e open-source para proteção contra bots e proteção contra contas falsas em seus sites. Ele usa duas ferramentas: CrowdSec e ALTCHA. Ambas são open-source. Ambas rodam no seu próprio servidor. Nenhuma custa dinheiro em um nível básico.

Construímos e testamos esta configuração em um servidor Ubuntu 26.04 LTS. Todos os comandos deste guia vêm desse teste.

O que é software de prevenção a fraudes?

Software de prevenção a fraudes detecta e bloqueia atividades prejudiciais antes que causem danos. Para criação de contas, isso significa impedir cadastros falsos, registros de bots e contas com identidade roubada (stolen-identity).

Plataformas pagas de prevenção a fraudes pontuam cada visitante em tempo real. Elas verificam sinais como impressões digitais do dispositivo, movimento do mouse, velocidade de digitação e reputação da rede. Os fornecedores atualizam esses modelos com frequência, usando dados agregados de muitos clientes.

Ferramentas gratuitas e open-source podem cobrir parte desse trabalho. Elas não alcançam o escopo completo de uma plataforma paga. Este guia mostra o que as ferramentas gratuitas podem fazer e onde elas param.

Por que isso é importante para lojas de e-commerce

Contas falsas atingem lojas online de maneiras que custam dinheiro real. Um bot pode criar dezenas de contas para reivindicar um código de desconto de primeira compra, repetidamente. Contas falsas podem deixar avaliações falsas, o que prejudica a confiança dos compradores. Elas também podem explorar bônus de indicação, cadastrando-se com links de referência falsos para coletar recompensas destinadas a clientes reais.

A prevenção de abuso de códigos promocionais e de fraudes de indicação é mais importante onde a perda financeira é direta e fácil de medir. Se sua loja oferece desconto de cadastro, programa de indicação ou sistema de avaliações, a proteção contra contas falsas não é opcional.

A configuração deste guia funciona da mesma forma para o formulário de cadastro ou checkout de uma loja online como para qualquer outro site.

Duas camadas de proteção contra bots e contas falsas

A proteção contra contas falsas funciona melhor em camadas. Nenhuma ferramenta única captura tudo. Este guia constrói duas camadas.

  1. CrowdSec monitora o tráfego de rede. Ele bloqueia endereços IP maliciosos conhecidos, tentativas de login de força bruta e varreduras automatizadas.
  2. ALTCHA monitora o formulário de cadastro. Ele usa um desafio de prova de trabalho challenge para filtrar bots simples.

Juntas, essas camadas impedem uma grande parte do tráfego de bots de baixo esforço. Elas não impedem atacantes que usam navegadores reais e comportamento humano. Explicamos essa lacuna mais adiante neste guia.

Pré-requisitos

Este guia foi construído e testado na seguinte configuração.

Vamos orientá-lo a instalar e configurar cada ferramenta no ponto em que ela é necessária.

Parte 1: Configurando o CrowdSec

CrowdSec é um sistema de prevenção de intrusão open-source. Ele lê logs do sistema, como logs SSH e logs do servidor web. Ele procura padrões de ataque nesses logs. Quando encontra um, cria uma decisão para bloquear aquele endereço IP. Um programa separado, chamado bouncer, aplica o bloqueio através do firewall do servidor.

O CrowdSec também compartilha dados de ameaças com sua comunidade de usuários. Se outro usuário do CrowdSec bloquear um IP atacante, seu servidor pode se beneficiar do mesmo bloqueio. Isso requer inscrição no Console CrowdSec, um passo gratuito coberto abaixo.

Verifique seu sistema primeiro

Confirme a versão do seu sistema operacional e algumas configurações antes de instalar qualquer coisa:

lsb_release -a
sudo systemctl status ufw
timedatectl

Confirme três coisas: a versão do seu sistema operacional, se o firewall UFW está ativo e se o relógio do sistema está sincronizado. O CrowdSec precisa de timestamps precisos para funcionar corretamente.

Regras de firewall se o UFW estiver ativo

O CrowdSec e o UFW fazem trabalhos diferentes. O UFW controla quais portas estão abertas em geral. O bouncer do CrowdSec bloqueia endereços IP específicos que ele marca como maliciosos. Um não substitui o outro. Mantenha o UFW ativo e deixe o bouncer do CrowdSec rodar ao lado dele.

Se o UFW estiver ativo, abra apenas o que esta configuração precisa.

Permita SSH antes de habilitar o UFW, não depois. Se você habilitar o UFW sem uma regra SSH primeiro, você se tranca para fora de um servidor remoto imediatamente, sem volta, exceto pelo console do seu provedor de nuvem.

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

As portas 5000 e 8080 permanecem fechadas de propósito. O Flask só precisa ser acessível pelo Nginx, na mesma máquina, via 127.0.0.1. Abrir a porta 5000 ao público permitiria que visitantes contornassem o Nginx e o TLS, atingindo o Flask diretamente. O agente e o bouncer do CrowdSec também se comunicam via 127.0.0.1, e só precisam de uma porta pública se você estiver executando o CrowdSec em vários servidores, o que este guia não cobre.

O UFW e o bouncer do CrowdSec criam regras de firewall separadas e não entram em conflito em uso normal.

Uma ressalva: Em algumas configurações, as próprias regras do UFW podem tornar os contadores de métricas do bouncer menos precisos. O bloqueio em si continua funcionando corretamente. Apenas a exibição das métricas é afetada.

Instale o agente CrowdSec

Abra seu terminal e execute os seguintes comandos para adicionar o repositório CrowdSec e instalar o agente CrowdSec no Ubuntu:

curl -s https://install.crowdsec.net | sudo sh
sudo apt install -y crowdsec

Isso instala o mecanismo de detecção principal, chamado agente. O agente lê logs. Ele não bloqueia tráfego por conta própria.

Verifique a instalação:

sudo systemctl status crowdsec --no-pager
sudo cscli collections list

Uma coleção é um pacote de regras de detecção para um tipo de serviço. Em um servidor novo, o CrowdSec instala coleções para SSH e segurança Linux geral por padrão.

Exemplo de saída:

────────────────────────────────────────────────────────────────────────────────────────────────────────────────
COLLECTIONS
────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Name                                 📦 Status   Version  Local Path
────────────────────────────────────────────────────────────────────────────────────────────────────────────────
crowdsecurity/linux                  ✔️  enabled  0.4      /etc/crowdsec/collections/linux.yaml
crowdsecurity/sshd                   ✔️  enabled  0.9      /etc/crowdsec/collections/sshd.yaml
crowdsecurity/whitelist-good-actors  ✔️  enabled  0.4      /etc/crowdsec/collections/whitelist-good-actors.yaml
────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Instale o Nginx e conecte-o ao CrowdSec

A maioria das criações de contas falsas acontece através do formulário de cadastro de um site. Para proteger esse formulário, o CrowdSec precisa ler os logs do seu servidor web.

Instale o Nginx:

sudo apt install -y nginx

Adicione a coleção Nginx:

sudo cscli collections install crowdsecurity/nginx

Observe que instalar uma coleção apenas adiciona regras de detecção. Isso não diz ao CrowdSec onde estão os arquivos de log. Você deve adicionar isso separadamente:

sudo tee /etc/crowdsec/acquis.d/nginx.yaml > /dev/null <<EOF
filenames:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
labels:
type: nginx
EOF

Reinicie o serviço CrowdSec para aplicar as mudanças:

sudo systemctl restart crowdsec

Teste se o CrowdSec agora lê esses logs:

curl http://localhost/
sudo cscli metrics

Procure por /var/log/nginx/access.log na tabela Acquisition Metrics. A contagem de linhas lidas deve ser maior que zero.

Instale o bouncer

O agente detecta. O bouncer bloqueia. Precisamos de ambos.

O Ubuntu 26.04 usa nftables como backend de firewall. Isso substituiu o sistema iptables mais antigo. Instale o bouncer correspondente:

sudo apt install -y crowdsec-firewall-bouncer-nftables
sudo cscli bouncers list

A lista de bouncers deve mostrar seu bouncer como válido. Também deve mostrar um timestamp de conexão recente.

Exemplo de saída:

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Name                            IP Address  Valid  Last API pull         Type                       Version                                                                  Auth Type
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cs-firewall-bouncer-1786521275  127.0.0.1   ✔️      2026-08-12T07:54:36Z  crowdsec-firewall-bouncer  v0.0.36-debian-pragmatic-amd64-4c315193cd4f19e3937cdee2f15183ec4d602f56  api-key
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Confirme que o pipeline completo funciona

Teste com um bloqueio manual. Use um endereço IP de teste reservado que nunca carregará tráfego real:

sudo cscli decisions add --ip 192.0.2.100 --duration 5m --reason "manual-test-block"
sudo nft list ruleset | grep -A 5 -i crowdsec

Verifique o resultado. Se o endereço IP (ou seja, 192.0.2.100 no nosso caso) aparecer no conjunto de regras do nftables com uma regra de drop, a cadeia completa funciona: detecção, decisão e aplicação.

Junte-se à rede comunitária de inteligência de ameaças

Instalamos o agente CrowdSec na nossa máquina. Agora precisamos adicionar a máquina à rede CrowdSec.

Para fazer isso, execute:

sudo cscli console enroll --quick

Este comando imprime um link.

INFO Please visit the following URL to enroll your instance: https://app.crowdsec.net/quick-enroll?token=xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
INFO This link is valid for the next 15m0s.
INFO Please restart crowdsec after accepting the enrollment.
INFO manual set to true
INFO context set to true
INFO Enabled manual : Forward manual decisions to the console
INFO Enabled tainted : Forward alerts from tainted scenarios to the console
INFO Enabled context : Forward context with alerts to the console

Abra-o em um navegador. Entre com uma conta gratuita do CrowdSec e clique em Enroll engine. Observe que o link é válido por 15 minutos apenas, então complete este passo o mais rápido possível.

Este passo conecta seu servidor à lista de bloqueio compartilhada do CrowdSec, construída com dados de muitos usuários.

O que o CrowdSec captura e o que ele não captura

O CrowdSec é forte na prevenção de fraudes em nível de rede. Ele impede:

  • Tentativas de SSH brute-force
  • Endereços IP maliciosos conhecidos
  • Varreduras automatizadas e tentativas comuns de exploração

O CrowdSec não observa o que acontece dentro do seu formulário de cadastro. Ele não consegue distinguir uma pessoa real de um bot, se ambos enviarem uma requisição normal de um IP limpo. É por isso que a proteção contra contas falsas precisa de uma segunda camada.

Parte 2: Adicionando ALTCHA para proteção contra contas falsas

ALTCHA é uma alternativa open-source ao CAPTCHA. Ele não pede que os usuários resolvam um quebra-cabeça. Em vez disso, pede que o navegador resolva um pequeno problema matemático, chamado desafio de prova de trabalho challenge. Navegadores reais resolvem isso em menos de um segundo. Bots simples pulam essa etapa e são bloqueados.

O ALTCHA vem em duas partes:

  • O widget open-source. Gratuito e auto-hospedado. É o que usamos neste guia.
  • ALTCHA Sentinel. Um produto separado e pago. Adiciona aprendizado de máquina e análise de comportamento. Abordamos isso mais adiante.

Construa um aplicativo de cadastro de teste

Usamos Flask, um pequeno framework web Python, para construir um formulário de cadastro de teste. Isso espelha uma página real de criação de conta. Ele coleta um email e um nome de usuário, e verifica se há uma solução ALTCHA válida antes de salvar a conta.

Instale pip se ainda não estiver instalado:

sudo apt install -y python3.14-venv python3-pip

Configure o ambiente:

mkdir -p ~/testapp && cd ~/testapp
python3 -m venv venv
source venv/bin/activate
pip install flask altcha

O código completo do aplicativo está disponível como um GitHub Gist em nosso repositório GitHub. Baixe-o usando o comando:

curl -O https://gist.githubusercontent.com/ostechnix/679974866de0cc00f0de57a8b14ccd12/raw/d917c3c79c358f70105801e40d2559235e54f570/altcha-signup-demo.py

O arquivo inclui o formulário de cadastro, o endpoint challenge e uma página de administração. A página de administração registra tanto cadastros aceitos quanto rejeitados. As partes principais são:

  • Uma rota GET /altcha-challenge. Ela cria um novo desafio de prova de trabalho challenge para cada carregamento de página.
  • Uma rota POST /signup. Ela rejeita qualquer requisição sem um payload ALTCHA válido e resolvido.
  • Uma tabela no banco de dados para tentativas rejeitadas. Ela registra o motivo e o endereço IP de origem. Esse log dá evidência real do que a ferramenta captura.

Renomeie e execute:

mv altcha-signup-demo.py app.py
python app.py &

Agora o aplicativo rodará em segundo plano.

Conecte o Nginx como proxy reverso

Um proxy reverso fica entre a internet e seu aplicativo. Ele encaminha requisições para o Flask. Também lida com criptografia e logs.

sudo tee /etc/nginx/sites-available/testapp > /dev/null <<'EOF'
server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name _;
ssl_certificate     /etc/nginx/ssl/testapp.crt;
ssl_certificate_key /etc/nginx/ssl/testapp.key;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF

Este arquivo sozinho não faz nada até que o Nginx seja instruído a usá-lo. Habilite o site, remova o padrão e verifique a configuração antes de recarregar:

sudo rm -f /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/testapp /etc/nginx/sites-enabled/testapp

Configurando HTTPS (importante)

Este ponto surpreende muitos usuários de ALTCHA pela pr-timeira vez. O desafio de prova de trabalho challenge depende de um recurso do navegador chamado Web Crypto API. Os navegadores só permitem esse recurso sobre HTTPS, ou em localhost. Uma conexão HTTP simples em um endereço de rede local falhará. O navegador reportará: "Secure context (HTTPS) required."

Para um laboratório de teste, um certificado autoassinado é suficiente:

sudo mkdir -p /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/testapp.key \
-out /etc/nginx/ssl/testapp.crt \
-subj "/CN=192.168.0.30"

Para um site ao vivo, use um certificado de uma autoridade confiável, como Let's Encrypt. Substitua 192.168.0.30 no comando acima pelo endereço IP do seu servidor.

Verifique se a configuração do nginx tem erros:

sudo nginx -t

Você deve ver:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Se não houver erros, reinicie o serviço nginx:

sudo systemctl reload nginx

nginx -t apenas verifica a sintaxe. Ele não avisará se nenhum site estiver realmente habilitado, então não pule o passo ln -s da seção anterior.

Corresponda a versão do widget à versão da biblioteca

Durante os testes, o widget ALTCHA falhou com "Verification failed", quase instantaneamente. Essa velocidade foi a pista: uma verificação real de prova de trabalho leva um momento para rodar. A causa era uma incompatibilidade de versão. A biblioteca Python no servidor constrói um formato challenge. Versões mais antigas do widget JavaScript esperam um formato diferente e mais antigo.

A correção é simples: corresponda as versões principais. No momento deste guia, o widget atual é a versão 3. Ele usa um atributo challenge no HTML e combina corretamente com a biblioteca Python altcha atual. Verifique suas versões antes de assumir que sua configuração está quebrada.

Teste o resultado

Primeiro, encontre o endereço do seu servidor e abra a página de cadastro. Execute isto no servidor para encontrar seu IP LAN:

ip -4 addr show | grep inet

Procure o endereço na sua interface de rede principal, como 192.168.0.30. Este exemplo usa esse endereço; substitua pelo IP do seu próprio servidor em todo o guia.

De um navegador em outro dispositivo na mesma rede, vá para https://192.168.0.30/.

Você verá um aviso de certificado primeiro. Isso é esperado, já que o certificado é autoassinado para este laboratório. Clique através dele: no Firefox, escolha "Advanced", depois "Accept the Risk and Continue". No Chrome, escolha "Advanced", depois "Proceed".

A página de cadastro deve carregar, com um campo de email, um campo de nome de usuário e a caixa de seleção ALTCHA abaixo deles.

Uma configuração funcional mostra dois resultados.

Um navegador real, resolvendo o desafio, tem sucesso. Clique na caixa de seleção. O widget resolve o desafio de prova de trabalho challenge e mostra uma marca de verificação verde, rotulada "Verified". Isso leva um momento. Não é instantâneo, pois computação real está acontecendo no seu navegador.

Preencha o formulário e clique em "Sign Up". A página deve mostrar "Account created".

Use quaisquer valores no formulário de cadastro. Deve funcionar.

Um script de bot, pulando o desafio, falha.

curl -sk -X POST https://localhost/signup -d "[email protected]&username=botuser"

Esta requisição não carrega payload ALTCHA. O servidor a rejeita e registra o motivo. Um script que pula o código real do navegador não pode passar nesta verificação.

127.0.0.1 - - [12/Aug/2026 08:22:14] "POST /signup HTTP/1.0" 400 -
<!DOCTYPE html>
<html>
<head><title>Blocked</title></head>
<body style="font-family: sans-serif; max-width: 400px; margin: 40px auto;">
<h2>Signup rejected</h2>
<p>Reason: Missing verification payload (bot-like request)</p>
<a href="/">Try again</a>
</body>

Visite https://192.168.0.30/admin (usando o endereço do seu próprio servidor) para ver ambos os resultados lado a lado: cadastros reais aceitos e a tentativa de bot registrada como rejeitada, com motivo e endereço IP de origem.

Parabéns! Você acabou de construir uma configuração de proteção contra contas falsas para seu site usando CrowdSec e ALTCHA no Ubuntu.

Como você pode ver, é uma configuração bem básica, mas funciona! Vá explorar a documentação do ALTCHA para configurações mais avançadas.

Limitação

O CrowdSec e o widget ALTCHA open-source impedem bots simples e de baixo esforço. Eles não impedem todos os tipos de contas falsas. Este é o limite honesto da configuração deste guia.

Um atacante mais capaz pode usar um navegador automatizado real, controlado por ferramentas como Playwright ou Selenium. Esse tipo de bot executa JavaScript real. Ele pode resolver o desafio de prova de trabalho challenge do ALTCHA, da mesma forma que o navegador de um humano faz. Contra esse tipo de atacante, a pilha gratuita deste guia não oferece proteção.

Esta é a lacuna que plataformas pagas de proteção contra bots e prevenção a fraudes visam fechar. Elas adicionam sinais além da prova de trabalho. Isso inclui movimento do mouse, ritmo de digitação e impressão digital do dispositivo. Elas também usam modelos treinados com tráfego de muitos clientes. O quão bem uma plataforma fecha essa lacuna depende do fornecedor. Também depende do seu próprio tráfego. Faça sua própria pesquisa e encontre a melhor solução comercial para seus sites de produção.

Perguntas frequentes (FAQ)

P: O CrowdSec é gratuito?

R: Sim. O agente CrowdSec e os bouncers são open-source e gratuitos para auto-hospedar. Existe um nível pago do console para organizações maiores, mas não é necessário para a configuração deste guia.

P: O ALTCHA é gratuito?

R: O widget ALTCHA é gratuito e open-source. O ALTCHA Sentinel é um produto separado com recursos de aprendizado de máquina. É pago, após um teste de 30-day.

P: Bots podem contornar o ALTCHA?

R: Um script simples que envia um formulário diretamente, sem carregar a página ou executar JavaScript, não pode passar no ALTCHA. Um bot usando um navegador automatizado completo pode resolver o challenge, já que se comporta como um navegador real. Este é o principal limite do widget gratuito e open-source.

P: Preciso de HTTPS para o ALTCHA funcionar?

R: Sim. O desafio de prova de trabalho challenge depende de um recurso do navegador que só funciona sobre HTTPS, ou em localhost. Um site HTTP simples não funcionará, mesmo em uma rede local.

P: Quando devo pagar por software de prevenção a fraudes?

R: Considere uma plataforma paga quando contas falsas causarem danos financeiros reais. Também considere quando você tiver evidências de que bots estão contornando suas defesas gratuitas, como navegadores automatizados resolvendo seus desafios de prova de trabalho challenge em escala.

Resumo

A proteção contra contas falsas e bots não exige um grande orçamento para começar. O CrowdSec, um sistema de prevenção de intrusão open-source, impede ameaças em nível de rede, como ataques de força bruta e endereços IP maliciosos conhecidos. O ALTCHA, um widget de prova de trabalho open-source, impede bots simples no formulário de cadastro.

Juntas, essas duas ferramentas oferecem uma defesa real, funcional e gratuita. Elas impedem uma grande parte da criação de contas falsas. Não pegarão um atacante usando um navegador automatizado real. Para esse nível de ameaça, software pago de prevenção a fraudes adiciona análise comportamental para fechar a lacuna. O quão bem isso funciona varia por fornecedor. Você deve fazer sua própria avaliação antes de comprar qualquer opção comercial.

Comece com a camada gratuita. Meça o que passa, usando o log de rejeições que este guia constrói. Decida por uma plataforma paga quando tiver dados reais mostrando onde a camada gratuita fica aquém.