InfraFenceInfraFence

Live Security Operations

Começar

Proteger uma VPS nova: o checklist

Última atualização:

Uma VPS nova está na internet desde o momento em que liga, e os scanners chegam a ela em poucos minutos. Estes dez passos são a primeira hora de trabalho em um servidor Debian, Ubuntu ou da família RHEL recém-criado (RHEL, Rocky Linux, AlmaLinux, Oracle Linux, CentOS Stream, Fedora), na ordem que evita que você fique trancado do lado de fora.

Rode tudo como um usuário com sudo, mantenha uma sessão SSH aberta enquanto mexe no SSH ou no firewall, e saiba onde fica o console web do seu provedor: ele funciona quando o SSH não funciona.

1. Instalar todas as atualizações

As imagens de nuvem muitas vezes têm semanas. Atualize tudo antes de instalar qualquer outra coisa, e reinicie se o kernel ou as bibliotecas básicas mudaram.

Debian / Ubuntu
sudo apt update && sudo apt full-upgrade -y
[ -f /var/run/reboot-required ] && echo "reboot needed"
RHEL, Rocky Linux, AlmaLinux, Oracle Linux, Fedora
sudo dnf upgrade --refresh -y
sudo dnf needs-restarting -r

Na família RHEL, needs-restarting -r diz se é preciso reiniciar. Reinicie com sudo reboot e entre de novo.

2. Criar seu próprio usuário com sudo

Trabalhe com um usuário nominal com sudo, não como root: as ações ficam registradas em nome de alguém, e o login do root pode ser desligado no próximo passo.

Debian / Ubuntu
sudo adduser deploy
sudo usermod -aG sudo deploy
RHEL, Rocky Linux, AlmaLinux, Oracle Linux, Fedora
sudo useradd -m deploy
sudo passwd deploy
sudo usermod -aG wheel deploy

Copie sua chave SSH para o usuário (ssh-copy-id deploy@SERVER_IP a partir do seu computador), entre com esse usuário em um segundo terminal e teste sudo -v. Depois confirme que só o root tem user ID 0 e que nenhuma conta tem senha vazia: o primeiro comando deve mostrar só root, e o segundo, nada.

Qualquer distribuição
awk -F: '$3 == 0 {print $1}' /etc/passwd
sudo awk -F: '$2 == "" {print $1}' /etc/shadow

3. Fechar o SSH

Só chaves, sem login do root, poucas tentativas por conexão. O passo a passo completo, com as verificações e a troca de porta, está em Como parar ataques de força bruta no SSH. A versão curta, depois que o login por chave estiver funcionando:

Distribuições com sshd_config.d
sudo tee /etc/ssh/sshd_config.d/00-hardening.conf > /dev/null <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
MaxAuthTries 4
EOF
sudo sshd -t && echo "config OK"
Debian / Ubuntu
sudo systemctl reload ssh
RHEL, Rocky Linux, AlmaLinux, Oracle Linux, Fedora
sudo systemctl reload sshd

Atenção: Teste um novo login por chave em um segundo terminal antes de fechar a sessão atual. Se grep -i '^Include' /etc/ssh/sshd_config não mostrar nada (RHEL 8 e derivados), coloque essas linhas direto no /etc/ssh/sshd_config.

4. Ativar o firewall

Bloqueie toda a entrada e depois libere só o que o servidor oferece. Aqui, SSH na 22 e um servidor web na 80 e na 443; tire o que você não usa.

Debian / Ubuntu (ufw)
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enable
sudo ufw status verbose
Família RHEL (firewalld)
sudo dnf install -y firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Atenção: Libere a sua porta SSH antes do ufw enable ou do reload, senão as novas conexões SSH são recusadas. Se você mudou o SSH para outra porta, libere essa.

  • No RHEL 9 e derivados, a zona padrão também permite o cockpit: remova com sudo firewall-cmd --permanent --remove-service=cockpit se você não usa, e depois recarregue.
  • O Docker publica as portas dos containers com regras iptables próprias, que o ufw não enxerga: uma porta publicada com -p 8080:80 fica aberta mesmo que o ufw diga o contrário. Publique em 127.0.0.1:8080:80 quando só o proxy local precisa dela.
  • A maioria dos provedores também tem um firewall de nuvem ou security group. Use-o como uma segunda camada, com as mesmas regras.

5. Ativar as atualizações de segurança automáticas

A maioria dos servidores comprometidos roda software para o qual já existia correção havia semanas. Deixe o servidor instalar sozinho as atualizações de segurança.

Debian / Ubuntu
sudo apt install -y unattended-upgrades
sudo tee /etc/apt/apt.conf.d/20auto-upgrades > /dev/null <<'EOF'
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
EOF
sudo unattended-upgrade --dry-run --debug 2>&1 | tail -n 20

Quais atualizações são instaladas é definido em /etc/apt/apt.conf.d/50unattended-upgrades (as de segurança no Ubuntu; as de segurança e as das point releases no Debian). As reinicializações automáticas ficam desligadas, a menos que você defina ali Unattended-Upgrade::Automatic-Reboot "true";.

RHEL, Rocky Linux, AlmaLinux, Oracle Linux
sudo dnf install -y dnf-automatic
sudo sed -i -e 's/^upgrade_type.*/upgrade_type = security/' \
  -e 's/^apply_updates.*/apply_updates = yes/' /etc/dnf/automatic.conf
sudo systemctl enable --now dnf-automatic.timer
systemctl list-timers dnf-automatic.timer
  • O CentOS Stream não publica avisos de segurança, então lá upgrade_type = security não instala nada: use upgrade_type = default.
  • O Fedora 41 e posteriores usam o dnf5: instale o dnf5-plugin-automatic e defina as mesmas opções em /etc/dnf/automatic.conf (veja man dnf5-automatic).
  • Nenhuma das duas ferramentas reinicia por padrão. Programe uma reinicialização quando o kernel for atualizado.

6. Configurar backups que saiam do servidor

Um backup no mesmo servidor, ou só na mesma conta do provedor, vai embora junto com o servidor ou com a conta. Mantenha pelo menos uma cópia em outro lugar, criptografada, e teste uma restauração. Os snapshots do provedor são úteis como complemento, não como substituto.

O restic é uma opção simples: criptografado, com deduplicação, para SFTP, S3 e outros. Tem pacote no Debian e no Ubuntu, e no EPEL para a família RHEL. Troque BACKUP_HOST pelo seu servidor de backup; o restic pede uma senha do repositório, que você precisa guardar fora deste servidor.

Debian / Ubuntu
sudo apt install -y restic
Rocky Linux, AlmaLinux (EPEL)
sudo dnf install -y epel-release
sudo dnf install -y restic
Qualquer distribuição
sudo restic -r sftp:backup@BACKUP_HOST:/srv/restic/$(hostname) init
sudo restic -r sftp:backup@BACKUP_HOST:/srv/restic/$(hostname) backup /etc /home /root /var/www
sudo restic -r sftp:backup@BACKUP_HOST:/srv/restic/$(hostname) snapshots

Exporte os bancos de dados para um arquivo antes de o backup rodar (mysqldump --single-transaction, pg_dump) em vez de copiar os diretórios de dados com eles em execução. Depois prove que a restauração funciona:

Qualquer distribuição
sudo restic -r sftp:backup@BACKUP_HOST:/srv/restic/$(hostname) restore latest --target /tmp/restore-test --include /etc/hostname
cat /tmp/restore-test/etc/hostname

Nota: Agende o backup com um timer do systemd ou com o cron, e confira o resultado: uma rotina de backup falhando em silêncio há meses é o caso mais comum.

7. Configurar monitoramento e alertas

Você precisa saber, sem entrar no servidor, quando ele cai, quando o disco enche e quando alguém faz login ou o ataca. No mínimo:

  • Uma verificação externa de disponibilidade do site ou serviço, feita de fora do seu provedor.
  • Um alerta de espaço em disco e de serviços com falha.
  • Um registro de quem fez login, e um alerta para ataques e para alterações em arquivos do sistema.

Até ter algo que faça isso por você, estes comandos mostram os logins recentes, os erros desde a inicialização e o espaço livre em disco:

Qualquer distribuição
last -n 20
sudo journalctl -p err -b --no-pager | tail -n 30
df -h /

8. Fechar as portas de que você não precisa

Liste o que está escutando. Um endereço 0.0.0.0 ou [::] significa todas as interfaces, ou seja, a internet, a não ser que o firewall barre.

Qualquer distribuição
sudo ss -tulpn
  • Pare e desative os serviços que você não usa.
  • Bancos de dados e caches usados só pelo próprio servidor escutam em localhost: bind-address = 127.0.0.1 para MySQL e MariaDB, listen_addresses = 'localhost' para PostgreSQL, bind 127.0.0.1 -::1 para Redis.
  • Nunca exponha à internet a API do Docker (2375, 2376) nem um Redis sem senha: as duas são portas de entrada comuns para crypto miners.
Parar um serviço de que você não precisa
sudo systemctl disable --now SERVICE_NAME

Depois verifique de fora, a partir de outra máquina com nmap instalado. Só as portas que você liberou no passo 4 devem responder.

De outra máquina
nmap -Pn SERVER_IP

9. Manter o relógio sincronizado

Os logs de servidores diferentes só batem quando os relógios concordam, e TLS, códigos de dois fatores e a linha do tempo de um incidente dependem todos da hora certa. Verifique:

Qualquer distribuição
timedatectl

O que você quer ver é System clock synchronized: yes. Se disser que não:

Debian / Ubuntu
sudo apt install -y systemd-timesyncd
sudo timedatectl set-ntp true
RHEL, Rocky Linux, AlmaLinux, Oracle Linux, Fedora
sudo dnf install -y chrony
sudo systemctl enable --now chronyd
chronyc tracking

Nota: Algumas imagens vêm com o chrony em vez do systemd-timesyncd. Use o que já estiver lá: instalar um remove ou substitui o outro.

10. Guardar os logs por tempo suficiente

Quando algo acontece, a primeira pergunta é o que aconteceu antes. Torne o journal do sistema persistente, com um limite de tamanho e um tempo de retenção escolhidos por você:

Qualquer distribuição
sudo mkdir -p /etc/systemd/journald.conf.d
sudo tee /etc/systemd/journald.conf.d/retention.conf > /dev/null <<'EOF'
[Journal]
Storage=persistent
SystemMaxUse=1G
MaxRetentionSec=1year
EOF
sudo systemctl restart systemd-journald
journalctl --disk-usage
  • Dimensione o limite de acordo com o disco: 1 GB é mais do que suficiente para um servidor pequeno.
  • Por quanto tempo você precisa guardar os logs depende dos seus contratos e obrigações (por exemplo, a notificação de incidentes da NIS2). Decida, registre por escrito e configure aqui.
  • Logs guardados só no servidor podem ser apagados por quem invadir. Mande uma cópia também para outra máquina ou para um serviço de logs.
  • Os arquivos em /var/log (servidor web, auth.log no Debian e no Ubuntu) são rotacionados pelo logrotate: o valor de rotate em /etc/logrotate.d/ define quantos arquivos antigos são mantidos.

O que o InfraFence verifica e monitora em um servidor novo

Depois da instalação, o InfraFence verifica o servidor todos os dias, ou quando você pedir, e continua monitorando em tempo real. Ele cobre vários passos desta lista, não todos:

  • De 40 a 50 verificações de hardening, conforme o servidor: configurações do SSH, contas com user ID 0 ou senha vazia, bancos de dados abertos para a internet, atualizações de segurança pendentes, sistema operacional em fim de vida, permissões de arquivos sensíveis, configurações do servidor web, segredos expostos.
  • Vulnerabilidades conhecidas (CVE) dos pacotes instalados, a partir dos trackers de segurança do Debian, Ubuntu, AlmaLinux e Rocky Linux, ordenadas por exploração real.
  • Uma pontuação de segurança de 0 a 100, mostrando o que a derruba. As correções seguras são aplicadas com um clique e podem ser desfeitas; as que poderiam deixar você sem acesso, como o login SSH e a porta, são explicadas passo a passo.
  • Detecção e bloqueio em tempo real: força bruta no SSH e em serviços, ataques web, bots, malware, ameaças de saída e DNS, e alterações em arquivos críticos.
  • Alertas por email, Slack, Discord, Telegram ou webhook, e métricas de CPU, memória, disco e rede.

Ele não faz backups, não sincroniza o relógio nem guarda seus logs: esses passos continuam com você.

Perguntas

O firewall do provedor basta, ou também preciso de ufw ou firewalld?
Use os dois quando puder. O firewall do provedor barra o tráfego antes de ele chegar ao servidor; o do servidor continua protegendo se as regras de nuvem forem alteradas por engano ou se o servidor mudar de lugar.
Atualizações automáticas são seguras em um servidor de produção?
As atualizações de segurança das versões estáveis dessas distribuições são pequenas e testadas, e bem menos arriscadas do que rodar com falhas conhecidas. Deixe as reinicializações automáticas desligadas e programe-as, e mantenha um backup testado.
Por quanto tempo devo guardar os logs?
Não existe um número único. Depende dos seus contratos e de normas como a NIS2, para as empresas que ela abrange. Defina um período, mantenha uma cópia longe do servidor e garanta que o servidor guarde pelo menos o suficiente para investigar as últimas semanas.

Teste grátis em 1 servidor

O Starter é gratuito para um servidor, com proteção completa e bloqueio automático. Sem cartão de crédito.

Instale o agente como root, com o seu token no lugar de <TOKEN>:

curl -fsSL https://github.com/infrafence/infrafence-agent/releases/latest/download/install.sh | sudo bash -s -- --token <TOKEN>

O token é criado no painel, em Servidores › Adicionar servidor.