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