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
sshd
escutará 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
-p
no cliente (ssh -p 2222 ...
).
- Define a porta TCP na qual o
PermitRootLogin no
:- ALTAMENTE RECOMENDADO! Controla se o usuário
root
pode fazer login diretamente via SSH. - Definir como
no
impede logins diretos como root. Os administradores devem fazer login como um usuário normal e usarsudo
ousu
para 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
no
apó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
1m
para 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 60
eClientAliveCountMax 3
significa 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
sshd
tenta 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 no
pode 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 é
no
em muitas configurações modernas, mas pode seryes
em 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
root
e 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-sftp
para 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
.