O SSH é a ferramenta mais utilizada por qualquer administrador de servidores Linux. O motivo é fácil de imaginar: acesso remoto seguro a um servidor é uma característica que qualquer um deseja para dar mais agilidade ao trabalho. Porém, com essa facilidade vem também alguns prolemas sérios, principalmente de segurança: como se proteger de ataques à ferramenta? Afinal de contas se alguém conseguir se conectar ao SSH, terá acesso ao servidor e pode causar um certo estrago não só no seu servidor, como também em outros servidores na Internet à partir dele.
Como vimos no post “SSH sem senha“, existem algumas maneiras muito boas de aumentar a segurança do SSH. Uma maneira que não citei naquele post é o SSH Port knocking, que vamos conhecer e aprender a configurar neste texto.
Muitas pessoas, na tentativa de aumentar a segurança, apenas mudam a porta que o servidor SSH escuta para uma outra porta qualquer, aleatória. O problema é que mesmo assim ainda é possível descobrir se há um servidor SSH sendo executado em uma determinada máquina utilizando scanners como o NMap. Ou seja, essa técnica aumenta um pouco a segurança mas nem de longe é uma solução definitiva.
Aqui entra o port knocking. Nesta configuração, o administrador define uma sequência de portas lógicas às quais um cliente deve se conectar antes de tentar se conectar à porta do SSH (seja ela qual for, não importa). Você pode especificar, por exemplo, que o cliente primeiro deverá se conectar às portas 34, 1032 e 43231 antes de se conectar à porta 22 (padrão do SSH). Qualquer cliente que não obedeça essa sequência será bloqueado.
Considerando que um sistema operacional possui 65535 portas, adivinhar a quais portas e em qual sequência o cliente deve se conectar é praticamente impossível.
Para implantar a solução, vamos utilizar um software chamado knockd. Este é um daemon que fica monitorando o sistema e, quando qualquer cliente se conectar na sequência correta, com a flag correta cria uma regra no IPTables liberando o IP de origem. Quando o cliente se desconecta, a regra é removida e ele só pode se conectar novamente ao fazer a sequência de “batidas” nas portas pré-definidas. Ele será utilizado tanto no cliente, quanto no servidor.
Vamos começar a nossa configuração pelo servidor. Acesse o seu servidor e instale o knockd:
# yum install knock
Lembrando que o knock não existe nos repositórios padrão do CentOS. Você deve instalar o RPMForge para poder utilizá-lo! Veja como instalar o RPMForge.
O arquivo de configuração é o /etc/knockd.conf. Originalmente ele é assim:
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
Na sessão “[options]” você pode definir qual o arquivo de log utilizado pelo knockd para gravar as mensagens. Porém, essa não é a única opção aceita nesta sessão. Você também pode definir o seguinte:
Em “[openSSH]” você define as opções para quando o cliente quer se conectar ao servidor:
Estas são apenas as opções mais comuns, existem mais algumas (não muitas) que você pode utilizar caso ache necessário. Se quiser conhecer todas as opções, basta ler a manpage do comando knockd. As mesmas opções são utilizadas na sessão “[closeSSH]“, que define que deve ser feito quando o cliente desconectar. Modifique o arquivo da maneira que você achar melhor.
Configuração feita, agora você pode inicializar o knockd:
# knockd &
Agora, você pode barrar qualquer acesso ao SSH utilizando a seguinte regra do IPTables:
# iptables -A INPUT -p tcp –dport 22 -j DROP
Lembre-se de substituir o 22 pelo número da porta que você configurou para o SSH. Lembre-se também que, se estiver conectar ao servidor via SSH, logo depois de executar esse comando sua conexão será encerrada. Por isso, tenha certeza de que tudo já está funcionando corretamente quando barrar as conexões à porta 22.
No lado do cliente, o knockd é utilizado para fazer com que a sequência de conexão seja realizada. O cliente é desenvolvido para vários sistemas além do Linux, incluindo o Windows (a lista de downloads está em http://www.zeroflux.org/projects/knock). Nunca testei o cliente para Windows, se você testar deixe um comentário!
Instale o knockd também no cliente:
# yum install knock
No cliente, você não precisa de nenhuma configuração adicional. Basta informar o servidor e a sequência de portas diretamente na linha de comando assim:
$ knock 192.168.1.103 7000:tcp 8000:tcp 9000:tcp
Logo depois, execute o SSH normalmente:
$ ssh root@192.168.1.103
Quando você terminar de usar a sessão SSH, utilize o knock novamente para fechar a porta (você deve se conectar às portas como elas estão definidas na sessão “[closeSSH]“):
$ knock 192.168.1.103 9000:tcp 8000:tcp 7000:tcp
Pronto! Qualquer usuário que tentar se conectar ao servidor deve se conectar à sequência pré-definida de portas para que o knockd libere o IP no IPTables e, quando finalizar, executar a sequência de finalização para que a porta seja fechada novamente.
Utilizando o port knocking você conseguirá ter um servidor bem mais seguro do que se apenas modificar a porta que ele utiliza (e que pode ser descoberta facilmente através de um scan). Note também, que você pode utilizar o port knocking junto com a solução de utilizar chaves RSA para realizar o login no SSH melhorando ainda mais a segurança. Assim você pode dormir tranquilo!
Talvez seja necessário fazer algumas modificações no arquivo de configuração. Aqui, tive que corrigir o caminho do “iptables” e também tive que fazer com que a regra que o knockd cria fosse a primeira regra, para aí sim tudo funcionar corretamente.
Conhece algum cliente que suporte o port knocking? Deixe a sua sugestão nos comentários!

Esta obra escrita por Pedro Augusto de Oliveira Pereira está licensiada sob a Creative Commons Atribuição-Uso Não-Comercial-Vedada a Criação de Obras Derivadas 3.0 Brasil License.

Publicando meu perfil no LinkedIn aqui no blog, tenho como objetivo expandir minha rede de contatos profissionais. Me adicione no LinkedIn!

1 comentário
iRedOS: Servidor de e-mails completo em 20 minutos | Pedro Pereira
20|Apr|2010 1[...] SSH port knocking [...]
Deixe seu comentário!