knock - controle de acesso SSH - Dicas e indicações.

Atualizado em: 25/09/2006



Sobre este documento

Original em formato texto com marcações para conversão em HTML, processo automatizado com scripts e txt2tags

Minha colinha, linhas de comando para copiar e colar em algumas distribuições.

Cuidado com a segurança, knock é somente mais um item na lista de procedimentos.

Algumas dicas sobre ssh + knock

Com knock seu servidor de ssh fica sempre fechado para o mundo, quando bater na porta certa ele executa a regra de firewall que abre a porta somente para seu IP. Mais uma forma de implementar segurança, o serviço fica fechado para o mundo, abrindo somente para você no momento desejado.

Tomemos como exemplo ssh que é muito utilizado em conexões remotas, muitos utilizam eventualmente mas deixa aberta o tempo todo, estas maquinas recebem milhares de ataques diários. Procure nos logs de sua instalação pelos registros de scanners para ssh, em uma maquina sem knock tenho notado mais de 1000 tentativas diárias.

Como exemplo, segue o resultado de login inválido em uma maquina do dia 1 a 16 de setembro de 2006.

  cat /var/log/messages | grep Invalid | wc -l
  13078

Parte deste log, observe o intevalo de tempo e nomes na tentativa de acertar um usuário, esta lista é grande, são varias listas rodando na net, um dia podem acertar o seu, o melhor é manter a porta fechada impedindo estas tentativas.

cat /var/log/messages | grep Invalid

  --corta--
  Sep 16 16:30:48 linux-speedy sshd[5895]: Invalid user Aaliyah from 200.35.163.41
  Sep 16 16:30:50 linux-speedy sshd[5904]: Invalid user Aaron from 200.35.163.41
  Sep 16 16:30:52 linux-speedy sshd[5934]: Invalid user Aba from 200.35.163.41
  Sep 16 16:30:55 linux-speedy sshd[5936]: Invalid user Abel from 200.35.163.41
  Sep 16 16:30:57 linux-speedy sshd[5938]: Invalid user Jewel from 200.35.163.41
  Sep 16 16:31:02 linux-speedy sshd[5942]: Invalid user users from 200.35.163.41
  Sep 16 16:31:04 linux-speedy sshd[5944]: Invalid user admins from 200.35.163.41
  Sep 16 16:31:07 linux-speedy sshd[5946]: Invalid user admins from 200.35.163.41
  Sep 16 16:31:11 linux-speedy sshd[5948]: Invalid user Zmeu from 200.35.163.41
  Sep 16 16:31:19 linux-speedy sshd[5972]: Invalid user michi from 200.35.163.41
  --corta--

Com knock a porta fica fechada, não permitindo nem tentativas de conexão, para abrir usamos um batedor, uma forma de cliente que vai bater em portas escolhidas por você, sem relação alguma com ssh e somente você sabe quais são. Quando o servidor receber esta seqüência de batidas na porta, ele executa a regra de iptables que abre a porta. Permitindo conexão exclusivamente para o IP do batedor. Vale lembrar que deve fechar a porta assim que entrar, a regra que fecha a porta mantém as conexões existentes, proíbe novas conexões e não aparece nos scanners de rede.

A regra de firewall padrão tem que fechar a porta 22, a abertura será feita no momento que receber as batidas na porta, quando aberta deve mostrar no resultado de iptables -L que abriu a porta somente para o IP do batedor, algo como neste exemplo.

  ACCEPT     tcp  --  192.168.1.211        anywhere            tcp dpt:ssh

Dica, tem comando próprio para fechar a porta, como pode ficar aberta por esquecer de fechar ou outro motivo. Rodar um script no crontab para fechar a porta pode ser muito interessante, não perde tempo como o comando para fechar, o intervalo de tempo e script fica a critério de cada um. Pode até rodar o script de firewall que zera as regras fechando a porta, é muito importante manter a porta fechada, use um escript para fazer isto por você.

  #!/bin/sh
  /etc/rc.d/fireaula.sh

Nâo testei com outras portas como webmin, nem com regras de redirecionamento de VNC. Acho possível como também executar outros comandos em lugar da regra do iptables.

SUSE 10.1 instalar

Tem o rpm da distro para servidor e cliente, é só instalar e alterar a porta para melhorar a segurança. Veja o resultado da pesquisa com smart.

  smart search knoc
  
  knock - A Port-Knocking Client
  knock-debuginfo - A Port-Knocking Client
  knockd - A port-knocking server
  knock - A Port-Knocking Client
  knock-debuginfo - A Port-Knocking Client
  knockd - A Port-Knocking Client
  nc6 - A Port-Knocking Client
  nc6-debuginfo - A Port-Knocking Client

Depois de instalado consulte o manual

   man knockd 
   knockd -h 
   man knock 

knockd em servidor com DUAS eth

Servidor com duas placas de rede, dependendo da rede pode liberar ssh para rede interna e aplicar knock somente na eth que está de cara para o mundo, tudo depende se seu ambiente e regras de firewall.

Instalar servidor " knockd "

  smart install knockd
  chkconfig knockd on
  # Evite usar a configuração padrão. Edite e altere as portas no arquivo de configuração /etc/knockd.conf
  #vi /etc/knockd.conf

Depois de instalado precisa deixar rodando knockd, a seguir exemplo de linha de comando, escolha conforme a placa de rede (eth). A escolha da eth é na linha de comando, a configuração das portas e sequência fica em /etc/knockd.conf.

  knockd -i eth0  -d  -c /etc/knockd.conf 
  
  knockd -i eth1  -d  -c /etc/knockd.conf 

Coloque esta linha no /etc/rc.d/boot.local para executar junto com o boot, ajuste a eth conforme sua instalação

  echo "knockd -i eth0 -d -c /etc/knockd.conf" >> /etc/rc.d/boot.local

Neste exemplo controla somente a eth indicada na linha de comando acima, em micros com duas placas de rede, como exemplo micros que compartilha internet, pode aplicar as regras somente na interface de cara para o mundo e deixar a outra liberada. Portanto ajuste eth? na linha de comando dos exemplos acima, no firewall fica liberada a interface interna e fechada a interface externa, knockd fica responsável pela abertura da interface externa.

knockd servidor com UMA eth

Lado servidor, micro rodando servidor ssh, micro de cara para o mundo que deseja proteção nas conexões via ssh. Neste micro instale o pacote servidor " knockd "

  smart install knockd
  chkconfig knockd on
  # Evite usar a configuração padrão. Edite e altere as portas no arquivo de configuração /etc/knockd.conf
  #vi /etc/knockd.conf
  

Depois de instalado precisa deixar rodando knockd, a seguir exemplo de linha de comando para placa de rede eth0, abrir ou fechar a porta quando baterem nas portas definidas em /etc/knockd.conf

  knockd -i eth0  -d  -c /etc/knockd.conf 

Coloque esta linha no /etc/rc.d/boot.local para executar junto com o boot

  echo "knockd -i eth0 -d -c /etc/knockd.conf" >> /etc/rc.d/boot.local

Neste exemplo controla somente a eth0, em micros com duas placas de rede, como exemplo micros que compartilha internet, pode aplicar as regras somente na interface de cara para o mundo e deixar a outra liberada. Portanto no firewall fica liberada a interface interna e fechada a interface externa, knockd fica responsável pela abertura da interface externa.

Cópia do /etc/knockd.conf

O conf do suse 10.1 falhou, nem procurei pela solução. Usei a cópia do kubuntu e funcionou sem problemas, a seguir copia de /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

knock cliente

Lado cliente, origem da conexão. Neste micro instale o batedor, pacote cliente " knock "

smart install knock

Para conectar via ssh, primeiro tem que bater nas portas, são aquelas que estão configuradas na maquina remota (servidor), ao bater nas portas será executada a regra de iptables que abre a porta 22 permitindo conexão remota via ssh, isto tudo está configurado no lado servidor, tudo isto pode e deve ser alterado para outros valores, fica por conta de sua criatividade.

Em resumo, tem que executar duas linhas de comando, uma para o batedor e outra para conexão, veja um exemplo.

  knock 200.200.200.200 7000:tcp 8000:tcp 9000:tcp
  ou em um script, use sleep para os dois comandos não chegarem junto e falhar o ssh
  knock 192.168.1.203 7000:tcp 8000:tcp 9000:tcp
  sleep 3
  ssh zago@192.168.1.203

Feche a porta assim que entrar, o comando tem o mesmo formato, muda as portas conforme o /etc/knockd.conf

knock 192.168.1.203 9000:tcp 8000:tcp 7000:tcp

Use script com a linha de comando do batedor mais a linha de comando ssh, algo como neste exemplo.

cat sshzago

  #!/bin/sh
  knock 200.200.200.200 1100:tcp 8100:tcp 9800:tcp
  sleep 3
  ssh zago@200.200.200.200

Faça testes, use duas estações da rede interna, caso não tenha um firewall, pode usar este como modelo.

http://www.zago.eti.br/modelos/fireknock.sh

Kubuntu

Kubuntu 6.10 (Edgy Eft)

smart search knock

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

smart install knockd

Arquivos de configuração

  /etc/knockd.conf
  /etc/default/knockd

CL10 - instalar

Não encontrei este pacote no CD de instalação.

Instalar a partir do fonte requer compilador "c" gcc

  apt-get install gcc
  wget "http://www.zeroflux.org/knock/files/knock-0.5.tar.gz"
  #No diretório onde salvou
  tar -xvzf knock-0.5.tar.gz
  cd knock-0.5
  ./configure
  make
  make install

Resultado:

  make retornou varios erros, (ultimas linhas de erro)
  src/knockd.c:1189: error: `DLT_RAW' undeclared (first use in this function)
  src/knockd.c:1245: error: dereferencing pointer to incomplete type
  make: ** [src/knockd.o] Erro 1
  
  make install retornou varios erros, (ultimas linhas de erro)
  src/knockd.c:1187: error: `DLT_LINUX_SLL' undeclared (first use in this function)
  src/knockd.c:1189: error: `DLT_RAW' undeclared (first use in this function)
  src/knockd.c:1245: error: dereferencing pointer to incomplete type
  make: ** [src/knockd.o] Erro 1

Precisa resolver este problema para continuar, nem procurei pela solução porque estou trocando as instalações do CL10.

Regras de iptables

A porta a ser aberta pelo knock precisa ficar fechada no firewall, quem usa politica padrão de fechar tudo, já está fechada e não precisa fazer mais nada. Uma sugestão de regras para ssh (porta 22)

  #$iptables -A INPUT -p tcp --dport 22 -i $EXTERNA -j ACCEPT
  $iptables -A INPUT -p tcp --dport 22 -i $INTERNA -j ACCEPT

Observe a linha da interface externa com o comentário #, coloque aqui somente para mostrar as regras para liberar por interface de rede, sendo uma para rede interna e outra para rede externa, quando comentada não será executada. A regra padrão no meu firewall é fechar tudo e abrir depois, com esta linha comentada não abre a conexão na interface externa. A outra regra libera ssh somente para rede interna.

Algumas regras paleativas, quando não conseguir rodar o knock, pode incluir regras no firewall para liberar acesso especifico para um determinado IP, também pode alterar a porta de 22 para outra, algo como 2222

Exemplo de regra que permite conexão somente com origem no IP 200.204.198.164

/usr/sbin/iptables -A INPUT -s 200.204.198.164 -p tcp --dport 22 -j ACCEPT

Regras para fechar a porta por interface de rede

  iptables -A INPUT -p tcp -i eth0  --dport 22 -j DROP
  iptables -A INPUT -p tcp -i eth0  --dport 22 -j REJECT
  
  fechar tudo.
  iptables -A INPUT -p tcp --dport 22 -j DROP
  
  Passar IP por variável
   iptables -A INPUT -p tcp -s $IP_PERMITIDO1 --dport 22 -j ACCEPT

Indicações

Tutorial com script e dicas para RedHat / Fedora
http://www.Dicas-L.com.br/dicas-l/20060913.php
Mais dicas, FAQ, tutoriais e indicações sobre ssh
http://www.zago.eti.br/ssh/ssh.html

FAQ com mensagens da lista linux-br.
http://www.zago.eti.br/ssh/firewall-controle.txt

Página principal deste site (FAQ)
http://www.zago.eti.br/firewall/A-menu-firewall.html

Página principal deste site (FAQ)
http://www.zago.eti.br/menu.html