Um servidor configura-se uma vez e depois vive por si. Um mês mais tarde há pacotes à espera de atualização, o certificado chegou a três semanas do fim, depois de se instalar algo alheio surgiu uma linha a mais na configuração do SSH, e a jail que devia vigiar os acessos parou sem que ninguém desse por isso. Nada disto grita. Tudo apenas deixa de ser verdade, em silêncio.
Seguem-se doze coisas que vale a pena verificar com regularidade, com os comandos. A ronda leva uns quinze minutos. A ordem vai daquilo por onde se entra até àquilo que se avaria sozinho.
SSH: cinco linhas
O que há para ver não é o ficheiro, mas a configuração efetiva: forma-se a partir de /etc/ssh/sshd_config, de todo o diretório sshd_config.d e dos valores por omissão da compilação.
sudo sshd -T | grep -iE 'permitrootlogin|passwordauthentication|permitemptypasswords|maxauthtries|x11forwarding'
O que queremos ver: permitrootlogin no, passwordauthentication no, permitemptypasswords no, maxauthtries em 3–4 e x11forwarding no. As três primeiras são a porta; as duas últimas são as dobradiças — um limite de tentativas por ligação e um reencaminhamento gráfico que não serve de nada a um servidor.
Duas ressalvas, duas maneiras fáceis de ficar de fora. Primeira: não desligue o acesso por palavra-passe nem o acesso de root antes de confirmar que a sua chave funciona, numa sessão à parte e sem fechar a atual. Se está a ler isto ligado como root com palavra-passe, são essas duas linhas que o deixam de fora, precisamente a si.
Segunda: a ordem dos ficheiros. O OpenSSH fica com o primeiro valor que encontra para um parâmetro, e os ficheiros de sshd_config.d são lidos por ordem alfabética. As imagens de nuvem costumam deixar lá um 50-cloud-init.conf, que se impõe ao seu próprio ficheiro se lhe chamou algo como 90-hardening.conf. As definições próprias vão com um número menor — 00- ou 10-. E o resultado verifica-se com sshd -T, não relendo o ficheiro.
Firewall: uma verificação
sudo ufw status verbose
Convém lembrar que esta saída mostra intenções, não resultados. Uma regra pode constar da lista e não fechar nada: o próprio UFW está desativado, a porta é servida por algo publicado pelo Docker (que escreve as suas regras no iptables abaixo do UFW), ou o tráfego chega ao servidor por outro caminho. Por isso compensa confrontar a lista de regras com o que de facto está à escuta para fora:
sudo ss -tulpn | grep -v '127.0.0.1\|::1'
fail2ban: duas verificações
Não basta que o serviço esteja a correr — é preciso também uma jail a funcionar para o SSH.
sudo fail2ban-client status
sudo fail2ban-client status sshd
O contratempo mais frequente aqui é uma jail muda. No Debian 12 e nos Ubuntu recentes pode não existir sequer o /var/log/auth.log: o rsyslog não está instalado e os registos vivem apenas no journald. Uma jail com o logpath de origem arranca então, declara-se ativa e nunca bloqueia ninguém. Cura-se apontando-a ao journal do systemd:
printf '[sshd]\nenabled = true\nbackend = systemd\n' | sudo tee /etc/fail2ban/jail.d/sshd-systemd.local
sudo systemctl restart fail2ban
O sinal que permite apanhar isto sem remexer em configurações: em fail2ban-client status sshd as linhas «Currently failed» e «Total failed» ficam a zero enquanto o journal tem claramente acessos falhados.
Atualizações: três verificações
Em separado: quantos pacotes esperam no total, quantos desses são de segurança e se o sistema pede reinício depois de uma atualização do núcleo.
sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'é preciso reiniciar'
A terceira verificação é se as atualizações de segurança automáticas estão ligadas, para que as duas primeiras não se tornem um ritual mensal:
systemctl status unattended-upgrades --no-pager
cat /etc/apt/apt.conf.d/20auto-upgrades
Esse ficheiro deve ter um 1 nas duas linhas. Se o pacote faltar: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.
Certificados: uma verificação
Um certificado Let's Encrypt vive noventa dias, e a renovação costuma funcionar sozinha até ao dia exato em que deixa de funcionar. O que há para ver não é o painel do registrador, mas o que o servidor serve de facto:
echo | openssl s_client -connect localhost:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
sudo certbot renew --dry-run
O primeiro comando dá a data de fim do certificado servido para aquele nome; o segundo confirma que a renovação passa, sem esperar pelo prazo real. Compensa percorrer todos os nomes que o servidor serve, não apenas o domínio principal: o que se esquece é, por regra, o subdomínio acrescentado mais tarde.
Disco: uma verificação
df -h
df -i
Dois comandos, porque o espaço e os registos de ficheiros esgotam-se de forma independente. Na maioria dos servidores o segundo bate no teto primeiro: milhões de ficheiros pequenos nas sessões do PHP ou na cache da aplicação dão um IUse% de 100 com gigabytes ainda livres. Sobre os dois casos temos um artigo à parte.
O que está errado nesta lista
A lista está certa, mas tem uma propriedade: exige que alguém se lembre dela. Quinze minutos por semana é pouco, enquanto houver um só servidor e enquanto houver um motivo. Ao fim de dois meses calmos a ronda salta-se, e que a jail parou fica-se a saber pelos registos de outra pessoa.
Por isso reunimos exatamente estas doze verificações num painel gratuito à parte — Arcivéo FREE. Instala-se com um comando, corre no seu próprio servidor, não nos envia nada e não exige registo. Um recolector corre por cron de cinco em cinco minutos e escreve o mesmo numa base de dados local: acessos SSH e ligações recusadas, estado do UFW e do fail2ban, atualizações de segurança pendentes, prazos dos certificados, espaço em disco. O histórico é de sete dias e a interface existe em 34 línguas. O preço é zero, inclusive num servidor de trabalho: a licença permite instalar o painel em máquinas próprias, incluindo as da empresa, e não permite revendê-lo nem explorá-lo como serviço para servidores alheios.
A pilha da edição gratuita é modesta: instala e ativa o UFW e o fail2ban e, a partir daí, mostra o estado. O ModSecurity, o Suricata, o AIDE e os restantes módulos não estão lá, esses pertencem à versão paga. Mas para deixar de trazer a ronda semanal na cabeça, chega. O aspeto dos mesmos dados no painel completo está nas páginas de demonstração abaixo.