Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
Knocking on servers doors
Colaboração: Fabio Maximo
Data de Publicação: 13 de Setembro de 2006
Essa dica é muito legal para quem tem servidores remotos e preocupa-se com segurança no SSH. Voce pode fechar todo fluxo na porta 22 e so voce abre quando precisa.
O knock é um daemon que atenta para o que ocorre em certas portas no servidor. Quando alguem "bate" nas portas certas e na ordem certa, um determinado comando é executado.
Importante notar que as portas não estão abertas. O Deamon checa isso a nivel de kernel, portanto um port scan não detecta diferença nenhuma entre uma porta que sera knockada e uma outra qualquer.
Uma vez que o knock tenha sido realizado corretamente, o comando padrao é liberar acesso ssh para o IP que knockou o servidor.
Poder ser adicionados outros comandos e combinacoes de porta.
Obter o programa
$ wget "http://www.zeroflux.org/knock/files/knock-0.5.tar.gz"
Descompactar
$ tar -xvzf knock-0.5.tar.gz
instalar
$ cd knock-0.5 $ ./configure $ make $ make install
Configurar
$ vi /etc/knockd.conf
Ainda configuracao
$ cd /etc/init.d/
O Seguinte script para inicialização foi escrito por Marcio Andréeta - utilizar mas manter a nota de autoria.
$ vi knockd
============================INICIO DO SCRIPT==========================
#!/bin/sh
# Script written by Marcio Luis Barsi Andréeta 04/07/2005
#
# This script starts/stops knockd
# normal UNIX system operation
#
# This file is installed as:
# /etc/rc.d/init.d/knockd
EXECUTABLE=/usr/local/sbin/knockd
# error "description"
error () {
/bin/echo $0: $* 2>&1
exit 1
}
# find the named process(es)
findproc() {
pid=`/bin/ps auxww |
/bin/grep root |
/bin/grep -e "$1\$" |
/bin/grep -v grep |
/bin/awk '{print $2}'`
/bin/echo $pid
}
# for testing purposes only
testproc() {
pid=`/bin/ps auxww |
/bin/grep root |
/bin/grep -e "$1\$" |
/bin/grep -v grep |
/bin/awk '{print $2}'`
/bin/echo $pid
}
# kill the named process(es)
killproc() {
pid=`findproc "$1"`
[ "$pid" != "" ] && kill -TERM $pid
}
# kill the named process(es)
forcedkillproc() {
pid=`findproc "$1"`
[ "$pid" != "" ] && kill -9 $pid
}
# Start/stop knockd
case "$1" in
'start')
/bin/echo -n "Starting knockd..."
# Check if the server is already running.
if [ -n "`findproc "$EXECUTABLE"`" ]; then
/bin/echo "knockd deamon is running."
exit 0
fi
$EXECUTABLE &
/bin/echo "done"
;;
'stop')
/bin/echo -n "Stopping knockd..."
echo `findproc $EXECUTABLE`
if [ -z "`findproc "$EXECUTABLE"`" ]; then
/bin/echo "not running."
exit 0
fi
killproc "$EXECUTABLE"
/bin/echo "done"
;;
*)
/bin/echo "Usage: $0 { start | stop }"
# for testing testing functions
echo "`testproc "$EXECUTABLE"`"
;;
esac
============================FIM DO SCRIPT==========================
Startar o serviço no RedHat / Fedora
``` $ service knockd start
Em outras distros
``` $ /etc/init.d/knockd start
Para que o mesmo starte no boot da maquina vamos adicionar um link no Run
Level 3 - Isso pode mudar de acordo com a distro.
$ cd /etc/rc3.d/ $ ln -s /etc/init.d/knockd S99knockd
Abaixo esta o conteudo do /etc/knockd.conf - Repare que o mesmo é muito simples, dando opcao de configuracao do arquivo de log e os comandos abaixo com as sequiencias de portas na opcao sequence. ==Conteudo do /etc/knockd.conf==
[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
Interessante que se voce quiser montar uma sequencia para outro comando voce pode. Mas se voce tem shell, pra que mais? Em todo caso poderiamos acrescentar:
[wall] sequence = 7001,8001,9001 seq_timeout = 5 command = /usr/bin/wall "TESTE OK" tcpflags = syn
Bem, mas como vamos bater nessa porta?? Simples: De sua estação use o comando knock seguindo a sintaxe / exemplo abaixo:
knock [ip] [portas] $ knock 192.168.0.90 7001 8001 9001
Para os que usam estação Windows, ha um "batedor" para windows, e a sintaxe é a mesma. Da para baixar do seguinte link: http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki
Veja a relação completa dos artigos de Fabio Maximo
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
Opinião dos Leitores
13 Mar 2009, 12:40
Para ter certeza, basta utilizar um sniffer e dar uma olhada.
26 Abr 2007, 16:58
Com telnet não rolou. Acho que tem um tempo certo entre uma e outra para ele identificar.
Knockei tanto apartir do Linux como do Windows e deu certo. Muito bom.
01 Fev 2007, 11:52
O problema é quando uso o TELNET do windows para fazer o knock. eu percebi que o telnet faz 2 "knocks" para um unico comando, e com isso ele falha depois do segundo "stage". O lok do knockd registra sempre 2x o stage 1. Imagino que o stage 2 tb seja registrado 2x gerando a falha na sequencia.
16 Set 2006, 00:19
13 Set 2006, 20:24
telnet 192.168.0.90 9000
telnet 192.168.0.90 8000
telnet 192.168.0.90 7000











