Implantação do Daemon SSH em Ambientes Linux
Começaremos pela instalação do daemon nos principais ecossistemas baseados em Linux. O pacote openssh-server é o componente essencial para habilitar o acesso remoto seguro.
# Distribuições baseadas em Debian/Ubuntu
sudo apt-get update && sudo apt-get install -y openssh-server openssh-client
# Distribuições baseadas em RHEL/CentOS/Fedora
sudo dnf install -y openssh-server openssh-clients
# Habilitar e iniciar o serviço imediatamente
sudo systemctl enable --now sshd.service
O pacote também fornece utilitários como o ssh-keygen para criação de pares criptográficos e o arquivo /etc/ssh/moduli para troca de chaves Diffie-Hellman.
Ajustes de SELinux e Firewalld/Iptables
Em ambientes corporativos, é comum ajustar as políticas de segurança locais. Em vez de desativar o SELinux (prática não recomendada), configure-o para permitir o tráfego SSH em portas não padrão, ou ajuste as regras de firewall.
# Verificar e adicionar contexto SELinux para porta customizada
sudo semanage port -a -t ssh_port_t -p tcp 2222
# Liberar porta no firewalld
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
# Alternativa com iptables (limpando regras antigas e permitindo SSH)
sudo iptables -F
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
Para validar se o processo está ativo e escutando:
ss -tulpn | grep sshd
pgrep -a sshd
Provisionamento do OpenSSH no Windows
A Microsoft suporta nativamente o OpenSSH. Podemos instalá-lo via PowerShell ou utilizando o gerenciador de pacotes Chocolatey.
Instalação via Chocolatey
O método mais ágil para ambientes Windows é utilizar o choco, que automatiza a configuração inicial.
# Instalar o servidor e cliente OpenSSH com recursos adicionais
choco install openssh -y --params "/SSHServerFeature /SSHAgentFeature"
# Iniciar e definir inicialização automática para os serviços
Set-Service -Name sshd -StartupType Automatic
Start-Service sshd
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent
Configuração do Shell Padrão no Windows
Por padrão, o SSH no Windows abre o cmd.exe. Podemos alterar isso para o PowerShell Core (pwsh) ou Bash via registro do Windows.
# Definir PowerShell 7 como shell padrão
$pwshPath = (Get-Command pwsh -ErrorAction SilentlyContinue).Source
if ($pwshPath) {
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value $pwshPath -PropertyType String -Force
}
# Definir Git Bash como shell padrão (caso instalado via Scoop ou Installer)
$bashPath = "C:\Program Files\Git\bin\bash.exe"
if (Test-Path $bashPath) {
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value $bashPath -PropertyType String -Force
}
Autenticação Baseada em Chaves Criptográficas
A autenticação por senha é vulnerável a ataques de força bruta. A implementação de chaves assimétricas modernas é o padrão da indústria.
# Gerar um par de chaves Ed25519 (mais seguro e rápido que RSA)
ssh-keygen -t ed25519 -C "admin@infraestrutura" -f ~/.ssh/id_ed25519_infra
# Adicionar a chave ao agente SSH local
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519_infra
Para distribuir a chave pública para o servidor remoto:
# Em ambientes Linux
ssh-copy-id -i ~/.ssh/id_ed25519_infra.pub sysadmin@192.168.1.50
# Em ambientes Windows (copiando manualmente via pipeline SSH)
type $env:USERPROFILE\.ssh\id_ed25519_infra.pub | ssh sysadmin@192.168.1.50 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Hardening e Segurança do sshd_config
O arquivo /etc/ssh/sshd_config (ou C:\ProgramData\ssh\sshd_config no Windows) controla o comportamento do daemon. Após qualquer alteração, o serviço deve ser reinicidao (systemctl restart sshd).
Restrição de Acesso e Protocolos
# Forçar apenas IPv4 e definir porta não padrão
AddressFamily inet
Port 2222
# Desabilitar autenticação por senha e root
PasswordAuthentication no
PermitRootLogin no
PermitEmptyPasswords no
# Restringir acesso a usuários e grupos específicos
AllowUsers sysadmin deployer
AllowGroups ssh-users
# Habilitar PAM para controle de tentativas de login
UsePAM yes
MaxAuthTries 3
Algoritmos Criptográficos Fortes
Remova algoritmos legados e force o uso de cifras modernas para proteger o tráfego contra interceptação e ataques de downgrade.
# Cifras de dados
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
# Códigos de autenticação de mensagem (MACs)
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# Algoritmos de troca de chaves
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512
# Algoritmos de chave de host
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
Para verificar os algoritmos suportados pelo cliente e servidor:
ssh -Q cipher
sshd -T | grep -E 'ciphers|macs|kexalgorithms'
Otimizações de Performance e Telemetria
Aceleração de Conexão
A resolução reversa de DNS pode causar atrasos significativos durante o handshake SSH, especialmente em redes sem DNS reverso configurado.
# Desativar resolução DNS reversa
UseDNS no
# Desativar autenticação GSSAPI se não estiver utilizando Kerberos
GSSAPIAuthentication no
Mnesagens de Boas-vindas (MOTD)
Para exibir banners legais ou informações do sistema após o login, edite o arquivo /etc/motd ou crie scripts em /etc/profile.d/.
# Adicionar banner dinâmico com informações do sistema
cat << 'EOF' > /etc/profile.d/sysinfo.sh
#!/bin/bash
echo "Bem-vindo ao servidor $(hostname). Uptime: $(uptime -p)"
EOF
chmod +x /etc/profile.d/sysinfo.sh
Deprecação do Protocolo SCP no RHEL 9
A partir do Red Hat Enterprise Linux 9, o protocolo SCP foi considerado obsoleto e desativado por padrão devido a falhas de design de segurança inerentes ao seu funcionamento. O OpenSSH agora utiliza o SFTP como protocolo padrão para transferência de arquivos via comando scp. Para forçar o uso do protocolo legado (não recomendado), é necessário usar a flag -O, mas a migração para sftp ou rsync é a abordagem correta e segura.
Diagnóstico e Resolução de Problemas
Quando o daemon falha ao iniciar ou conexões são recusadas, a análise de logs e testes de configuração são fundamentais para identificar a causa raiz.
Validação de Sintaxe e Logs
# Testar arquivo de configuração antes de reiniciar o serviço
sudo sshd -t -f /etc/ssh/sshd_config
# Iniciar em modo de depuração na porta alternativa (não bloqueia o serviço principal)
sudo /usr/sbin/sshd -d -p 2222
# Analisar logs de autenticação em tempo real via systemd
sudo journalctl -u sshd.service -f
# Alternativa para sistemas mais antigos (Debian/Ubuntu)
sudo tail -f /var/log/auth.log | grep sshd
Erro: "Missing privilege separation directory: /run/sshd"
Este erro ocorre frequentemente após reinicializações em sistemas onde o diretório /run (tmpfs) é limpo e o script de inicialização não o recria.
Solução automatizada via systemd tmpfiles:
# Criar arquivo de configuração para o tmpfiles.d
echo "d /run/sshd 0755 root root" | sudo tee /usr/lib/tmpfiles.d/sshd-custom.conf
# Aplicar as regras imediatamente
sudo systemd-tmpfiles --create
Falha na Autenticação por Certificado (Permission denied)
Se o erro Permission denied (publickey) ocorrer, verifique as permissões do diretório .ssh e dos arquivos de chaves no servidor. O OpenSSH é estrito quanto a isso e rejeitará a autenticação se as permissões forem muito permisivas.
# Corrigir permissões do diretório e arquivos do usuário
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519_infra
chown -R $USER:$USER ~/.ssh