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.502 ]

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


Configuração do servidor



Pacotes:

# aptitude search knock
knockd - small port-knock daemon
knocker - a simple and easy to use TCP security port scanner

No servidor Instalar o knockd e definir as portas de batida do SSH.

# aptitude install knockd

Arquivo principal do knock, onde você vai definir as portas de batida e tempo entre cada batida, veja o padrão de instalação.

/etc/knockd.conf

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

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 9000,8000,7000
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

Editar /etc/default/knockd e deixar as duas linhas seguintes:

START_KNOCKD=1
KNOCKD_OPTS="-i eth0"

Isto define a placa que vai aceitar conexão e manter sempre o knock rodando.

Pronto, aqui acaba a configuração do servidor, mas antes reinicie.

# /etc/init.d/knockd restart

Se não estiver fechada, então feche a porta SSH do firewall pra testar se o serviço funciona. ; )

# iptables -A INPUT -p tcp --dport 22 -j DROP

# iptables -L
DROP       tcp  --  anywhere             anywhere            tcp dpt:ssh

Tente um acesso SSH. Com a porta fechada, assim além de não conseguir o acesso remoto , ainda vai deixar o atacante travado, pois nem resposta ele vai receber, ponto pra você. : )

Página anterior     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

OUTGUESS: Oculte mensagens em fotos

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

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

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

Instalação do Varnish + Apache + Virtual Hosts

Leitura recomendada

Convergência entre segurança física e lógica

Instalar o Nagios 4 no Ubuntu ou Debian

Recuperando senhas de usuários

Deface: A arte de desconfigurar sites

Burlando "MSN Sniffers" com TOR e Gaim

  
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