Solução de Problemas
As quatro perguntas que cobrem a maioria dos casos de suporte. Comece toda sessão do mesmo jeito:
sudo ezyshield doctorO doctor é somente leitura e cada check imprime uma dica com o fix exato. As seções abaixo mapeiam os sintomas comuns aos checks que os diagnosticam.
"O daemon roda mas nada é detectado"
Detecção precisa de uma fonte de log, um parser compatível e eventos de fato fluindo.
collectors: configured(doctor) — zero collectors significa que nada é lido, nunca. Adicione uma seçãocollectors:(ou re-rodeezyshield init).journald: readable(doctor) — o collector journald roda como o usuárioezyshield, que precisa do gruposystemd-journal. A dica traz ousermoddo fix.- Unit ou path errado. Debian chama a unit de SSH de
ssh, RHEL desshd; um collectorfileprecisa do log de access para as regras HTTP. Compare sua config com o que realmente loga:sudo ezyshield scanlista serviços escutando e suas fontes de log. - Ainda em silêncio?
ezyshield statusmostraCollectorsState: DEGRADEDcom o collector falhando nomeado quando uma fonte erra repetidamente;ezyshield watchconfirma eventos no momento em que o parsing funciona.
"Um collector está configurado mas não consegue ler sua fonte"
Um collector pode estar configurado, iniciado e mesmo assim não ler nada. A causa usual é permissão na própria fonte: um collector kind: docker num host onde o usuário de serviço ezyshield não alcança o socket do Docker Engine, ou um collector journald sem o grupo systemd-journal. A detecção naquela fonte está morta enquanto o enforcement parece perfeitamente saudável.
Dois checks respondem isso juntos:
[FAIL] docker: socket access
hint: service user ezyshield (uid 999) cannot read+write /var/run/docker.sock
(owner 0:994, mode 0660) -- the configured docker collectors observe NOTHING.
Access paths, cheapest privilege first: (1) collect a host-mounted log file
instead of the container's stream (no docker privilege at all); (2) expose a
read-only, filtered Docker socket proxy to ezyshield; (3) add ezyshield to the
'docker' group -- that group is root-equivalent on this host ...
[FAIL] collectors: observation state
hint: DEGRADED — a configured collector is NOT reading its source
(docker:proxy-web is not reading (5 consecutive failures: docker: permission
denied on /var/run/docker.sock)); nothing from that source is detected,
however healthy enforcement looks ...docker: socket accessavalia o usuário de serviço, não a conta que rodou o doctor. Um operador que está no grupodockerveria, de outro modo, um check verde para um acesso que o daemon não tem.collectors: observation statepergunta ao daemon em execução o que ele está de fato lendo. Oezyshield statusmostra o mesmo veredito como bannerCollectorsState: DEGRADEDnomeando o collector e seu último erro, e o daemon grava uma linha de auditoriacollector_degradedmais uma notificação crítica quando uma fonte deixa de ser lida.- Escolha o caminho de acesso pelo custo: um arquivo de log montado do host não precisa de privilégio nenhum de Docker; um proxy de socket somente-leitura e filtrante expõe apenas o que for configurado; o grupo
dockeré equivalente a root no host (um membro pode subir um container privilegiado), então conceda deliberadamente e só enquanto houver collectors docker configurados.
O service user: docker group reporta a associação quando ela existe; quando não existe, o veredito é do docker: socket access, porque outro caminho pode já conceder o acesso.
"Um ban foi registrado mas o IP não está bloqueado"
O pior modo de falha — e o mais instrumentado.
ezyshield statusprimeiro:EnforcementStateé a resposta honesta.DRY-RUNsignificaarmed: false— bans registrados são simulados por design.DEGRADEDnomeia o backend falhando.enforcer: socket connectivity(doctor) — o helper está fora ou o socket inacessível:systemctl status ezyshield-enforcer.enforcer: netlink probe(doctor) — o helper roda mas o sandbox perdeu acesso a netlink (unit modificada): a dica nomeia o fix deRestrictAddressFamilies.firewall: ezyshield nftables table(doctor) — a tabela SUMIU com bans ativos: algo fez flush do ruleset (veja o guia de coexistência de firewalls);systemctl restart ezyshield-enforcer ezyshieldrecria e re-sincroniza.bans: ban_ineffective diagnostics(doctor) — o próprio daemon marca bans que continuaram gerando eventos após o período de graça.
"Erros de permissão no socket"
dial unix /run/ezyshield/ezyshield.sock: connect: permission deniedO socket de controle é root:ezyshield, modo 0660 — pertencer ao grupo ezyshield é o controle de acesso.
id— você está no grupoezyshield? Oezyshield initadiciona o admin que instalou; para os demais:sudo usermod -aG ezyshield <user>e re-login.- Socket ausente → o daemon não está rodando (
systemctl status ezyshield);exit code 3em qualquer comando da CLI significa exatamente "daemon inacessível". ezyshield-enforcer.service: runtime directory/ezyshield.service: runtime directory(doctor) — uma unit despida nunca cria/run/ezyshield*; a dica traz o drop-in do fix.
"A fonte journald não é capturada"
Eventos existem no journalctl -u ssh mas o EzyShield não vê nada.
- O
unit:do collector precisa bater com o nome exato da unit —sshvssshdde novo.systemctl list-units 'ssh*'resolve. journald: readable(doctor) — lê o journal com a identidade do daemon; um PASS aqui com silêncio geralmente é o nome da unit.- Setups com container: o journald dentro do container não é o journal do host — rode o collector onde os logs estão, ou use um collector
filenum log montado.
Caminhos de escalação
- Falso positivo banindo usuários reais →
sudo ezyshield allow <ip>(allowlist sempre vence), depois ajuste viarules.d. - Tudo pegando fogo →
sudo ezyshield disable --all(remove todo bloqueio, desarma, mantém histórico — veja a referência de CLI). - Bug reports: anexe a saída de
ezyshield doctor --jsoneezyshield status --json— ambas seguras de compartilhar (sem segredos).