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.

O que é?

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.

Configurando o 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:

  • UseSyslog: utiliza o syslog para gerar logs;
  • PidFile: define em qual arquivo o daemon irá escrever o seu PID. O formato da opção é “pidfile = /var/run/knockd.pid” (o nome e a localização do arquivo podem ser modificados sem problema algum);
  • Interface: define em qual interface o knockd irá esperar as conexões. Se esta opção não for definida, será utilizado o padrão “eth0″, mas você pode modificar esta opção para que ela se adeque ao seu ambiente. O formato é “interface = eth0″. Note que não é necessário definir o caminho completo para o dispositivo, como /dev/eth0.

Em “[openSSH]” você define as opções para quando o cliente quer se conectar ao servidor:

  • sequence: define qual a sequência de portas nas quais o cliente deve bater para poder se conectar. Além de definir a porta, você também pode definir o protocolo. Por exemplo, 33:tcp define que o protocolo a ser utilizado quando o cliente se conectar na porta 33 deve ser o tcp. Você também pode utilizar o UDP e definir quantas portas quiser;
  • seq_timeout: se a sequência não for completada no tempo especificado nesta opção, o cliente deverá começar novamente. O tempo é especificado em segundos;
  • command: é o comando que será executado assim que a sequência for finalizada corretamente. Por padrão, o knockd cria uma regra no IPTables que libera a porta 22 (neste caso, é essa a porta que estamos utilizando no SSH) apenas para o IP do cliente;
  • tcpflags: nesta opção, você deve definir o flag do pacote que deve estar ativa para que o knockd o considere parte da sequência. Ou seja, se você colocar “syn” aqui, os pacotes da sequência deverão estar com o flag “syn” ativado. As opções são fin, syn, rst, psh, ack, urg.

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.

Configurando o cliente

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.

Conclusão

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!

Compartilhe o post! These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Webnews
  • Digg
  • del.icio.us
  • StumbleUpon
  • Reddit
  • Ask
  • Bloglines
  • email
  • Facebook
  • Furl
  • Google Bookmarks
  • LinkedIn
  • Live-MSN
  • Pownce
  • Print
  • Rec6
  • Slashdot
  • Technorati
  • TwitThis

Posts relacionados:

  • SSH Port Forwarding Muita gente usa o SSH para conseguir acesso a shells...
  • Como matar conexões que aparecem no netstat O netstat é um comando utilizado para obter informações sobre...