Introdução
A segurança de servidores não é uma tarefa pontual, mas sim uma prática contínua. Uma única configuração incorreta ou vulnerabilidade sem patch pode levar ao comprometimento total do sistema. Este guia aborda práticas essenciais de hardening de servidores Linux que constituem a base de uma infraestrutura segura.
Configuração Inicial do Servidor
Criar Utilizador Não-Root
# Criar utilizador
adduser deployer
# Adicionar ao grupo sudo
usermod -aG sudo deployer
# Ou, em CentOS/RHEL
usermod -aG wheel deployer
# Testar acesso sudo
su - deployer
sudo whoami
Configurar SSH
# Gerar chave SSH na máquina local
ssh-keygen -t ed25519 -C "[email protected]"
# Copiar a chave pública para o servidor
ssh-copy-id -i ~/.ssh/id_ed25519.pub deployer@server
Edite /etc/ssh/sshd_config:
# Desativar login do root
PermitRootLogin no
# Desativar autenticação por palavra-passe
PasswordAuthentication no
# Usar apenas chave SSH
PubkeyAuthentication yes
# Desativar palavras-passe vazias
PermitEmptyPasswords no
# Limitar utilizadores que podem usar SSH
AllowUsers deployer
# Alterar a porta predefinida (opcional)
Port 2222
# Definições de timeout
ClientAliveInterval 300
ClientAliveCountMax 2
# Desativar encaminhamento X11
X11Forwarding no
Reinicie o SSH:
sudo systemctl restart sshd
Configuração da Firewall
UFW (Ubuntu/Debian)
# Instalar
sudo apt install ufw
# Políticas predefinidas
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Permitir SSH (antes de ativar!)
sudo ufw allow 22/tcp
# Ou porta personalizada
sudo ufw allow 2222/tcp
# Permitir tráfego web
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Ativar firewall
sudo ufw enable
# Verificar estado
sudo ufw status verbose
firewalld (CentOS/RHEL)
# Iniciar e ativar
sudo systemctl start firewalld
sudo systemctl enable firewalld
# Adicionar serviços
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# Confiar na rede interna
sudo firewall-cmd --zone=trusted --add-source=10.0.0.0/8 --permanent
# Recarregar
sudo firewall-cmd --reload
# Verificar estado
sudo firewall-cmd --list-all
Manter o Sistema Atualizado
Atualizações Automáticas de Segurança
Ubuntu/Debian
# Instalar unattended-upgrades
sudo apt install unattended-upgrades
# Configurar
sudo dpkg-reconfigure -plow unattended-upgrades
Edite /etc/apt/apt.conf.d/50unattended-upgrades:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
CentOS/RHEL
# Instalar
sudo dnf install dnf-automatic
# Configurar apenas para atualizações de segurança
sudo vi /etc/dnf/automatic.conf
# Definir: upgrade_type = security
# Ativar temporizador
sudo systemctl enable --now dnf-automatic.timer
Fail2ban — Proteção contra Força Bruta
# Instalar
sudo apt install fail2ban # Debian/Ubuntu
sudo dnf install fail2ban # CentOS/RHEL
# Configurar
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Edite /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
banaction = iptables-multiport
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
# Iniciar
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Verificar estado
sudo fail2ban-client status sshd
Segurança de Utilizadores e Permissões
Políticas de Palavras-passe
Edite /etc/login.defs:
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14
PASS_MIN_LEN 12
Proteger Ficheiros Sensíveis
# Restringir o ficheiro shadow
sudo chmod 640 /etc/shadow
# Proteger o cron
sudo chmod 700 /etc/crontab
# Restringir o diretório SSH
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Monitorizar Acesso Privilegiado
# Registar comandos sudo
echo 'Defaults logfile="/var/log/sudo.log"' | sudo tee -a /etc/sudoers.d/logging
Hardening de Serviços
Desativar Serviços Desnecessários
# Listar serviços ativados
sudo systemctl list-unit-files --type=service --state=enabled
# Desativar serviços desnecessários
sudo systemctl disable bluetooth
sudo systemctl disable cups
sudo systemctl disable avahi-daemon
Remover Pacotes Não Utilizados
# Debian/Ubuntu
sudo apt autoremove
# CentOS/RHEL
sudo dnf autoremove
Deteção de Intrusões
AIDE (Advanced Intrusion Detection Environment)
# Instalar
sudo apt install aide # Debian/Ubuntu
# Inicializar a base de dados
sudo aideinit
# Verificar alterações
sudo aide --check
Monitorizar Logs
# Instalar logwatch
sudo apt install logwatch
# Configurar e-mails diários
sudo vi /etc/cron.daily/00logwatch
# Adicionar: /usr/sbin/logwatch --output mail --mailto [email protected] --detail high
Segurança do Kernel
Hardening com sysctl
Crie /etc/sysctl.d/99-security.conf:
# Desativar encaminhamento de IP (a menos que seja router/VPN)
net.ipv4.ip_forward = 0
# Ignorar redirecionamentos ICMP
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# Desativar source routing
net.ipv4.conf.all.accept_source_route = 0
# Ativar proteção contra SYN flood
net.ipv4.tcp_syncookies = 1
# Ignorar broadcasts de ping
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Registar pacotes martian
net.ipv4.conf.all.log_martians = 1
# Desativar IPv6 (se não for necessário)
net.ipv6.conf.all.disable_ipv6 = 1
Aplicar:
sudo sysctl -p /etc/sysctl.d/99-security.conf
AppArmor/SELinux
AppArmor (Ubuntu)
# Verificar estado
sudo aa-status
# Aplicar perfis
sudo aa-enforce /etc/apparmor.d/*
SELinux (CentOS/RHEL)
# Verificar estado
getenforce
# Definir como enforcing (editar /etc/selinux/config)
SELINUX=enforcing
# Verificar denials
sudo ausearch -m avc -ts today
Auditoria e Monitorização
auditd
# Instalar
sudo apt install auditd # Debian/Ubuntu
# Monitorizar ficheiros sensíveis
sudo auditctl -w /etc/passwd -p wa -k passwd_changes
sudo auditctl -w /etc/shadow -p wa -k shadow_changes
sudo auditctl -w /etc/sudoers -p wa -k sudoers_changes
# Tornar regras persistentes
# Adicionar a /etc/audit/rules.d/audit.rules
# Ver logs de auditoria
sudo ausearch -k passwd_changes
Verificação de Backups
# Criar script de backup
cat << 'EOF' > /usr/local/bin/backup-verify.sh
#!/bin/bash
BACKUP_DIR=/backup
DATE=$(date +%Y%m%d)
# Criar backup
tar -czf $BACKUP_DIR/etc-$DATE.tar.gz /etc
# Verificar backup
tar -tzf $BACKUP_DIR/etc-$DATE.tar.gz > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "Backup verified successfully"
else
echo "Backup verification FAILED" | mail -s "Backup Alert" [email protected]
fi
EOF
chmod +x /usr/local/bin/backup-verify.sh
Checklist de Segurança
Configuração Inicial
- [ ] Criar utilizador não-root com sudo
- [ ] Desativar login SSH do root
- [ ] Ativar apenas autenticação por chave SSH
- [ ] Configurar firewall (negar por predefinição)
- [ ] Instalar e configurar fail2ban
Contínuo
- [ ] Ativar atualizações automáticas de segurança
- [ ] Rever logs regularmente
- [ ] Monitorizar alterações não autorizadas
- [ ] Testar backups mensalmente
- [ ] Auditar contas de utilizador trimestralmente
- [ ] Atualizar e rodar chaves SSH anualmente
Conclusão
A segurança de servidores requer múltiplas camadas de defesa. Comece pelo hardening do SSH e pela configuração da firewall, adicione proteção contra força bruta com fail2ban e implemente deteção de intrusões. Atualizações e monitorização regulares garantem que a postura de segurança se mantém robusta ao longo do tempo.