Skip to main content

Hardening SSH no Linux | Tarefas rotineiras | Linux

  • Hardening SSH no Linux | Tarefas rotineiras | Linux

Objetivo

Esta documentação mostra uma baseline de hardening para o sshd em Linux, com foco em reduzir as brechas mais comuns:

  • login remoto como root
  • autenticação por senha
  • acesso irrestrito de usuários
  • abuso de forwarding
  • permissões inseguras em arquivos do SSH

A base da configuração vem das diretivas oficiais do sshd_config, como PermitRootLogin, PasswordAuthentication, PubkeyAuthentication, AuthenticationMethods, AllowUsers, AllowGroups e StrictModes. (Man Page do OpenBSD)

O que eu recomendo como padrão seguro

Para um servidor Linux comum em produção:

  • desabilitar login SSH do root
  • desabilitar autenticação por senha
  • permitir apenas autenticação por chave pública
  • restringir acesso com AllowUsers ou AllowGroups
  • manter validação rígida de permissões com StrictModes yes
  • desabilitar recursos de forwarding que você não usa

Importante: a documentação oficial deixa claro que desabilitar apenas AllowTcpForwarding ou X11Forwarding não resolve tudo sozinho se o usuário ainda tem shell, então essas opções devem ser vistas como redução de superfície, não como controle absoluto. (Man Page do OpenBSD)

Arquivo principal

Normalmente o arquivo principal fica em:

/etc/ssh/sshd_config

Em várias distros também existem includes em:

/etc/ssh/sshd_config.d/*.conf

Antes de editar, faça backup:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

Configuração recomendada

Abaixo está uma configuração segura e prática para a maioria dos cenários administrativos.

# /etc/ssh/sshd_config

Port 22
Protocol 2

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
AuthenticationMethods publickey

UsePAM yes

X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
PermitUserEnvironment no

LoginGraceTime 30
MaxAuthTries 3
MaxSessions 2
MaxStartups 10:30:60

ClientAliveInterval 300
ClientAliveCountMax 2

IgnoreRhosts yes
HostbasedAuthentication no
StrictModes yes

# Escolha UMA das abordagens abaixo:

# 1. Liberar apenas usuários específicos
AllowUsers adolfosp

# 2. Ou liberar apenas um grupo administrativo
# AllowGroups sshadmins

O que cada diretiva faz

PermitRootLogin no

Impede login remoto direto como root. Isso reduz o alvo óbvio mais atacado em qualquer servidor exposto. Essa é uma das medidas mais importantes de hardening. A diretiva é oficial do sshd_config. (Man Page do OpenBSD)

PasswordAuthentication no

Desabilita autenticação por senha. Isso elimina brute force e password spraying via SSH como vetor principal. A documentação oficial do OpenSSH trata essa diretiva diretamente. (Man Page do OpenBSD)

KbdInteractiveAuthentication no

Desabilita autenticação keyboard-interactive. Em muitos ambientes, deixar isso ativo pode manter uma rota de autenticação mesmo com senha “desabilitada”, dependendo da integração PAM. (Man Page do OpenBSD)

PubkeyAuthentication yes

Mantém autenticação por chave pública, que é o modelo recomendado para acesso administrativo seguro. (Man Page do OpenBSD)

AuthenticationMethods publickey

Força o método de autenticação para chave pública. A diretiva oficial permite exigir explicitamente quais métodos devem ser completados para o login ser aceito. (Man Page do OpenBSD)

StrictModes yes

Faz o sshd validar permissões e ownership do home e dos arquivos SSH do usuário antes de aceitar o login. Isso é importante porque permissões frouxas em ~/.ssh e authorized_keys são um problema clássico. A documentação do sshd descreve isso como desejável por padrão. (Man Page do OpenBSD)

AllowUsers e AllowGroups

Restringem quem pode entrar no SSH. A documentação oficial também define a ordem de processamento entre DenyUsers, AllowUsers, DenyGroups e AllowGroups. (Man Page do OpenBSD)

X11Forwarding no, AllowTcpForwarding no, AllowAgentForwarding no, PermitTunnel no

Desativam recursos que normalmente não são necessários em servidor comum. Eles reduzem superfície e uso indevido do canal SSH. Mas, isoladamente, não devem ser tratados como proteção completa se o usuário ainda recebe shell. (Man Page do OpenBSD)

Exemplo recomendado para Ubuntu e Debian

Em Ubuntu/Debian, normalmente o serviço se chama ssh.

# /etc/ssh/sshd_config

Port 22
Protocol 2

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
AuthenticationMethods publickey

UsePAM yes
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
PermitUserEnvironment no

LoginGraceTime 30
MaxAuthTries 3
MaxSessions 2
MaxStartups 10:30:60
ClientAliveInterval 300
ClientAliveCountMax 2

IgnoreRhosts yes
HostbasedAuthentication no
StrictModes yes

AllowUsers adolfosp

Validar:

sudo sshd -t

Recarregar:

sudo systemctl reload ssh

Exemplo recomendado para Rocky, Alma, CentOS e RHEL

Nessas distros, normalmente o serviço se chama sshd.

# /etc/ssh/sshd_config

Port 22
Protocol 2

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
AuthenticationMethods publickey

UsePAM yes
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
PermitUserEnvironment no

LoginGraceTime 30
MaxAuthTries 3
MaxSessions 2
MaxStartups 10:30:60
ClientAliveInterval 300
ClientAliveCountMax 2

IgnoreRhosts yes
HostbasedAuthentication no
StrictModes yes

AllowUsers adolfosp

Validar:

sudo sshd -t

Recarregar:

sudo systemctl reload sshd

Permissões corretas dos arquivos do usuário

Mesmo com StrictModes yes, o login pode falhar ou ficar inseguro se as permissões estiverem erradas.

Permissões recomendadas:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R usuario:usuario ~/.ssh

Se quiser validar no servidor:

ls -ld /home/usuario
ls -ld /home/usuario/.ssh
ls -l /home/usuario/.ssh/authorized_keys

Sequência segura para aplicar sem se trancar fora do servidor

Nunca altere SSH e feche sua sessão atual sem validar.

1. Faça backup

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

2. Edite o arquivo

sudo nano /etc/ssh/sshd_config

3. Valide sintaxe

sudo sshd -t

Se esse comando não retornar nada, a sintaxe está ok.

4. Recarregue o serviço

Ubuntu/Debian:

sudo systemctl reload ssh

RHEL-like:

sudo systemctl reload sshd

5. Abra uma nova sessão SSH antes de encerrar a atual

Teste com outro terminal:

ssh adolfosp@IP_DO_SERVIDOR

Só depois de confirmar que a nova sessão funcionou, encerre a antiga.

Como gerar chave no cliente

No cliente local:

ssh-keygen -t ed25519 -C "adolfosp@meu-notebook"

Depois copie para o servidor:

ssh-copy-id adolfosp@IP_DO_SERVIDOR

Se o ssh-copy-id não existir:

cat ~/.ssh/id_ed25519.pub | ssh adolfosp@IP_DO_SERVIDOR 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'

Como verificar a configuração efetiva

Para ver como o sshd está interpretando a configuração:

sudo sshd -T

Isso é útil porque às vezes existe conflito entre:

  • /etc/ssh/sshd_config
  • arquivos em /etc/ssh/sshd_config.d/
  • defaults da distro

Configuração mais fechada ainda para servidor administrativo

Se o servidor é só para administração e você quer travar mais:

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
AuthenticationMethods publickey
AllowUsers adolfosp
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
PermitUserEnvironment no
MaxAuthTries 3
LoginGraceTime 30
StrictModes yes

O que evitar

  • deixar PermitRootLogin yes
  • deixar PasswordAuthentication yes em servidor exposto
  • liberar SSH para qualquer usuário local sem necessidade
  • usar a mesma chave privada em muitos ambientes sem controle
  • alterar SSH sem manter uma sessão aberta para rollback
  • confiar apenas em trocar a porta do SSH

Trocar a porta ajuda só a reduzir ruído de scanner automatizado. Não é hardening forte.

Exemplo de rollback rápido

Se algo der errado e você ainda estiver com a sessão aberta:

Ubuntu/Debian:

sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
sudo sshd -t && sudo systemctl reload ssh

RHEL-like:

sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
sudo sshd -t && sudo systemctl reload sshd

Checklist rápido

  • PermitRootLogin no
  • PasswordAuthentication no
  • KbdInteractiveAuthentication no
  • PubkeyAuthentication yes
  • AuthenticationMethods publickey
  • StrictModes yes
  • AllowUsers ou AllowGroups
  • ~/.ssh com 700
  • authorized_keys com 600
  • sshd -t antes de recarregar
  • teste de nova sessão antes de sair