sécurité port
Port Knocking
cet article est un reminder de l'article traitant du Port Knocking de GNU/Linux Mag / France n°110 (nov 2008)
Le port knocking est une copie du concept de digicode appliqué aux ports d'une machine. Concrètement, une machine dont on veut protéger l'accès d'un service, par exemple le SSH, aura le port tcp/22 de bloqué avec iptables
. Pour l'ouvrir à un client (une IP) donné, il faudra que le client fasse un séquence précise de tentatives de connexion sur d'autres port (par exemple dans notre cas les ports tcp 403 puis 404 puis 400 puis 405). Le serveur va ensuite ouvrir le port du service à l'IP qui a fait le bon “code”, et le client pourra se connecté.
EDIT : Je viens de tomber sur un article de pastoutafait.org décrivant l'installation de knockd, un programme qui automatise la technique de port knocking.
Exemple pratique
La séquence de port (le “code”) : tcp/403, 404, 400, 405 puis accès SSH sur port 22.
NB il faut au préalable mettre l'action par défaut de la table INPUT à BLOCK :
iptables -P INPUT DROP
Gaffe à ne pas se couper la patte !
# création des chaines iptables --new-chain chaine1 iptables --append chaine1 -m recent --name listePort404 --set iptables --append chaine1 -m recent --name listePort403 --remove iptables --new-chain chaine2 iptables --append chaine2 -m recent --name listePort400 --set iptables --append chaine2 -m recent --name listePort404 --remove iptables --new-chain chaine3 iptables --append chaine3 -m recent --name listePort400 --set iptables --append chaine3 -m recent --name listePort405 --remove iptables --append INPUT -p tcp --dport 403 -m recent --name listePort403 --set iptables --append INPUT -p tcp --dport 404 -m recent --name listePort403 --rcheck --jump chaine1 iptables --append INPUT -p tcp --dport 400 -m recent --name listePort404 --rcheck --jump chaine2 iptables --append INPUT -p tcp --dport 405 -m recent --name listePort400 --rcheck --jump chaine3 iptables --append INPUT -p tcp --dport 22 -m recent --name listePort405 --rcheck --second 10 --jump ACCEPT
Et voici un script pour tester le bon fonctionnement du dispositif (coté client bien sur) :
#!/bin/sh ipServeur="192.168.0.1" port="22" listePorts="403 404 400 405" # pour montrer que le port SSH est bien fermé # -PN pour auter la phase de découverte de nmap nmap -PN -p $port $ipServeur # knock knock for unPort in $listePorts do # -w 1 = timeout d'une seconde nc -w 1 ipServeur $unPort done # maintenant le port $port est ouvert ! nmap -PN -p $port $ipServeur