>_ josetilabs.com
← blog

24 out 2026 · seguranca, ssh, linux · 4 min

Como endurecer o SSH: o que desligar e o que manter

A maioria dos servidores SSH nasce com senha habilitada, root logando e encaminhamento de X11 ligado. Desligar essas três coisas e exigir chave pública resolve a maior parte dos ataques automatizados. O resto é ajuste fino de limites e cifras.

O que desligar

PasswordAuthentication no remove o caminho mais atacado. Força bruta em senha é o que enche o log de tentativas. Sem senha, o atacante precisa ter a chave privada, o que muda o jogo.

PermitRootLogin no impede login direto como root. Mesmo com chave, root não entra. Quem precisa de privilégio entra como usuário normal e usa sudo.

X11Forwarding no desliga o túnel de interface gráfica. Quase ninguém usa, e é superfície de ataque extra.

AllowTcpForwarding no e AllowAgentForwarding no fecham os túneis TCP e o repasse do agente SSH. Se você usa túnel para banco de dados ou para acessar um serviço interno, mantenha AllowTcpForwarding yes em um bloco Match para o usuário ou host que precisa.

ClientAliveInterval 300 com ClientAliveCountMax 2 derruba sessões inativas em dez minutos. Evita terminal aberto esquecido.

O que manter

PubkeyAuthentication yes é o que sobra. É o método que você quer.

AuthenticationMethods publickey diz que só chave pública vale. Sem fallback para senha.

UsePAM yes mantém o PAM ativo. Necessário para segundo fator via PAM, como Google Authenticator ou Duo.

Subsystem sftp fica. Desligar quebra clientes que usam SFTP e ferramentas como rsync sobre SSH.

StrictModes yes verifica permissões dos arquivos de chave. Já é padrão, mas explícito não custa.

LogLevel VERBOSE registra a chave usada em cada login. Ajuda a auditar quem entrou e quando, sem expor dados sensíveis.

O artefato

Crie o arquivo /etc/ssh/sshd_config.d/99-hardening.conf. O OpenSSH lê tudo em sshd_config.d na ordem alfabética, e a primeira ocorrência de uma diretiva vence.

bash
# gera o arquivo de hardening do SSH (rode e confira antes de aplicar)
mkdir -p /tmp/ssh-hardening
cat > /tmp/ssh-hardening/99-hardening.conf <<'EOF'
# endurecimento de ssh: o que desligar e o que manter

# autenticacao
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey
PermitEmptyPasswords no
MaxAuthTries 3
LoginGraceTime 30

# sessao
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
AllowStreamLocalForwarding no
PermitTunnel no
ClientAliveInterval 300
ClientAliveCountMax 2
TCPKeepAlive no

# limites
MaxSessions 4
MaxStartups 10:30:100

# miscelanea
UseDNS no
PrintMotd no
PrintLastLog yes
Banner none

# manter o sftp
Subsystem sftp /usr/lib/openssh/sftp-server
EOF
echo "arquivo gerado:"
wc -l /tmp/ssh-hardening/99-hardening.conf
echo "--- conteudo ---"
cat /tmp/ssh-hardening/99-hardening.conf

Aplique sem derrubar a sessão atual:

bash
sudo sshd -t && sudo systemctl reload ssh

O sshd -t valida sintaxe. Se passar, o reload aplica sem fechar conexões abertas.

Terminal mostrando a política efetiva antes e depois: permitrootlogin without-password para no, passwordauthentication yes para no, x11forwarding yes para no, maxauthtries 6 para 3
A política efetiva antes e depois, vista com sshd -T.

Como verificar

Confirme a política efetiva:

bash
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication|pubkeyauthentication|authenticationmethods|maxauthtries|logingracetime|x11forwarding|allowtcpforwarding|allowagentforwarding|clientaliveinterval|clientalivecountmax|tcpkeepalive|maxsessions|maxstartups|usedns|subsystem)'

Saída esperada, com os valores que você definiu:

permitrootlogin no
passwordauthentication no
kbdinteractiveauthentication no
pubkeyauthentication yes
authenticationmethods publickey
maxauthtries 3
logingracetime 30
x11forwarding no
allowtcpforwarding no
allowagentforwarding no
clientaliveinterval 300
clientalivecountmax 2
tcpkeepalive no
maxsessions 4
maxstartups 10:30:100
usedns no
subsystem sftp /usr/lib/openssh/sftp-server

Abra outra janela e teste o login por chave antes de fechar a atual.

Se der errado

Permission denied (publickey) logo após aplicar. Causa: a chave pública não está em ~/.ssh/authorized_keys do usuário, ou as permissões estão erradas. Correção: chmod 700 ~/.ssh e chmod 600 ~/.ssh/authorized_keys, e confirme que o arquivo tem a chave. Volte a senha temporariamente com PasswordAuthentication yes em um bloco Match para o seu IP.

sshd -t acusa Deprecated option ou Bad configuration. Causa: diretiva inexistente na versão instalada, como Protocol 2 em OpenSSH 9.x, que não existe mais. Correção: remova a linha; o padrão já é o certo.

SFTP parou de funcionar. Causa: a linha Subsystem sftp foi removida ou aponta para caminho inexistente. Correção: confirme que /usr/lib/openssh/sftp-server existe e mantenha a linha.

Antes e depois

Diretiva Antes (padrão) Depois
permitrootlogin without-password no
passwordauthentication yes no
authenticationmethods any publickey
maxauthtries 6 3
logingracetime 120 30
x11forwarding yes no
allowtcpforwarding yes no
allowagentforwarding yes no
clientaliveinterval 0 300
clientalivecountmax 3 2
tcpkeepalive yes no
maxsessions 10 4

FAQ

Preciso trocar a porta do SSH? Não. Mudar a porta reduz ruído no log, mas não é segurança. Quem escaneia encontra a porta em segundos. Mantenha 22 e invista em chave e fail2ban.

E se eu perder a chave privada? Você perde o acesso. Por isso mantenha uma segunda chave em outro lugar, ou acesso de console via provedor. Não desligue a senha antes de ter duas formas de entrar.

Funciona com chaves ed25519 e rsa? Sim. O SSH aceita os dois. Prefira ed25519 para chaves novas: ssh-keygen -t ed25519.

O reload derruba minha sessão? Não. systemctl reload ssh recarrega a configuração para novas conexões. Sessões abertas continuam.

Posso restringir por usuário ou IP? Sim. Use blocos Match no final do arquivo. Exemplo: Match User deploy seguido de AllowTcpForwarding yes libera túnel só para esse usuário. A ordem importa: Match vale até o próximo Match ou fim de arquivo.

Fontes

Documentação oficial do sshd_config: man.openbsd.org/sshd_config.

OpenSSH 9.6, manual de sshd_config: https://man.openbsd.org/sshd_config Documentação do OpenSSH: https://www.openssh.com/manual.html

Links internos: veja chave SSH em vez de senha, agente SSH e fail2ban sem se trancar fora.

Leia também

// Por e-mail

Os textos publicados aqui também vão por e-mail. O envio ainda não começou: quem deixar o endereço agora entra na primeira lista.

Guardo só o seu e-mail, a data e o registro desta autorização. Sem cookies, sem rastreador e nada compartilhado com terceiros. Detalhes na política de privacidade.