implant emergency-mode
Suspende de uma vez todas as proteções opt-in que estão aplicadas no servidor, por um tempo limitado (TTL). Quando o TTL expira, cada proteção é reaplicada automaticamente por um timer do systemd — mesmo que ninguém volte para desfazer.
Use quando uma proteção de rede está atrapalhando o diagnóstico ou bloqueando tráfego legítimo e você precisa descartar essa hipótese rápido, sem correr o risco de esquecer o servidor desprotegido.
emergency-mode × emergency-reset
São ferramentas para problemas diferentes:
emergency-mode |
emergency-reset | |
|---|---|---|
| Objetivo | Tirar as proteções opt-in do caminho por um tempo | Recuperar acesso SSH após um lockout |
| O que mexe | harden-network, fail2ban-ipset, rate-limit, auto-ban, geo-block, feed-block, capture, audit, traefik-ratelimit |
Porta SSH, hardening do SSH, fail2ban, firewall (porta 22), hardening de kernel, watchdog |
| Duração | Temporária: TTL padrão 1 h, máximo 6 h | Permanente: nada volta sozinho |
| Retorno | Automático no fim do TTL, ou emergency-mode disable |
Manual: reaplicar cada configuração |
| Estado anterior | Preservado; cada feature volta como estava | Substituído por defaults (porta 22, sem hardening, sem fail2ban) |
| Confirmação | Não pede | Pede, salvo --force |
Regra prática: se você ainda tem acesso e quer descartar uma proteção
como causa, use emergency-mode. Se você está trancado do lado de fora e
entrou pelo console do provedor, use emergency-reset.
Uso
implant emergency-mode [OPTIONS] <SUBCOMANDO>Requer root. --dry-run vem antes do subcomando; --duration e
--source vêm depois:
sudo implant emergency-mode --dry-run enable --duration 1800Subcomandos
| Subcomando | Descrição |
|---|---|
enable |
Suspende todas as features opt-in aplicadas e agenda a reaplicação |
disable |
Reaplica agora todas as features suspensas e cancela os timers |
status |
Lista as suspensões ativas e quando expiram |
heartbeat |
Renova o TTL de todas as suspensões ativas |
Flags
| Flag | Subcomando | Descrição |
|---|---|---|
--duration <SEGUNDOS> |
enable, heartbeat |
TTL em segundos. Padrão 3600 (1 h); máximo 21600 (6 h); precisa ser maior que zero |
--source <ID> |
enable, heartbeat |
Identificador de quem disparou (operador, chamado, console de gerenciamento remoto), devolvido no relatório |
--dry-run |
todos | Simula sem aplicar mudanças |
-o, --output <FORMATO> |
todos | human (padrão), json ou yaml |
-v, --verbose |
todos | Mostra os comandos executados |
-c, --config <ARQUIVO> |
todos | Arquivo de configuração (padrão /etc/protocolo-implant/config.toml) |
-t, --token <TOKEN> |
todos | Token de identificação do servidor (ou PROTOCOLO_TOKEN) |
O que é aplicado
`enable`
Percorre as features opt-in. As que não estão aplicadas são puladas e
aparecem em skipped_features. Para cada feature aplicada:
- executa o comando de suspensão da feature;
- agenda, com
systemd-run --on-active=<TTL>s, um timer transitório (implant-restore-emergency-<feature>) que reaplica a feature no fim do TTL; - grava o estado em
/var/lib/implant/lockdowns/emergency-<feature>.json.
Se a feature já está suspensa, o enable apenas estende o TTL (ação
extended em vez de created). Uma falha em uma feature não interrompe as
demais: ela vai para skipped_features com o motivo.
| Feature | Ao suspender | Ao reaplicar |
|---|---|---|
| harden-network | harden-network revert (remove o pack de sysctl) |
harden-network apply |
| fail2ban-ipset | fail2ban use-ipset-action --disable (o fail2ban volta à action própria, chains f2b-*) |
fail2ban use-ipset-action --enable --force |
| rate-limit | rate-limit revert --keep-state (tira as regras, guarda a configuração) |
rate-limit reconcile (refaz a partir da configuração guardada, incluindo regras adicionadas e whitelist) |
| auto-ban | Para o serviço do auto-ban | Inicia o serviço |
| geo-block | geo-block revert |
geo-block apply |
| feed-block | feed-block revert (remove as chains IMPLANT_FEED_* e esvazia os sets) |
feed-block apply (reusa o cache do último download bom se o download falhar) |
| capture | Para o daemon de captura (pcaps já gravados são preservados) | Inicia o daemon |
| audit | audit revert (remove só as regras do implant) |
audit apply |
| traefik-ratelimit | traefik-ratelimit revert --neutral (o middleware continua definido, sem limite) |
traefik-ratelimit apply sem flags (parâmetros guardados no state) |
A ordem importa: fail2ban-ipset (v2.59.0+) sai antes do rate-limit.
O rate-limit revert --keep-state tira os ganchos da blocklist; se o fail2ban
continuasse gravando só nela, o SSH ficaria sem proteção contra brute-force
durante a emergência. Com a action própria de volta, o fail2ban segue
protegendo o SSH. Na volta, o --force permite religar a action mesmo que o
timer do rate-limit (que repõe o gancho da blocklist) ainda não tenha rodado.
O traefik-ratelimit (v2.60.0+) nunca é removido pelo emergency-mode: um
router que cita um middleware inexistente cai. Por isso ele sai neutro
(average: 0, sem limite) e os routers que o usam continuam no ar.
O feed-block (v2.60.0+) sai junto com o geo-block: durante a emergência, o
tráfego das redes do feed não é barrado. Na volta, o apply repõe as chains
na posição da precedência (whitelist > blocklist > feed > geo > rate-limit),
qualquer que seja a ordem em que os timers rodarem.
O que não é afetado: SSH, o serviço do fail2ban, firewall base, hardening base do kernel (sysctl), limits, logrotate, docker-limits e lockdowns de serviço (ssh-service, lockdown).
Retorno automático
A reaplicação pertence ao systemd, não a um processo do implant: o timer
dispara mesmo que a sessão do operador caia ou que o console de gerenciamento
remoto perca contato com o servidor. Ao reaplicar, o timer também apaga o
arquivo de estado, então a feature some do status.
O teto de 6 h limita o impacto de um enable disparado por engano ou por
alguém mal-intencionado: no pior caso, as proteções voltam sozinhas.
`heartbeat`
Renova o TTL de todas as suspensões ativas: cancela o timer atual e agenda outro com a nova duração, contada a partir de agora. Serve para quem precisa de mais tempo — um operador no meio de um diagnóstico ou um console remoto que renova periodicamente enquanto a sessão está aberta. Sem heartbeat, as proteções voltam quando o TTL atual acaba.
`disable`
Para cada suspensão ativa: cancela o timer, reaplica a feature e apaga o arquivo de estado. Não exige terminal interativo — reaplicar proteção não tira acesso de ninguém.
`status`
Lê /var/lib/implant/lockdowns/emergency-*.json e lista cada feature
suspensa com o horário de expiração (UTC).
Por feature
harden-network e rate-limit também aceitam suspensão individual, com a
mesma mecânica:
sudo implant harden-network emergency-disable --duration 1800
sudo implant rate-limit emergency-status
sudo implant rate-limit emergency-restoreOs comandos de configuração base (sysctl, limits, logrotate,
docker-limits) não têm subcomandos emergency-*.
Como reverter
sudo implant emergency-mode disableReaplica tudo imediatamente. Sem isso, a reversão acontece sozinha no fim do TTL.
Exemplos
# Suspender por 1 hora (padrão)
sudo implant emergency-mode enable --source operador-joao
# Suspender por 30 minutos, simulando antes
sudo implant emergency-mode --dry-run enable --duration 1800
sudo implant emergency-mode enable --duration 1800
# Ver o que está suspenso e até quando
sudo implant emergency-mode status
# Precisa de mais tempo: renovar por mais 2 horas a partir de agora
sudo implant emergency-mode heartbeat --duration 7200 --source operador-joao
# Terminou: reaplicar tudo agora
sudo implant emergency-mode disableSaída human do enable:
▶ Emergency-mode ENABLE — desabilitando features opt-in
⚠ harden-network: created (expira 2026-10-16 15:30:00 UTC)
⊘ fail2ban-ipset: pulado (feature não está aplicada)
⚠ rate-limit: created (expira 2026-10-16 15:30:00 UTC)
⊘ auto-ban: pulado (feature não está aplicada)
⊘ geo-block: pulado (feature não está aplicada)
⊘ feed-block: pulado (feature não está aplicada)
⊘ capture: pulado (feature não está aplicada)
⊘ audit: pulado (feature não está aplicada)
⊘ traefik-ratelimit: pulado (feature não está aplicada)Saída JSON do enable (resumida):
{
"success": true,
"command": "emergency-mode.enable",
"data": {
"duration_seconds": 3600,
"source": "operador-joao",
"entries": [
{
"feature": "harden-network",
"action": "created",
"lockdown": {
"service": "emergency-harden-network",
"disabled_at": "2026-10-16T14:30:00Z",
"expires_at": "2026-10-16T15:30:00Z",
"ttl_seconds": 3600
}
}
],
"skipped_features": [
{ "feature": "auto-ban", "reason": "feature não está aplicada" }
]
}
}Veja também
- emergency-reset — recuperação de acesso após lockout
- lockdown — primitiva de TTL com retorno via systemd usada aqui
- harden-network, fail2ban, rate-limit, auto-ban, geo-block, feed-block, capture, audit, traefik-ratelimit — as features opt-in