10 Práticas Essenciais para Reforçar a Segurança do Seu Servidor SSH

Reforce a segurança do seu servidor SSH com autenticação mais segura, acesso com privilégios mínimos, regras de firewall, limitação de taxa, atualizações e verificação de logs.

10 Práticas Essenciais para Reforçar a Segurança do Seu Servidor SSH

O Secure Shell (SSH) é geralmente a porta de entrada para o seu servidor. Se essa porta aceitar senhas fracas, logins diretos de root ou tráfego de toda a internet, os atacantes a encontrarão rapidamente.

Este guia fornece 10 passos práticos para reforçar a segurança do servidor SSH que você pode aplicar ao OpenSSH em distribuições Linux comuns. Mantenha uma sessão de trabalho ativa enquanto testa cada alteração para poder se recuperar se uma regra de firewall ou edição de configuração bloquear novos logins.

1. Altere a Porta Padrão do SSH

A porta padrão do SSH é 22. Isso é universalmente conhecido e constantemente escaneado por bots automatizados em busca de servidores vulneráveis. Alterar a porta padrão fornece uma camada simples, porém eficaz, de obscuridade. Embora não seja uma medida de segurança por si só, reduz significativamente o ruído de varreduras automatizadas e ajuda a evitar muitos ataques oportunistas.

Para alterar a porta, edite o arquivo sshd_config, normalmente localizado em /etc/ssh/sshd_config.

sudo nano /etc/ssh/sshd_config

Encontre a linha Port 22 (ou adicione-a se não existir) e altere 22 para um número de porta não padrão e não atribuído (por exemplo, 2222, 49152-65535 são portas de usuário/dinâmicas).

#Port 22
Port 2222

Antes de reiniciar o SSH, permita a nova porta no seu firewall. Em seguida, teste um novo login na nova porta antes de remover o acesso à porta 22.

# Para UFW (Uncomplicated Firewall):
sudo ufw allow 2222/tcp
sudo ufw reload

# Para Firewalld:
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

sudo sshd -t
sudo systemctl restart sshd

Dica: Sempre mantenha pelo menos uma sessão SSH ativa ao testar alterações de configuração. Se você for bloqueado, poderá reverter as alterações na sessão ativa.

2. Desative o Login de Root

O login direto de root via SSH é altamente desencorajado. O usuário root tem privilégios irrestritos, tornando-o um alvo principal para atacantes. Se um atacante obtiver acesso root, ele terá controle total sobre o seu sistema. Em vez disso, faça login como um usuário comum e sem privilégios e, em seguida, use sudo para realizar tarefas administrativas.

No sshd_config, encontre a diretiva PermitRootLogin e defina-a como no.

PermitRootLogin no

Salve e reinicie o serviço SSH:

sudo systemctl restart sshd

3. Use Autenticação Baseada em Chave

A autenticação baseada em senha é suscetível a ataques de força bruta e ataques de dicionário, especialmente se os usuários escolherem senhas fracas. A autenticação baseada em chave SSH é uma alternativa muito mais segura. Ela usa um par de chaves criptográficas: uma chave pública armazenada no servidor e uma chave privada mantida na sua máquina local. Apenas clientes com a chave privada correspondente podem autenticar.

Passos para implementar a autenticação baseada em chave (resumidamente):

  1. Gere um par de chaves na sua máquina local:

    ssh-keygen -t ed25519 -C "[email protected]"
    
    • ed25519 é um algoritmo moderno e seguro com tamanho de chave fixo. rsa também é comum; se usar RSA, gere uma chave grande como ssh-keygen -t rsa -b 4096.
  2. Copie a chave pública para o seu servidor:

    ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@ip_do_seu_servidor
    

    Alternativamente, anexe manualmente o conteúdo de ~/.ssh/id_ed25519.pub a ~/.ssh/authorized_keys no servidor para o usuário com o qual deseja fazer login.

  3. Garanta as permissões corretas no servidor:

    • Diretório ~/.ssh: 700 (rwx apenas para o proprietário)
    • Arquivo ~/.ssh/authorized_keys: 600 (rw apenas para o proprietário)
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    

4. Desative a Autenticação por Senha

Depois de configurar e testar com sucesso a autenticação baseada em chave para todos os usuários necessários, você deve desativar completamente a autenticação por senha. Isso remove o elo mais fraco na segurança do SSH, tornando os ataques de força bruta de senha impossíveis.

No sshd_config, defina PasswordAuthentication como no.

PasswordAuthentication no
KbdInteractiveAuthentication no

Em algumas distribuições, a autenticação PAM ou interativa por teclado ainda pode solicitar senhas, a menos que você também a desative. Teste com um terminal novo antes de fechar sua sessão existente.

Salve e reinicie o serviço SSH:

sudo systemctl restart sshd

Aviso: Nunca desative a autenticação por senha antes de verificar se a autenticação baseada em chave funciona corretamente para todos os usuários que precisam de acesso. Caso contrário, você corre o risco de se bloquear do servidor.

5. Limite o Acesso de Usuários

Por padrão, qualquer conta de usuário no servidor pode tentar fazer login via SSH. Você pode restringir o acesso SSH a apenas usuários ou grupos específicos, minimizando a superfície de ataque.

Use as diretivas AllowUsers ou AllowGroups no sshd_config.

Para permitir apenas usuários específicos (por exemplo, adminuser, devuser):

AllowUsers adminuser devuser

Para permitir apenas membros de um grupo específico (por exemplo, sshusers):

AllowGroups sshusers

Dica: Geralmente é melhor usar AllowGroups se você tiver vários usuários. Crie um grupo dedicado para acesso SSH e adicione usuários autorizados a ele.

sudo groupadd sshusers
sudo usermod -aG sshusers adminuser
sudo usermod -aG sshusers devuser

Após fazer as alterações, salve e reinicie o SSH.

6. Use Frases Secretas Fortes para Chaves SSH

Embora a autenticação baseada em chave seja robusta, sua chave privada ainda é um ativo crítico. Se um atacante obtiver acesso à sua máquina local, ele pode roubar sua chave privada. Uma frase secreta forte criptografa sua chave privada, exigindo a frase secreta para desbloqueá-la antes do uso. Isso adiciona outra camada de segurança, protegendo sua chave mesmo que ela caia em mãos erradas.

Ao gerar sua chave SSH (como no passo 3), você será solicitado a fornecer uma frase secreta. Escolha uma frase secreta longa, complexa e memorável, diferente de qualquer outra senha que você use.

7. Implemente Limitação de Taxa de Conexão (Fail2Ban)

Mesmo com autenticação baseada em chave, um servidor SSH ainda está sujeito a tentativas de conexão. Ferramentas como o Fail2Ban podem monitorar ativamente os logs do SSH em busca de repetidas tentativas de login malsucedidas do mesmo endereço IP e bloquear automaticamente esse endereço IP usando regras de firewall por um período definido.

Instalação (exemplo para Debian/Ubuntu):

sudo apt update
sudo apt install fail2ban

O Fail2Ban funciona imediatamente com regras SSH padrão, mas você pode personalizar sua configuração copiando jail.conf para jail.local e editando-o.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Dentro de jail.local, você pode ajustar bantime, findtime e maxretry para a seção [sshd].

[sshd]
enabled = true
port = 2222 # Sua nova porta SSH
logpath = %(sshd_log)s
maxretry = 3
bantime = 1h
findtime = 10m

Reinicie o Fail2Ban após as alterações de configuração:

sudo systemctl restart fail2ban

8. Mantenha o Software do Seu Servidor SSH Atualizado

Vulnerabilidades de software são constantemente descobertas e corrigidas. Executar software de daemon SSH desatualizado (OpenSSH) significa que você pode estar exposto a explorações conhecidas. Atualizar regularmente o software do seu servidor, incluindo o pacote do servidor OpenSSH, é crucial para corrigir vulnerabilidades de segurança.

# Para Debian/Ubuntu:
sudo apt update && sudo apt upgrade

# Para CentOS/RHEL:
sudo yum update
# ou
sudo dnf update

Configure seu sistema para aplicar atualizações de segurança automaticamente quando apropriado, ou estabeleça uma rotina para atualizações manuais.

9. Monitore os Logs do SSH para Atividades Suspeitas

Mesmo com medidas preventivas robustas, a vigilância é fundamental. Revise regularmente os logs de autenticação do SSH para detectar padrões incomuns, tentativas de login malsucedidas ou tentativas de acesso não autorizado. Isso ajuda a identificar possíveis violações ou ataques em andamento.

Os logs do SSH são normalmente encontrados em:

  • /var/log/auth.log (Debian/Ubuntu)
  • /var/log/secure (CentOS/RHEL)
  • Usando journalctl (sistemas systemd):
    sudo journalctl -u sshd -f
    

Procure por repetidas tentativas de autenticação malsucedidas, logins de endereços IP incomuns ou logins bem-sucedidos por usuários desconhecidos. Ferramentas como Logwatch ou Elastic Stack (ELK) podem automatizar a análise de logs e alertas para ambientes maiores.

10. Configure Regras de Firewall para Restringir o Acesso

Um firewall é sua primeira linha de defesa. Por padrão, ele deve bloquear todo o tráfego de entrada, exceto pelos serviços que você precisa explicitamente expor. Para SSH, isso significa permitir conexões apenas na porta escolhida (por exemplo, 2222) e, idealmente, apenas de endereços IP ou redes confiáveis específicos.

Exemplo usando UFW (Uncomplicated Firewall):

Permitir SSH de um endereço IP específico 192.168.1.100 na porta 2222:

sudo ufw allow from 192.168.1.100 to any port 2222

Permitir SSH de uma sub-rede específica 192.168.1.0/24:

sudo ufw allow from 192.168.1.0/24 to any port 2222

Exemplo usando Firewalld (CentOS/RHEL):

Permitir SSH de um endereço IP específico 192.168.1.100 na porta 2222:

sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port=2222 protocol="tcp" accept'
sudo firewall-cmd --reload

Aviso: Se você estiver gerenciando um servidor a partir de um endereço IP dinâmico, tenha cuidado com regras de firewall restritivas. Você pode precisar permitir o acesso de um intervalo mais amplo ou usar uma VPN.

Dicas Adicionais de Reforço

Além dos 10 essenciais, considere estas diretivas para ainda mais segurança:

  • MaxAuthTries: Limita o número de tentativas de autenticação por conexão. O padrão é 6. Reduzi-lo (por exemplo, 3) reduz as chances de força bruta. Defina em sshd_config.
    MaxAuthTries 3
    
  • LoginGraceTime: Limita o tempo permitido para um usuário autenticar. O padrão é 2 minutos. Reduzi-lo (por exemplo, 30s) reduz a janela para ataques lentos.
    LoginGraceTime 30s
    
  • ClientAliveInterval e ClientAliveCountMax: Impedem que sessões SSH ociosas permaneçam abertas indefinidamente. ClientAliveInterval envia uma mensagem keepalive a cada X segundos. Se ClientAliveCountMax respostas forem perdidas, a conexão é encerrada.
    ClientAliveInterval 300
    ClientAliveCountMax 2
    
  • Banner: Exibe uma mensagem de aviso antes da autenticação. Isso serve como aviso legal para potenciais usuários não autorizados.
    Banner /etc/issue.net
    
    Crie o arquivo /etc/issue.net com sua mensagem de aviso desejada.

Conclusão Prática

Comece com as alterações que removem o maior risco: desative o login de root, exija chaves SSH, restrinja quem pode se conectar e limite as redes de origem quando possível. Teste cada alteração com sshd -t e uma nova sessão de login antes de fechar a atual.