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 1800

Subcomandos

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:

  1. executa o comando de suspensão da feature;
  2. agenda, com systemd-run --on-active=<TTL>s, um timer transitório (implant-restore-emergency-<feature>) que reaplica a feature no fim do TTL;
  3. 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-restore

Os comandos de configuração base (sysctl, limits, logrotate, docker-limits) não têm subcomandos emergency-*.

Como reverter

sudo implant emergency-mode disable

Reaplica 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 disable

Saí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