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: 46.984 ]

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


Resumo e dicas



Distribuição Debian 4.0. Instalação padrão do SSH, sem nenhuma modificação.

Este tutorial funciona pra qualquer distribuição, os arquivos são os mesmos, bastando você procurar os pacotes pro seu sistema operacional.

Resumo

SERVIDOR:

Instalar o knockd e editar as portas e interface padrão de acesso.

/etc/knockd.conf
/etc/default/knockd CLIENTE:

Instalar o knockd.

$ knock 192.168.0.144 7000:tcp 8000:tcp 9000:tcp
$ ssh usuario@192.168.0.144


Fechar portas:

$ knock 192.168.0.144 9000:tcp 8000:tcp 7000:tcp

Se quiser se aprofundar em segurança e administração de servidores, conheça os cursos da AS2MWPC, acesse:
ou www.wpc.com.br. Profissionais com experiência e certificados.

Leonardo Macedo.

abç.

Página anterior    

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

Instalação do Varnish + Apache + Virtual Hosts

OUTGUESS: Oculte mensagens em fotos

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

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

PHP Server Monitor - Monitore URLs e IPs

Leitura recomendada

Malware, Vírus e Hacking. Estamos seguros usando Linux?

Servidor de logs em Debian Linux

Snort em modo defensivo com Flex Response 2

Single Honeypot

Introdução ao Conceito de Hardening

  
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