terça-feira, 26 de fevereiro de 2019

SEGURANÇA EM SERVIDORES LINUX: PORT KNOKING



Nesse artigo vou mostrar a técnica do port knocking e como o mesmo é configurado por meio do iptables de maneira fácil e simples permitindo aplicar uma camada a mais de segurança na utilização de algum serviço remoto. Foi escolhido o serviço do SSH para os testes tendo em vista que é amplamente usado quando se quer fazer o gerenciamento remoto de um servidor.

Port knocking é uma técnica usada para proteger serviços de rede que devem ser acessíveis a partir da Internet pública, mas não são destinados ao uso público. Ele funciona bloqueando o acesso ao serviço, a menos que o cliente primeiro "bata" enviando uma pequena seqüência de pacotes para um determinado conjunto de portas em uma ordem específica. O conteúdo dos pacotes não é importante.

Há duas formas de usar essa técnica: através do daemon knockd ou iptables, como já foi mencionado no início.

Os módulos netfilter incluídos no kernel Linux padrão não fornecem suporte direto para o knock de porta, mas contêm todos os blocos de construção necessários para implementá-lo. O mais importante deles é o módulo recent, que tem a capacidade de:


  • manter uma lista de pacotes recentes que satisfaçam uma determinada condição

  • tomar decisões consoante o número de pacotes gravados de um determinado endereço de origem esteja acima ou abaixo de um determinado limiar.

Qualquer número de listas separadas e nomeadas pode ser mantido. Neste caso, haverá três:




Com essa linha de raciocínio, o script, no servidor ficará:

#!/bin/sh

iptables -F
iptables -X
iptables -Z

iptables -N STATE0
iptables -A STATE0 -p udp --dport 12345 -m recent --name KNOCK1 --set -j DROP
iptables -A STATE0 -j DROP

iptables -N STATE1
iptables -A STATE1 -m recent --name KNOCK1 --remove
iptables -A STATE1 -p udp --dport 23456 -m recent --name KNOCK2 --set -j DROP
iptables -A STATE1 -j STATE0

iptables -N STATE2
iptables -A STATE2 -m recent --name KNOCK2 --remove
iptables -A STATE2 -p udp --dport 34567 -m recent --name KNOCK3 --set -j DROP
iptables -A STATE2 -j STATE0

iptables -N STATE3
iptables -A STATE3 -m recent --name KNOCK3 --remove
iptables -A STATE3 -p tcp --dport 22 -j ACCEPT
iptables -A STATE3 -j STATE0

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


iptables -A INPUT -m recent --name KNOCK3 --rcheck -j STATE3
iptables -A INPUT -m recent --name KNOCK2 --rcheck -j STATE2
iptables -A INPUT -m recent --name KNOCK1 --rcheck -j STATE1
iptables -A INPUT -j STATE0

Dessa forma usei as portas 7000, 8000 e 9000, com o protocolo UDP para configurar a sequencia das batidas. Numa máquina cliente, execute o script abaixo:

#!/bin/sh

echo -n "*" | nc -q1 -u $1 7000
echo -n "*" | nc -q1 -u $1 8000
echo -n "*" | nc -q1 -u $1 9000
ssh suporte@$1

Perceba que o "$1" refere-se ao IP passado como parâmetro na execução do script no terminal: ./script <IPDOSEVIDOR>.

Caso tenha ficado com alguma dúvida dos comandos utilizados e queira se aprofundar mais no assunto de iptables, recomendo o curso Iptables - O Firewall do Linux que dará uma boa base como montar scripts de firewall com regras bem definidas e úteis como conceitos de redes a análise de dados. Vale muito a pena adquirir o curso pois vai agregar bastante valor.

Até a próximo artigo pessoal!

Nenhum comentário:

Postar um comentário