TL;DR — Resumo Rápido
Guia completo do CrowdSec: instale, configure bouncers, cenários personalizados, listas comunitárias e proteção Nginx+SSH em servidores Linux.
Todo servidor conectado à internet está sob ataque constante: scanners SSH, crawlers de vulnerabilidades web, bots de credential-stuffing e abusadores de API geram milhões de requisições maliciosas a cada hora. CrowdSec é um sistema de prevenção de intrusões moderno e de código aberto que vai além da análise de logs em um único servidor: analisa seus registros localmente, detecta padrões de ataque usando cenários comportamentais e compartilha IPs de atacantes de forma anônima com uma comunidade global para construir listas de bloqueio colaborativas. Este guia cobre a configuração completa do CrowdSec: arquitetura, instalação no Debian/Ubuntu e RHEL/Rocky, coleções, bouncers, cenários personalizados, listas brancas, implantação multi-servidor e um passo a passo de hardening em produção protegendo Nginx e SSH.
Pré-requisitos
Antes de começar, certifique-se de ter:
- Um servidor Linux rodando Ubuntu 20.04/22.04/24.04, Debian 11/12 ou RHEL/Rocky/AlmaLinux 8/9
- Acesso root ou sudo
- systemd como sistema de inicialização
- iptables, nftables ou firewalld disponíveis para o bouncer de firewall
- Familiaridade básica com arquivos de configuração YAML
Como o CrowdSec Funciona
O CrowdSec separa a detecção de ameaças de sua aplicação em três camadas:
1. Agente (detecção)
O agente do CrowdSec lê logs de arquivos, journald, Docker, Kafka ou syslog. Os logs passam por um pipeline de parsing em estágios: S00-raw normaliza o texto bruto, S01-parse extrai campos estruturados (IP, timestamp, método HTTP, caminho) e S02-enrich adiciona dados de GeoIP e CTI. Os eventos analisados alimentam cenários — máquinas de estado YAML que implementam lógica de leaky-bucket, trigger ou contador para identificar padrões de ataque.
2. API Local (coordenação) A API Local (LAPI) recebe decisões do agente, armazena-as em SQLite ou PostgreSQL e as serve para os bouncers. Em uma configuração multi-máquina, um servidor executa a LAPI enquanto todos os outros agentes e bouncers se conectam a ela via HTTPS.
3. API Central (inteligência comunitária)
Ao registrar sua instância, a API Central em api.crowdsec.net envia listas de bloqueio comunitárias para sua LAPI e recebe relatórios anônimos de IPs de você. Isso transforma cada implantação do CrowdSec em um sensor que alimenta a rede global de ameaças.
4. Bouncers (aplicação) Os bouncers consultam a LAPI para obter decisões ativas e as aplicam: o bouncer de firewall adiciona regras ao iptables/nftables, o bouncer do Nginx emite respostas HTTP 403 ou desafios CAPTCHA, e o bouncer do Cloudflare cria regras de firewall na borda via API do Cloudflare.
Instalação
Ubuntu / Debian
curl -s https://install.crowdsec.net | sudo bash
sudo apt install crowdsec -y
sudo systemctl enable --now crowdsec
sudo systemctl status crowdsec
RHEL / Rocky / AlmaLinux
curl -s https://install.crowdsec.net | sudo bash
sudo dnf install crowdsec -y
sudo systemctl enable --now crowdsec
Docker
services:
crowdsec:
image: crowdsecurity/crowdsec:latest
restart: unless-stopped
environment:
COLLECTIONS: "crowdsecurity/linux crowdsecurity/nginx crowdsecurity/sshd"
volumes:
- /var/log:/var/log:ro
- crowdsec_data:/var/lib/crowdsec/data
- crowdsec_config:/etc/crowdsec
ports:
- "8080:8080"
volumes:
crowdsec_data:
crowdsec_config:
Kubernetes (Helm)
helm repo add crowdsec https://crowdsecurity.github.io/helm-charts
helm repo update
helm install crowdsec crowdsec/crowdsec \
--set agent.acquisition[0].namespace=default \
--set agent.acquisition[0].podName="*" \
--set agent.acquisition[0].program=nginx
Instalando Coleções
As coleções agrupam parsers e cenários para um serviço específico. Instale-as com cscli:
# Coleção base Linux (auth, syslog)
sudo cscli collections install crowdsecurity/linux
# Detecção de força bruta SSH
sudo cscli collections install crowdsecurity/sshd
# Detecção de ataques Nginx
sudo cscli collections install crowdsecurity/nginx
# Apache
sudo cscli collections install crowdsecurity/apache2
# WordPress
sudo cscli collections install crowdsecurity/wordpress
# Recarregar após instalar novas coleções
sudo systemctl reload crowdsec
Liste o conteúdo instalado do hub:
sudo cscli hub list
sudo cscli collections list
sudo cscli scenarios list
sudo cscli parsers list
Aquisição de Logs
O CrowdSec descobre fontes de logs via /etc/crowdsec/acquis.yaml. Múltiplos métodos são suportados:
Fonte de arquivo
filenames:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
labels:
type: nginx
# --- (next source)
filenames:
- /var/log/auth.log
labels:
type: syslog
journald / systemd
source: journalctl
journalctl_filter:
- "_SYSTEMD_UNIT=sshd.service"
labels:
type: syslog
Contêineres Docker
source: docker
container_name:
- nginx
- myapp
labels:
type: nginx
Após editar acquis.yaml, reinicie o agente:
sudo systemctl restart crowdsec
Cenários e Parsers
Tipos de cenário
| Tipo | Descrição | Caso de uso |
|---|---|---|
leakybucket | Conta eventos em janela deslizante; estouro dispara decisão | Força bruta (N falhas em T segundos) |
trigger | Um único evento dispara imediatamente | Eventos críticos únicos |
counter | Conta valores distintos (ex.: URLs escaneadas) | Scanners, enumeradores |
Cenário personalizado de exemplo
Crie /etc/crowdsec/scenarios/myapp-bruteforce.yaml:
type: leakybucket
name: myapp/bruteforce
description: "Detectar força bruta no endpoint de login do myapp"
filter: "evt.Meta.service == 'myapp' && evt.Meta.log_type == 'auth_failed'"
groupby: "evt.Meta.source_ip"
distinct: "evt.Meta.username"
capacity: 5
leakspeed: "10s"
blackhole: "5m"
labels:
service: myapp
type: bruteforce
remediation: true
Campos principais:
| Campo | Significado |
|---|---|
capacity | Preenchimento máximo do balde antes do estouro |
leakspeed | Taxa de drenagem do balde |
blackhole | Tempo mínimo entre estouros repetidos para o mesmo IP |
groupby | Por que agrupar eventos (geralmente IP de origem) |
distinct | Conta valores distintos para evitar evasão com múltiplos usuários |
remediation: true | Estouro gera uma decisão de bloqueio |
Instalando e Configurando Bouncers
Bouncer de firewall (iptables/nftables)
# Backend iptables
sudo apt install crowdsec-firewall-bouncer-iptables -y
# Backend nftables
sudo apt install crowdsec-firewall-bouncer-nftables -y
sudo systemctl enable --now crowdsec-firewall-bouncer
Verifique o registro:
sudo cscli bouncers list
Bouncer do Nginx
sudo apt install crowdsec-nginx-bouncer -y
Configuração em /etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf:
API_KEY=<auto-gerado>
API_URL=http://localhost:8080
MODE=ban # ban | captcha | throttle
CAPTCHA_SITE_KEY=<chave-recaptcha-v2>
CAPTCHA_SECRET_KEY=<segredo-recaptcha-v2>
CAPTCHA_GRACE_TIME=1800
Bouncer do Cloudflare
sudo apt install crowdsec-cloudflare-bouncer -y
sudo crowdsec-cloudflare-bouncer -g <CF_API_TOKEN> -o /etc/crowdsec/bouncers/crowdsec-cloudflare-bouncer.yaml
sudo systemctl enable --now crowdsec-cloudflare-bouncer
Referência do cscli
# Decisões
sudo cscli decisions list # Todos os bloqueios ativos
sudo cscli decisions add -i 203.0.113.42 # Bloqueio manual
sudo cscli decisions add -r 10.0.0.0/8 -t ban -d 1h # Bloquear CIDR
sudo cscli decisions delete -i 203.0.113.42 # Remover bloqueio
# Alertas
sudo cscli alerts list # Cenários disparados recentemente
sudo cscli alerts inspect <id> # Contexto completo do alerta
# Gerenciamento do hub
sudo cscli hub list
sudo cscli hub update
sudo cscli collections upgrade crowdsecurity/nginx
# Gerenciamento de máquinas (multi-servidor)
sudo cscli machines list
sudo cscli machines add agent-web-02 --auto
# Gerenciamento de bouncers
sudo cscli bouncers list
sudo cscli bouncers add meu-bouncer
# Métricas
sudo cscli metrics
Listas de Bloqueio Comunitárias e API Central
Registre-se na API Central para desbloquear as listas comunitárias:
sudo cscli console enroll <seu-token-de-app.crowdsec.net>
sudo systemctl restart crowdsec
As listas comunitárias incluem:
- Lista de reputação de IPs do CrowdSec — IPs detectados atacando implantações do CrowdSec no mundo todo
- Firehol Level 1 — IPs maliciosos conhecidos
- Nós de saída Tor — opcional, para bloquear tráfego anônimo
- Listas de proxy/VPN — IPs de saída de provedores cloud usados por bots
Cada decisão da API Central tem um type: ban (bloqueio rígido), captcha (desafio CAPTCHA) ou throttle (limitação de taxa).
Listas Brancas
Lista branca de parser (pré-cenário)
Crie /etc/crowdsec/parsers/s02-enrich/whitelist.yaml:
name: minhaempresa/whitelists
description: "IPs de escritório e monitoramento"
whitelist:
reason: "IPs internos e confiáveis"
ip:
- "192.168.1.0/24"
- "10.0.0.0/8"
cidr:
- "172.16.0.0/12"
Lista branca pós-estouro
name: minhaempresa/postoverflow-whitelist
description: "Permitir monitoramento sintético de IPs conhecidos"
whitelist:
reason: "Monitoramento de disponibilidade"
expression:
- "evt.Overflow.Alert.Source.IP in ['203.0.113.100', '203.0.113.101']"
Configuração Multi-Servidor
Servidor LAPI
# /etc/crowdsec/config.yaml
api:
server:
listen_uri: 0.0.0.0:8080
tls:
cert_file: /etc/crowdsec/ssl/cert.pem
key_file: /etc/crowdsec/ssl/key.pem
Registro de agentes adicionais
Em cada servidor adicional:
sudo apt install crowdsec -y
sudo cscli lapi register -u https://servidor-lapi:8080
# No servidor LAPI, validar:
sudo cscli machines validate <machine-id>
Bouncer conectado à LAPI remota
# /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
api_url: https://servidor-lapi:8080
api_key: <chave-bouncer-do-servidor-lapi>
Monitoramento: Prometheus e Grafana
O CrowdSec expõe métricas Prometheus em http://localhost:6060/metrics. Importe o dashboard oficial do Grafana (ID 14584) para uma visão visual de:
- Decisões emitidas por hora
- Serviços mais atacados
- Taxas de acerto de parsers
- Frequência de estouro de cenários
Verificação rápida via CLI:
sudo cscli metrics
CrowdSec vs Alternativas
| Ferramenta | Mecanismo | Linguagem | Multi-servidor | Inteligência Comunitária | Bouncers |
|---|---|---|---|---|---|
| CrowdSec | Cenários comportamentais | Go | LAPI nativo | Sim (API Central) | Firewall, Nginx, CF, personalizado |
| Fail2Ban | Regex de logs | Python | Sync manual | Não | iptables, nftables, firewalld |
| Suricata | IDS/IPS de rede | C | Modo cluster | Assinaturas de regras | NFQueue |
| OSSEC/Wazuh | HIDS + análise de logs | C | Manager-agente | Regras Wazuh cloud | Resposta ativa |
| ModSecurity | WAF (camada HTTP) | C | Proxy reverso | OWASP CRS | Módulo Nginx/Apache |
| Cloudflare WAF | Firewall de borda | N/A | CDN global | Intel de ameaças CF | Apenas borda CF |
Implantação em Produção: Nginx + SSH
Passo 1 — Instalar CrowdSec e coleções:
curl -s https://install.crowdsec.net | sudo bash
sudo apt install crowdsec -y
sudo cscli collections install crowdsecurity/linux \
crowdsecurity/sshd \
crowdsecurity/nginx
Passo 2 — Configurar aquisição de logs em /etc/crowdsec/acquis.yaml:
filenames:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
labels:
type: nginx
# --- (next source)
source: journalctl
journalctl_filter:
- "_SYSTEMD_UNIT=sshd.service"
labels:
type: syslog
Passo 3 — Instalar bouncer de firewall:
sudo apt install crowdsec-firewall-bouncer-nftables -y
sudo systemctl enable --now crowdsec-firewall-bouncer
Passo 4 — Lista branca de IPs confiáveis:
# /etc/crowdsec/parsers/s02-enrich/whitelist.yaml
name: meuserv/whitelist
description: "IPs confiáveis"
whitelist:
reason: "Escritório e VPN"
ip:
- "192.168.1.0/24"
Passo 5 — Registrar na API Central:
sudo cscli console enroll <token-de-app.crowdsec.net>
sudo systemctl restart crowdsec
Passo 6 — Verificar que a proteção está ativa:
sudo cscli decisions list
sudo cscli metrics
sudo cscli bouncers list
Casos Especiais e Advertências
- Falsos positivos de balanceadores de carga: Se todo o tráfego chega através de um proxy reverso, o CrowdSec vê apenas o IP do proxy. Configure o parsing de
X-Forwarded-Forou adicione o IP do proxy à lista branca. - Logs do Docker: Os logs do Docker requerem o tipo de aquisição
source: docker. Montar/var/lognão funciona para contêineres que escrevem em stdout/stderr. - Lacunas de cobertura de parsers: Verifique
sudo cscli metricspara valores altos deunparsed— indicam linhas de log sem parser instalado. - Chaves de API de bouncers: Se regenerar as chaves após reinstalar a LAPI, atualize o arquivo de configuração de cada bouncer e reinicie o serviço.
Resumo
O CrowdSec fornece um sistema de prevenção de intrusões em camadas e alimentado pela comunidade que escala de um único VPS a uma frota multi-datacenter:
- O agente analisa logs através de um pipeline de parsers em estágios e avalia eventos com cenários YAML de leaky-bucket, trigger e contador
- A API Local coordena decisões e conecta bouncers a agentes em implantações multi-servidor
- Os bouncers aplicam decisões no firewall (iptables/nftables), aplicação (Nginx) ou CDN (Cloudflare)
- O
cscligerencia coleções, decisões, alertas, máquinas, bouncers e métricas pela linha de comando - As listas de bloqueio comunitárias via API Central adicionam inteligência de ameaças global sem configuração adicional
- Cenários e listas brancas personalizados permitem ajustar a proteção com precisão