IPtable – Le port Knocking

img_coffre
Amis internaute bien le bonjour ;:o°)

J’en parlais jeudi dernier avec … (aucune mémoire des prénoms c’est horrible), donc voici une rapide petite astuce, au cas où le monde merveilleux d’IPtable vous soit inconnu, et que vous soyez un maniaque de la sécurité (ou comptez le devenir lol). Je me base sur un système Debian (comme d’hab) pour les noms de fichiers, et les numéros de port (à part les standards) sont pris au hasard, vous pouvz très bien les changer par d’autres non utilisés par un autre service..

Vous pouvez réaliser un Port Knocking sur le port SSH (22 si vous n’avez pas personnalisé celui-ci pour plus de CQ).

(Pas vraiment pour les débutants en soit, un minimum de connaissance sont requises ici.)

NE PAS TESTER SUR UN SERVEUR DE PROD SANS AVOIR TESTER QUE CELA FONCTIONNE COMME VOUS LE DÉSIREZ AVANT !

VOUS DEVEZ ÉGALEMENT TESTER CECI AVEC VOS RÉGLAGES ET VÉRIFIER QUE LE MODULE RECENT EST DANS VOTRE KERNEL POUR IPTABLES.

Je part du principe que:

- vous n’avez pas toucher aux règles (ou alors très bien géré celle-ci et savez adapter le tuto à celles-ci), et ne m’attarderais donc pas plus sur la base (se serait trop long, voir le tuto linké plus haut), et que vous avez le module “recent” d’installé.
- si vous avez changer la politique de DROP c’est donc en gérant finement l’ouverture des ports pour permettre aux services spécifiques de fonctionner correctement (apapche, mail, ftp, etc…) et pas en laissant tout en Open Bar ;:0)

Je présume également que vous avez paramétré le fichier de configuration sshd sur 30s comme fenêtre d’identification au lieu 300, désactivé l’autorisation de connexion root et créer un utilisateur spécifique avec les droits de connexion SSH et un mot de passe “solide”.

Je vous propose (fortement) de tester ceci sur un serveur de test à disposition (sur une machine virtuelle par exemple) pour ne pas “tordre” votre liaison SSH.

Le but est mettre une porte verrouillée devant le port SSH avec une série de clefs spéciales pour l’ouvrir.

En premier lieu:

Nous allons créer nos ip chain (3 pour être exacte).

Je suppose ici que la première étape est la connexion initiale (nous nommerons les étapes “Step” pour une meilleure compréhension du script).

iptables -N Step2
iptables -N Step3
iptables -N Step4

Ensuite nous utilisons m recent pour régler et supprimer les clefs que nous allons utiliser à chaque étape:

iptables -A Step2 -m recent --name KEY1 --remove
iptables -A Step2 -m recent --set --name KEY2 --set
iptables -A Step3 -m recent -- name KEY2 --remove
iptables -A Step3 -m recent --set --name KEY3
iptables -A Step4 -m recent --name KEY3 --remove

Maintenant nous pouvons commencer à écrire les règles que nous allons utiliser:

Tout d’abord, nous allons fermer le port SSH si le terminal envoie une requête de type END, et supprimer également la clef:

iptables -A INPUT -p TCP --dport ssh --tcp-flags FIN FIN -m recent --rcheck --name KEY3 -j Step4

Ici nous initialisons depuis l’étape 1 (step1) jusqu’a ce que le serveur reçoive un icmp echo-request:
(je présume que vous désirez contacter le serveur)

Pour contactez votre serveur c’est donc avec un ping sur votre IP.

iptables -A INPUT -p ICMP --icmp-type echo-request -m recent -set --name KEY1

Cela va positionner la clef sur KEY1.

Ensuite vous devez essayer de contacter le serveur sur le port 1503 (1ère étape du knocking pour s’assurer que se soit bien vous, et contacter le serveur sur le port spécifique)si c’est le cas nous allons signifier à IPtable de passer à l’étape suivante:

iptables -A INPUT -p TCP --dport 1503 -m recent --rcheck KEY1 -j Step2

et vérifier si la clef KEY1 est déjà paramétrée.

Maintenant pour ouvrir le deuxième verrou nous devons contacter le port 2504 (avec nmap , telnet, ou l’outil de votre choix), et nous allons le dire à iptable: (et également vérifier que la clef KEY2 est paramétrée)

iptables -A INPUT -p TCP --dport 2504 -m recent --rcheck --name KEY2 -j Step3

cela va paramétrer m recent avec la clef KEY3.

Maintenant vous pouvez contacter le serveur ssh avec une commande shell standard.

Nous allons signifié à iptables d’ouvrir le port SSH si la requête est faite et la clef KEY3 également paramétré.

iptables -A INPUT -p TCP --dport ssh -m recent --rcheck --name KEY3 -j ACCEPT

Et vous serez donc à même de pouvoir entrer sur votre serveur.

Nous pouvons pousser la restriction jusqu’à n’autoriser qu’une pool d’IP spécifique, un temps maximum autorisé entre chaque étape du déverrouillage, etc …

Ce mini tuto est juste là pour vous démontrer qu’il est possible de sécuriser efficacement et simplement un serveur avec une bonne connaissance de la gestion des iptables. Vous n’avez pas besoins en soit de logiciel ou autres gadjets spécifiques, juste une bonne connaissance du protocole TCP-IP.

Maintenant que c’est dit, je peux également dire qu’il existe des logiciels efficaces comme fail2ban ou bastille-unix. A chacun sa façon de voir les choses et ses capacité de gestion de serveur.

Donc, revenons à nos moutons.
Le script pour paramétrer les iptables de votre port knocking serait:

iptables -N Step2
iptables -N Step3
iptables -N Step4
iptables -A Step2 -m recent --name KEY1 --remove
iptables -A Step2 -m recent --set --name KEY2 --set
iptables -A Step3 -m recent -- name KEY2 --remove
iptables -A Step3 -m recent --set --name KEY3
iptables -A Step4 -m recent --name KEY3 --remove
iptables -A INPUT -p TCP --dport ssh --tcp-flags FIN FIN -m recent --rcheck --name KEY3 -j Step4
iptables -A INPUT -p ICMP --icmp-type echo-request -m recent -set --name KEY1
iptables -A INPUT -p TCP --dport 1503 -m recent --rcheck KEY1 -j Step2
iptables -A INPUT -p TCP --dport 2054 -m recent --rcheck --name KEY2 -j Step3
iptables -A INPUT -p TCP --dport ssh -m recent --rcheck --name KEY3 -j ACCEPT

et pour la connexion (avec nmap par exemple):

ping IP_of_the_server
nmap -p 1503 --host_timeout=2500 IP_du_serveur
nmap -p 2504 --host_timeout=2500 IP_du_serveur
ssh -l login@domain IP_du_serveur
su -

je suis ouvert à toutes suggestions, et commentaires   ;:o°)

Librement votre.

Cali

Vus : 1576
Publié par StephZ : 111