KNOCK + SSH

Knock adiciona uma camada simples e eficaz pra acesso via SSH. Normalmente você deixa a porta do SSH aberta pra conseguir acesso remoto, entretanto recebe inúmeras tentativas de invasão. O knock elimina a necessidade de portas abertas no firewall e só abre se você bater antes numa sequência pré-definida de portas.

[ Hits: 47.511 ]

Por: Leonardo Macedo Cerqueira em 01/02/2008 | Blog: http://devopslab.com.br/


Introdução



Este serviço adiciona uma camada de segurança aos acessos via ssh, ele funciona da seguinte maneira: suponha que seu SSH esteja rodando na porta padrão "22", você como administrador pra ter acesso geralmente a deixa aberta, senão nem você acessa. ; )

Veja um log de tentativas de invasão nesta porta:

# tail -f /var/log/auth.log | grep Failed

Failed none for invalid user alexandre from 192.168.0.144 port 3561 ssh2
Failed keyboard-interactive/pam for invalid user alexandre from 192.168.0.144 port 3561 ssh2
Failed keyboard-interactive/pam for invalid user alexandre from 192.168.0.144 port 3561 ssh2
Failed keyboard-interactive/pam for invalid user alexandre from 192.168.0.144 port 3561 ssh2
Failed password for invalid user alexandre from 192.168.0.144 port 3561 ssh2
Failed none for invalid user fabiana from 192.168.0.144 port 3562 ssh2
Failed keyboard-interactive/pam for invalid user fabiana from 192.168.0.144 port 3562 ssh2
Failed keyboard-interactive/pam for invalid user fabiana from 192.168.0.144 port 3562 ssh2
Failed none for invalid user matrix from 192.168.0.144 port 3563 ssh2
Failed keyboard-interactive/pam for invalid user matrix from 192.168.0.144 port 3563 ssh2
Failed none for invalid user lavoisier from 192.168.0.144 port 3691 ssh2
Failed keyboard-interactive/pam for invalid user lavoisier from 192.168.0.144 port 3691 ssh2
Failed keyboard-interactive/pam for invalid user lavoisier from 192.168.0.144 port 3691 ssh2

Uma hora os cretinos, com testes de força bruta, acertam um usuário, daí mais um servidor invadido para as estatísticas.

Você sabe que se deixar a porta fechada com iptables seria o ideal, entretanto nem você acessaria, o knock abre a porta no firewall pra você, mas se antes você bater numa sequência de portas, exemplo:
  • Seu SSH está na porta 22, fechada com iptables, então para ser aberta você deve bater em outras 3 portas para o knock abrir a 22 somente para o seu ip.

Vamos para parte prática pra finalizar o entendimento e por pra rodar o knock. ; )

    Próxima página

Páginas do artigo
   1. Introdução
   2. Configuração do servidor
   3. Configuração do cliente
   4. Resumo e dicas
Outros artigos deste autor

Discos Virtuais na Amazon WS - Como expandir disco EBS em servidores virtuais Amazon WS

Vsftp - Instalação de um servidor FTP focado em segurança

Instalação do Gitlab e introdução ao Git

Instalação do Varnish + Apache + Virtual Hosts

PHP Server Monitor - Monitore URLs e IPs

Leitura recomendada

Técnicas forenses para identificação da invasão e do invasor em sistemas Unix/Linux através do SSH (parte 1)

Segurança em seu Linux

Cliente Linux no servidor LDAP

Construindo um Log Server utilizando Linux, Unix e Windows

Instalação do Comodo Antivirus para Linux (CAVL) resolvendo o problema de dependências

  
Comentários
[1] Comentário enviado por removido em 01/02/2008 - 10:02h

super interessante! vou testar. Parabéns

[2] Comentário enviado por budbadi em 01/02/2008 - 14:44h

e ae...

o artigo tah muito bom!!
mas me gerou uma certa duvida.....

se eu quiser acessar esse servidor SSH só vai ser possivel pelo linux?!

ou existente algo como o knockd para o windows?????

vlw !
abraços!

[3] Comentário enviado por azzarado em 01/02/2008 - 14:53h

Não testei, mas aqui promete clientes para windows e mac:

http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki

Vlw!

[4] Comentário enviado por cromado em 01/02/2008 - 15:24h

Valeu pelo Link azzarado , o programa que tem lá serve sim , vou explicar como faz no Windows.

baixe o knock para o windows pegue no link que o azarrado passou.

http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki

pegue este aqui:
Cygwin/Win32 Knock Client

Descompacte em qualquer pasta do windows , e pelo prompt do Windows (execute cmd), vá para a pasta descompactada , onde está o executável knock .agora apenas execute como vc faria no Linux.

C:...> knock 192.168.0.206 7000:tcp 8000:tcp 9000:tcp

pronto! as postas se abriram ;),pode acompanhar o log no Linux pra ver:

#tail -f /var/log/knockd.log

agora se logue via ssh numa boa.

Pra não ficar indo pro diretório do knock toda vez que precisar , vc pode colocar o caminho do knock no PATH do windows.

Dica : testem com as portas padrões , más na prática utilize portas próprias.

é isso aí.

[5] Comentário enviado por agk em 02/02/2008 - 00:16h

Interessante, parabéns!
Não monitorei pra ter certeza, mas o kockd deve ser acionado quando encontra pacotes com a flag SYN/ACK, acho que se usar o telnet do Windows pra bater nas porta também deve funcionar.


[6] Comentário enviado por jotahreggae em 03/02/2008 - 08:30h

Uma certa vez eu vi um artigo parecedi, mas nao lembrava como o autor tinha implementado essa solucao.
Porem, eu me lembro dele nao usar um programa para abrir as portas, e sim executar, ou um telnet, ou uma requisicao ssh mesmo nas portas para elas se abrirem. Sabe se tem outro modo para executar. Por exemplo.
Tenho meu servidor bloqueado com o knock...preciso acessa-lo de casa..instalo o knock....preciso acessa-lo do servico.....instalo o knock....e se estiver em outro lugar, num cliente...ai baixo o knock e executo para depois acessar...meio frustrante nesse ponto somente.

obrigado pela contribuicao com todos e ate mais

[7] Comentário enviado por cromado em 03/02/2008 - 10:32h

jotahreggae vc está certo ;) , não precisa necessariamente usar o knock pra bater nas portas , basta vc usar o telnet pra fazer isso , pois como o agk falou , o knock assim como o telnet usam pacotes SYN/ACT pra abrirem conexão.

$telnet 192.168.0.100 7000
$telnet 192.168.0.100 8000
$telnet 192.168.0.100 9000

flw

obs:bater com o telnet do Linux funcionou , más o do Windows apenas bate em duas portas , e na 3° vez fica parado... daí configurei o knockd pra usar 2 portas apenas , e aí sim o telnet do Windows funcionou...agora por que o Windows não bate nas 3 portas eu não sei =( ??? .

[8] Comentário enviado por nazareth87 em 04/02/2008 - 15:00h

Fiz conforme o procedimento acima, mas não está conectando o usuário, no log do knockd.log informa q abriu mas não consigo conectar. (Debian Lenny AMD64)

[9] Comentário enviado por cromado em 04/02/2008 - 15:17h

nazareth87

Vai ser logado apenas o IP do usuário no knockd.log , o usuário vc pode ver no /var/log/syslog .
Agora se seu knockd logou com sucesso todas batidas e abriu a porta pro SSH conforme o log:

192.168.0.155: openSSH: Stage 1
192.168.0.155: openSSH: Stage 2
192.168.0.155: openSSH: Stage 3
192.168.0.155: openSSH: OPEN SESAME
openSSH: running command: /sbin/iptables -A INPUT -s 192.168.0.144 -p tcp --dport 22 -j ACCEPT

Então o problema é no SSH , pois o objetivo do knockd está cumprido com sucesso ;).
Vc tem o mesmo usuário criado tanto no servidor quanto no cliente?será que seu SSH não está com alguma restrição para usuário?(como por ip , password , usuario ... sei lá)
blz

[10] Comentário enviado por nazareth87 em 04/02/2008 - 23:42h

somente consegui fazer funcionar alterando assim o /etc/knockd.conf

[options]
logfile = /var/log/knockd.log

[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -F
tcpflags = syn

[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -A INPUT -p tcp --dport 22 -j DROP
tcpflags = syn

Deve ser algum problema de configuração do iptables, etc.

[11] Comentário enviado por nazareth87 em 04/02/2008 - 23:43h

ou ainda do Debian Lenny AMD64

[12] Comentário enviado por walber em 06/02/2008 - 10:11h

Legal o artigo, + quando adicionando a regra no iptables para fechar a porta 22 e uso knock para bater as portas e consecutivamente a porta não abre pois ficam duas regras uma drop e uma accept e sendo assim não funciona pois quando bater com knock ele deveria apagar a regra do drop e adicionar a do accept + não ele fica com as duas regras,e quando for fechar ele deverá fechar novamente a porta add dinovo a regra drop.

Como faço para resolver esse problema?

Já tentei add um novo comando no arquivo de configuração do knockd para após bater as portas e abrir ele limpar todas as regras + não funfou.


Se alguém pode me ajudar.

Valeu ...

[13] Comentário enviado por cROMADO em 06/02/2008 - 11:24h

Realmente wdi , as regras nesta ordem acaba bloqueando o acesso , más tem solução , no arquivo /etc/knockd.conf deixe a linha que abre a porta assim:

command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Apenas mude o "A".
O Parametro "I" coloca a regra em primeiro , permitindo o acesso SSH , com isso a saída do comando iptables , após abrir a porta ,ficaria assim:

#iptables -L

Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.0.144 anywhere tcp dpt:ssh
DROP tcp -- anywhere anywhere tcp dpt:ssh


[14] Comentário enviado por walber em 06/02/2008 - 15:09h

Deve ser isso msm, vou testar assim q chegar em ksa.


valeu!!!

[15] Comentário enviado por agk em 07/02/2008 - 00:02h

Pois é, não consegui fazer funcionar por telnet, mas com o knock client funciona que é uma blz e já protege um pouco contra os brute force que tem por ae.

Se você tem um firewall statefull (controla os pacotes por estado), pode fazer assim:
[opencloseSSH]
sequence = 2222:udp,3333:udp,4444:udp
seq_timeout = 15
tcpflags = syn,ack
start_command = /sbin/iptables -A INPUT -s %IP% -p tcp --syn --dport 22 -j ACCEPT
cmd_timeout = 30
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --syn --dport 22 -j ACCEPT

Depois de colocar a sequência você tem 30 segundos para estabelecer uma conexão ssh, depois a regra é removida do iptables e novas conexões não são mais possíveis, isso é bom, pois quando você conectar remotamente com seu servidor após 30 segundos a porta ssh vai estar fechada novamente, e você vai permanecer conectado até encerre sua sessão atual.

Não precisa se preocupar em dar o comando para fechar novamente o seu firewall.

[16] Comentário enviado por gnu em 07/02/2008 - 11:28h

Postei algo parecido algum tempo atrás. Mas usando o iptables mesmo. Deve ser isso que jotahreggae viu : http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=4048

[17] Comentário enviado por cytron em 15/02/2008 - 18:26h

agk, mandou bem!!!

Essa é uma preocupação que surge no admin, deixar o ssh aberto enquanto está conectado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts