Le port knocking est une technique réseau qui consiste à déclencher des règles de pare-feu d’ouverture après détection d’une séquence particulière sur un port prévu à cet effet. Voici comment le mettre en place avec un serveur Linux Debian et un client Windows.

Le port-knocking est controversé

Tout d’abord, vous devez savoir que le port knocking est une méthode controversée et parfois mal utilisée. Ce n’est pas une protection forte car elle est souvent utilisée à travers un canal non chiffré, et sensible aux attaques man-in-the-middle (MITM).

Si vous devez auditer la sécurité d’un serveur qui utilise le port knocking, je considère que c’est son état « ouvert » avec port knocking déclenché qui doit être audité.

La vraie sécurité du serveur doit résider dans la configuration des services réseaux et du pare-feu statique, et non pas dans une règle de pare-feu variable. Cela est autant valable pour knockd que fail2ban qui pilote également des règles de pare-feu variables.

En pratique, je pense que le port-knocking est une tactique qui permet de s’affranchir de 99% des attaques par force brute ou par dictionnaire, sur des services d’authentification (comme SSH) ou de bureau à distance (comme RDP). On parle là d’attaques par scripts automatiques, sans intelligence humaine qui commencent par scanner les ports ouverts bêtement. Par contre pour se prémunir contre des hackers, il faudra sécuriser le serveur autrement, et cela commence par l’emploi de mots de passe forts, de logiciels à jour, etc.

On peut voir un point commun entre le port-knocking et la stéganographie, ou art de la dissimulation. L’objectif est que l’attaquant n’ait même pas idée qu’il existe un port à attaquer (pour le port-knocking) ou qu’il existe un message à trouver (pour la stéganographie). Mais rien n’empêche de combiner port-knocking avec politique de sécurité présumée, comme on combine stéganographie avec cryptographie.

Installation et configuration de knockd

Sur Debian le paquet knockd fournit deux binaires, un daemon /usr/sbin/knockd  et un client /usr/bin/knock . Pour que knockd démarre par défaut il faut régler /etc/default/knockd .

La page de manuel est accessible avec man knockd  pour le serveur et man knock  pour le client. Le fichier de configuration serveur est /etc/knockd.conf

Par défaut le daemon utilise syslog mais je préfère configurer un fichier de log à part avec la  ligne logfile = /var/log/knockd.log .

La configuration par défaut ressemblera donc à ceci. A vous de vérifier que les règles de pare-feu fonctionnent dans votre pare-feu en particulier.

Si vous avez instauré une règle iptable stricte où tout ce qui n’est pas précédemment ouvert est explicitement fermé (exemple iptables -A INPUT -i eth0 -j DROP ), alors cela ne fonctionnera pas. Si vous vous contentez d’une politique de rejet implicite (exemple iptables -P INPUT DROP) qui autorise une ouverture postérieure, cela fonctionnera.

Bien entendu il est impensable de conserver la séquence par défaut qui peut s’écrire également 9000:tcp,8000:tcp,7000:tcp . A vous de configurer votre séquence secrète.

Il est intéressant de constater que le service knockd n’ouvre pas les ports de la séquence. Ils peuvent donc rester protégés par le pare-feu sans jamais être ouverts ni même détectables par nmap.

Client knock

Pour déclencher la séquence par défaut il suffira de lancer knock mon.serveur.fr 7000:tcp 8000:tcp 9000:tcp . Le client knock pour Windows existe également. Sur Android on trouve l’application open-source Knock on Ports sur F-Droid ou sur Google Play.

 

Client Knock Windows avec fenêtre de validation

Client Knock Windows avec fenêtre de validation par Deltasight