implant auto-ban
Daemon + CLI que lê 4 sinais de tráfego ofensivo e banha IPs via blocklist ipset com TTL progressivo por reincidência.
Setup
sudo implant auto-ban service install # cria unit + config + ipsets, start
sudo implant auto-ban service status # verificaSinais detectados
| Sinal | Source | TTL base | Threshold |
|---|---|---|---|
fail2ban |
fail2ban-client status por jail |
24h | qualquer ban |
log_auth |
/var/log/auth.log |
6h | ≥10 falhas SSH em 5min |
iptables_drops |
/var/log/kern.log (sem ele, journalctl -k) |
12h | ≥30 drops em 10min |
traefik_http |
/var/log/traefik/access.log |
1h | pontuação ≥40 em 5min |
O log_auth e o iptables_drops entendem tanto o formato clássico do
syslog (Mmm dd HH:MM:SS, hora local) quanto RFC3339 com fuso e o
short-iso do journalctl.
Pré-requisito para `iptables_drops`
O sinal lê as linhas com prefixo iptables-drop:rl geradas pelo LOG
limitado do rate-limit, que é opt-in:
sudo implant rate-limit drop-log enableauto-ban config show avisa (warnings no JSON) quando o drop-log está
desligado com o sinal ligado, ou quando o min_drops não cabe no teto do
LOG.
`traefik_http` — pontuação
Cada resposta no access log do Traefik soma pontos para o IP de origem:
| Evento | Peso (default) |
|---|---|
Status em statuses (default 400, 401, 403, 404, 405, 444) em path comum |
2 |
5xx (só se "5xx" estiver em ranges ou o status em statuses) |
1 |
Status em scanner_statuses em path típico de scanner (/.env, /.git, /wp-login.php, /phpmyadmin, …) |
10 |
Sucesso (2xx/3xx) em path de scanner nunca conta. Pesos, listas, limiar
(min_score) e janela são configuráveis.
Configs antigas com o bloco traefik_404: são convertidas na leitura:
só 404 em path comum (mesmo limiar de antes) e 403/404 em path de
scanner — o 403 é o que a guarda de arquivos sensíveis do
traefik-edge devolve.
Pré-requisitos para `traefik_http`
- Access log do Traefik ligado (
implant traefik-accesslog --enable; no Traefik 3 isso incluiaddInternals: true, necessário para logar o 403 da guarda dotraefik-edge) - Traefik configurado com
forwardedHeaders.trustedIPsparaClientHostser o IP real do atacante (não do proxy upstream)
TTL progressive backoff
| Ofensa | TTL (base 6h) |
|---|---|
| 1ª | 6h |
| 2ª | 12h |
| 3ª | 24h |
| 4ª | 48h |
| 5ª+ | permanente |
O TTL dobra a cada reincidência (teto de 16× a base, max_multiplier) e
vira permanente a partir de permanent_after (default 5). Ofensas contam
dentro de offense_window_days (default 30).
IP detectado por múltiplos sinais simultaneamente: TTL = max(ttl por sinal).
Offense count incrementa uma vez (não multiplica por sinal).
Never-ban (3 camadas em ordem)
- Privados: RFC1918 + loopback + link-local
- IMPLANT_RL_WHITELIST: whitelist do rate-limit
- IMPLANT_AB_ALLOW: allowlist auto-ban-only (
implant auto-ban allow)
Cada skip gera evento skip_* no audit JSONL.
Comandos
| Comando | Descrição |
|---|---|
service install |
Cria unit + config + ipsets, enable + start |
service uninstall |
Stop + disable + remove unit (config preservado) |
service start/stop/restart/status |
Ciclo de vida systemd |
service logs --lines N |
journalctl wrapper |
scan [--dry-run] |
One-shot scan + report (--dry-run não aplica os bans) |
list |
IPs banidos (delegado para blocklist) |
events [--last N] [--ip X] [--signal Y] |
Tail do JSONL bounded (default 20; sinais: fail2ban, log_auth, iptables_drops, traefik_http) |
offenses |
Dump do offense counter |
offenses-clear [--ip X] |
Limpa contador (todos ou 1) |
allow --ip X [--note "razão"] |
Adiciona ao IMPLANT_AB_ALLOW |
unallow --ip X |
Remove |
allow-list |
Lista IMPLANT_AB_ALLOW + v6 |
config show/path |
Imprime config / caminho |
Todos com --output json para integração com automação ou console de gerenciamento remoto.
Config
/etc/protocolo-implant/auto-ban.yml — todos os campos têm default
(operador pode sobrescrever só o que quiser). implant auto-ban config show imprime a config efetiva; config path, o caminho.
Emergency-mode
auto-ban é uma feature opt-in. emergency-mode enable para o
service junto com as demais features opt-in. ipsets e offense counter
preservados — deadman restaura.
Upgrade do binário
O daemon detecta a troca do binário do implant (self-update) a cada
ciclo, registra daemon_restart na auditoria e sai com código 75; o
Restart=on-failure da unit sobe a versão nova em até ~1 min.
Ban manual
implant ban / implant unban operam no mesmo ipset central. O unban
encerra o cooldown do auto-ban para o IP (mantendo o histórico de
ofensas); o cooldown só vale enquanto o ban continua no set.
Audit
/var/lib/implant/auto-ban-events.jsonl (bounded ~1.2MB). Tipos:
ban, ban_permanent, skip_private, skip_whitelisted, skip_allowlisted,
gc, error, scan_end, daemon_restart, e os do ban
manual: manual_ban, manual_ban_permanent, manual_unban.