Configuração Avançada do Servidor SSH
Nota: Este é o quarto tutorial da série sobre SSH. Se você perdeu o anterior sobre autenticação por chaves públicas, pode encontrá-lo aqui: Autenticação SSH por Chaves Públicas.
Nos tutoriais anteriores, focamos principalmente no lado do cliente SSH e na autenticação. Agora, vamos mudar nosso foco para o coração do serviço no lado do servidor: o daemon SSH (sshd) e seu arquivo de configuração principal, sshd_config. Este arquivo permite ajustar finamente o comportamento do servidor SSH, reforçar a segurança, controlar o acesso e otimizar o desempenho.
Dominar as opções do sshd_config é essencial para qualquer administrador de sistemas que queira garantir que seus servidores SSH estejam robustos e seguros.
Localização e Edição do sshd_config
O arquivo de configuração principal do servidor OpenSSH está quase universalmente localizado em:
1
/etc/ssh/sshd_config
(Não confunda com /etc/ssh/ssh_config, que é o arquivo de configuração padrão para o cliente SSH em todo o sistema).
Para editar este arquivo, você precisará de privilégios de superusuário (root), pois ele controla um serviço fundamental do sistema. Use seu editor de texto preferido com sudo:
1
2
3
4
5
# Usando nano (amigável para iniciantes)
sudo nano /etc/ssh/sshd_config
# Usando vim (poderoso, mas com curva de aprendizado)
sudo vim /etc/ssh/sshd_config
O arquivo sshd_config consiste em diretivas de configuração, uma por linha, no formato Diretiva Valor. Linhas que começam com # são comentários e são ignoradas pelo sshd.
Importante: Reiniciar/Recarregar o Serviço sshd
Qualquer alteração feita no arquivo /etc/ssh/sshd_config não terá efeito até que você reinicie ou recarregue o serviço sshd.
- Recarregar (Reload): Geralmente preferível, pois aplica as novas configurações sem derrubar as conexões SSH existentes.
1 2 3
sudo systemctl reload sshd # ou em sistemas sem systemd: # sudo service ssh reload
- Reiniciar (Restart): Aplica as novas configurações, mas derruba todas as conexões SSH ativas.
1 2 3 4 5
sudo systemctl restart sshd # ou em sistemas sem systemd: # sudo service ssh restart # ou # sudo /etc/init.d/ssh restart
Dica: Antes de reiniciar/recarregar, especialmente se estiver fazendo alterações significativas remotamente, é uma boa prática verificar a sintaxe do arquivo de configuração para evitar erros que possam impedir o sshd de iniciar:
1
sudo sshd -t
Se a sintaxe estiver correta, ele não exibirá nenhuma saída. Se houver erros, ele indicará a linha e o problema.
Configurações Essenciais de Segurança
Estas são algumas das diretivas mais importantes para fortalecer a segurança do seu servidor SSH:
Port <numero>:- Define a porta TCP na qual o
sshdescutará por conexões. O padrão é22. - Alterar a porta (ex:
Port 2222) é uma forma de ofuscação. Não impede ataques direcionados, mas pode reduzir significativamente o ruído de bots e scanners automatizados que procuram apenas a porta 22. - Se você alterar a porta, lembre-se de ajustar as regras de firewall e de usar a flag
-pno cliente (ssh -p 2222 ...).
- Define a porta TCP na qual o
PermitRootLogin no:- ALTAMENTE RECOMENDADO! Controla se o usuário
rootpode fazer login diretamente via SSH. - Definir como
noimpede logins diretos como root. Os administradores devem fazer login como um usuário normal e usarsudoousupara obter privilégios elevados. Isso melhora a auditoria (fica registrado qual usuário executou qual comandosudo) e reduz a superfície de ataque. - Outras opções (menos seguras):
prohibit-password(permite root login apenas com chave pública),yes(permite login de root com qualquer método - não recomendado).
- ALTAMENTE RECOMENDADO! Controla se o usuário
PasswordAuthentication no:- Como vimos no tutorial anterior, esta diretiva desabilita completamente a autenticação baseada em senhas.
- Defina como
noapós garantir que a autenticação por chave pública está funcionando para todos os usuários necessários. Isso elimina a ameaça de ataques de força bruta contra senhas.
PubkeyAuthentication yes:- Garante que a autenticação usando chaves públicas esteja habilitada. Geralmente é o padrão (
yes), mas é bom verificar, especialmente se você desabilitou a autenticação por senha.
- Garante que a autenticação usando chaves públicas esteja habilitada. Geralmente é o padrão (
Controle de Acesso
Você pode restringir quais usuários ou grupos podem se conectar via SSH:
AllowUsers <usuario1> <usuario2> ...:- Se esta diretiva for usada, apenas os usuários listados poderão fazer login via SSH. Todos os outros serão negados.
- Você pode listar usuários separados por espaços. Padrões com
*e?podem ser usados. - Exemplo:
AllowUsers alice bob charlie@*.exemplo.com(permite alice, bob e charlie de qualquer host no domínio exemplo.com).
DenyUsers <usuario1> <usuario2> ...:- Lista usuários que são explicitamente proibidos de fazer login via SSH.
- Processado após
AllowUsers.
AllowGroups <grupo1> <grupo2> ...:- Se usada, apenas usuários que são membros primários ou secundários de pelo menos um dos grupos listados podem fazer login.
DenyGroups <grupo1> <grupo2> ...:- Usuários pertencentes a qualquer um dos grupos listados são proibidos de fazer login.
- Processado após
AllowGroups.
Ordem de Processamento: DenyUsers -> AllowUsers -> DenyGroups -> AllowGroups. A primeira regra que corresponder determina o acesso. Recomendação: Usar AllowUsers ou AllowGroups é geralmente mais seguro (princípio do menor privilégio) do que depender de listas de negação (Deny*).
Configurações de Robustez e Performance
Estas diretivas ajudam a tornar o servidor mais resistente a abusos e podem otimizar as conexões:
MaxAuthTries <numero>:- Define o número máximo de tentativas de autenticação permitidas por conexão antes que o servidor desconecte o cliente.
- O padrão costuma ser 6. Reduzir este valor (ex:
MaxAuthTries 3) pode ajudar a mitigar ataques de força bruta, desconectando atacantes mais rapidamente.
LoginGraceTime <tempo>:- Define o tempo máximo (em segundos, ou formato como
1mpara 1 minuto) que um cliente tem para se autenticar com sucesso após iniciar a conexão. - O padrão costuma ser
2m(120 segundos). Reduzir este valor (ex:LoginGraceTime 60s) pode liberar recursos do servidor mais rapidamente de conexões não autenticadas ou lentas.
- Define o tempo máximo (em segundos, ou formato como
ClientAliveInterval <segundos>eClientAliveCountMax <numero>:- Controlam o mecanismo de “keep-alive” do lado do servidor. Útil para detectar e fechar conexões que morreram sem um logout limpo (ex: cliente perdeu rede, travou) e para manter conexões ativas através de firewalls stateful ou NATs que podem fechar conexões TCP inativas.
ClientAliveInterval: O servidor enviará uma mensagem “null packet” para o cliente a cada<segundos>. Se não receber resposta, ele tentará novamente.ClientAliveCountMax: O número máximo de mensagens “client alive” que podem ser enviadas sem receber uma resposta do cliente antes que o servidor desconecte a sessão.- Exemplo:
ClientAliveInterval 60eClientAliveCountMax 3significa que o servidor verificará a cada 60 segundos. Se o cliente não responder por 3 vezes consecutivas (total de 180 segundos), a conexão será encerrada.
UseDNS no:- Controla se o
sshdtenta fazer uma busca DNS reversa no endereço IP do cliente para encontrar seu nome de host (usado para logging e potencialmente para regras de acesso baseadas em nome). - Se a resolução DNS reversa for lenta ou não confiável na sua rede, definir
UseDNS nopode acelerar significativamente o início das conexões SSH, pois o servidor não precisará esperar pela resposta do DNS. - A desvantagem é que os logs mostrarão apenas endereços IP, não nomes de host.
- Controla se o
Outras Diretivas Úteis
Banner /caminho/para/arquivo_de_aviso:- Especifica um arquivo cujo conteúdo será exibido ao usuário antes da solicitação de autenticação (senha ou chave).
- Útil para exibir avisos legais, políticas de uso aceitável ou mensagens de manutenção.
- Exemplo:
Banner /etc/issue.net(um arquivo comum para isso em muitas distros).
AllowTcpForwarding yes/no:- Controla se o tunelamento de portas (Port Forwarding -
-L,-R,-D) é permitido. - O padrão é
yes. Se você não precisa ou não quer permitir tunelamento por questões de segurança (pois pode ser usado para bypassar firewalls), defina comono.
- Controla se o tunelamento de portas (Port Forwarding -
X11Forwarding yes/no:- Controla se o encaminhamento de display X11 (usado para rodar aplicações gráficas remotas) é permitido.
- O padrão é
noem muitas configurações modernas, mas pode seryesem outras. - O encaminhamento X11 tem implicações de segurança (pode permitir que o servidor acesse seu display local). Se não for necessário, defina como
no.
Opcional: Confinamento de Usuários com ChrootDirectory
Esta é uma diretiva mais avançada usada para restringir severamente o ambiente de um usuário após o login.
ChrootDirectory /caminho/para/diretorio_chroot:- Quando um usuário faz login, seu diretório raiz (
/) é alterado para o diretório especificado. - O usuário fica “preso” dentro desse diretório e não pode ver ou acessar arquivos fora dele.
- Muito útil para restringir usuários que só precisam acessar uma área específica do sistema (ex: usuários SFTP que só podem fazer upload/download em um diretório específico).
- Requer configuração cuidadosa: O diretório chroot e todos os seus componentes (incluindo quaisquer bibliotecas ou comandos necessários para o usuário) devem pertencer ao
roote não podem ter permissão de escrita para outros usuários. Configurar um ambiente chroot funcional pode ser complexo. - Geralmente usado em conjunto com
ForceCommand internal-sftppara criar usuários apenas SFTP.
- Quando um usuário faz login, seu diretório raiz (
Conclusão
O arquivo /etc/ssh/sshd_config é o painel de controle do seu servidor SSH. Ao ajustar suas diretivas, você pode ir muito além da configuração padrão, implementando medidas de segurança essenciais como desabilitar o login de root e a autenticação por senha, controlando finamente quem pode acessar o servidor, otimizando o desempenho e a robustez das conexões, e até mesmo confinando usuários a ambientes restritos.
Lembre-se sempre de testar a sintaxe (sshd -t) antes de reiniciar ou recarregar o serviço sshd, e tenha cuidado ao fazer alterações remotamente, especialmente aquelas relacionadas à autenticação, para não se trancar fora do sistema.
No próximo tutorial, voltaremos ao lado do cliente e exploraremos como simplificar e otimizar nossas conexões usando o arquivo de configuração do cliente SSH: ~/.ssh/config.