iptables : Port Knocking pour ouvrir SSH
Table des matières
Knock Knock Knock ! Connaissez-vous le port knocking ?
Le tocage à la porte, ou port-knocking, est une méthode permettant de modifier le comportement d'un pare-feu (firewall) en temps réel en provoquant l'ouverture de ports permettant la communication, grâce au lancement préalable d'une suite de connexions sur des ports distincts dans le bon ordre, à l'instar d'un code frappé à une porte.
C'est pratique d'un point de vue sécurité pour par exemple toujours fermer le port 22 (SSH) et l'ouvrir quand une séquence est réalisée.
Ci-dessous, voici le script, assez commenté. Vous pouvez l'adapter évidemment.
J'utilise la séquence de port 100 puis 200 puis 300 puis 400.
J'ai défini une limitation avec au maximum 10 secondes pour effectuer les tentatives.
Ce sont des paquets TCP qu'on doit envoyer sur ces ports.
Si on met trop de temps à l'étape 3, il faut repartir depuis le début.
Donc on peut utiliser telnet pour envoyer les paquets :
Ou bien via un navigateur web :
Même si la connexion est refusée, le paquet est envoyé
Introduction
Knock Knock Knock ! Connaissez-vous le port knocking ?
Le tocage à la porte, ou port-knocking, est une méthode permettant de modifier le comportement d'un pare-feu (firewall) en temps réel en provoquant l'ouverture de ports permettant la communication, grâce au lancement préalable d'une suite de connexions sur des ports distincts dans le bon ordre, à l'instar d'un code frappé à une porte.
C'est pratique d'un point de vue sécurité pour par exemple toujours fermer le port 22 (SSH) et l'ouvrir quand une séquence est réalisée.
Ci-dessous, voici le script, assez commenté. Vous pouvez l'adapter évidemment.
Séquence utilisée
J'utilise la séquence de port 100 puis 200 puis 300 puis 400.
J'ai défini une limitation avec au maximum 10 secondes pour effectuer les tentatives.
Ce sont des paquets TCP qu'on doit envoyer sur ces ports.
Si on met trop de temps à l'étape 3, il faut repartir depuis le début.
Donc on peut utiliser telnet pour envoyer les paquets :
Code BASH :
telnet server 100 telnet server 200 telnet server 300 telnet server 400
Ou bien via un navigateur web :
Code BASH :
http://server:100∕ http://server:200∕ http://server:300∕ http://server:400∕
Même si la connexion est refusée, le paquet est envoyé
Le script
Code BASH :
#! /bin/bash ####### Menage avant initialisation # Si pas d'autres scripts avec iptables : iptables -X iptables -F # On nettoie les chaines du code iptables -X INTO-P2 iptables -X INTO-P3 iptables -X INTO-P4 ####### Exclusions SSH sans passer par le code secret ####### #iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 22 -j ACCEPT #iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 22 -j ACCEPT #iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 22 -j ACCEPT ###### Accepter les connexions en cours ####### iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state RELATED -j ACCEPT ####### Etapes du code secret ####### ####### Creation des chaines puis ajout des regles iptables -N INTO-P2 iptables -A INTO-P2 -m recent --name P1 --remove iptables -A INTO-P2 -m recent --name P2 --set iptables -A INTO-P2 -j LOG --log-prefix "INTO P2: " iptables -N INTO-P3 iptables -A INTO-P3 -m recent --name P2 --remove iptables -A INTO-P3 -m recent --name P3 --set iptables -A INTO-P3 -j LOG --log-prefix "INTO P3: " iptables -N INTO-P4 iptables -A INTO-P4 -m recent --name P3 --remove iptables -A INTO-P4 -m recent --name P4 --set iptables -A INTO-P4 -j LOG --log-prefix "INTO P4: " iptables -A INPUT -m recent --update --name P1 ####### Definition du code secret avec le délai pour chaque phase avant expiration. ####### Ici exemple 100 puis 200 puis 300 puis 400. Aléatoire conseillé iptables -A INPUT -p tcp --dport 100 -m recent --name P1 --set iptables -A INPUT -p tcp --dport 200 -m recent --rcheck --seconds 10 --name P1 -j INTO-P2 iptables -A INPUT -p tcp --dport 300 -m recent --rcheck --seconds 10 --name P2 -j INTO-P3 iptables -A INPUT -p tcp --dport 400 -m recent --rcheck --seconds 10 --name P3 -j INTO-P4 ####### Une fois la P4 atteinte, la connexion port SSH dispo. iptables -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 10 --name P4 -j ACCEPT ####### Règle par défaut si tout ce qui est au dessus est pas respecté : port 22 fermé ######## iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j DROP