Pular para o conteúdo

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.
Leonardo MMM cROMADO
Hits: 49.379 Categoria: Linux Subcategoria: Segurança
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Parte 2: 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
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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ê. : )

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
   1. Introdução
   2. Configuração do servidor
   3. Configuração do cliente
   4. Resumo e dicas

Instalação do Varnish + Apache + Virtual Hosts

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

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

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

PHP Server Monitor - Monitore URLs e IPs

VPN com FreeS/WAN

Fundamentos da criptografia assimétrica

Enviando alertas do Snort por SMS

Rede wireless: autenticação em uma rede WPA

SSH: Métodos e ferramentas para invasão

#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!
#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.
#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

Entre na sua conta para comentar.