13/05/2024

Configuration du Port Knocking SSH

Nous allons ici voir le concept et la mise en place du Port-Knocking. Une barrière de sécurité qui peut être mise en place le plus souvent sur des ports et des accès SSH mais qui peut s’effectuer sur tous les ports d'une machine. Le plus souvent il s’agit tout de même de ports permettant un accès administratif à une machine (SSH, RDP, TELNET, etc.) qui sont, par définition, plus critiques que les ports et services "standards".

I. Qu’est-ce que le port knocking ?

Concrètement, le port knocking permet d’ouvrir et de fermer les ports d’une machine de façon dynamique. L’un des principaux dangers lors de la mise en place d’un accès SSH est qu’un pirate le repère (via un scan de port ou une écoute du réseau par exemple) et tente d’y accéder via brute force. La protection la plus efficace serait alors de faire croire au pirate que le port est fermé et donc que le SSH n’est pas une fonctionnalité présente sur le serveur qu’il vise. Cela est possible via le port-knocking.

Clairement, on va ouvrir un port (ici SSH) sur le serveur seulement quand celui-ci aura reçu une séquence bien précise de signaux sur des ports définis à l’avance.

Par exemple on va déterminer que le serveur ouvrira le port SSH pour une durée de 20 secondes seulement lorsque l’on enverra un signal sur les ports 2005 puis 1905 puis 3005 du poste. Le port SSH se fermera ensuite automatiquement, ne gardant ainsi que la connexion établie lors du laps de temps d’ouverture du port.

On reconnaît ici le mécanisme plus réel du "toc toc toc" sur une porte qui indique à la personne qui se trouve derrière la porte qu’il faut l’ouvrir. Les séquences précisées peuvent donc se rapprocher d’une façon ou d’un rythme de nos "toc" sur le serveur qui indique que nous connaissons "le code" et que nous ne sommes pas un intrus quelconque :
port-knocking-ssh-01

II. Installation du démon knockd

On part ici sur une illustration du port-knocking sur deux machines Debian 7 virtualisées, l’une fera office de client et l’autre de serveur. Installons d'abord l'outil "knockd" :

apt-get install knockd

III. Configuration du port knocking avec knockd

On se rend ensuite dans le fichier "/etc/knockd.conf". Notons que l’on peut avoir plusieurs fichiers de configuration et que l’on peut spécifier lequel utiliser via une option de la commande de lancement. Par défaut, ce sera celui utilisé :

[ouvrir_SSH]
sequence = 2005,1905,3005
seq_timeout = 20 command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
[fermer_SSH]
sequence = 3005,1905,2005
seq_timeout = 20
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn

 On précise donc dans notre premier bloc que la séquence qui l’activera sera un ensemble de signaux "syn" sur les ports 2005 puis 1905 puis 3005 (l’ordre importe, nous verrons plus tard pourquoi). Une fois ce signal détecté, le démon "knockd" lancera la commande "command" qui ici ouvre le port pour le SSH dans les règles iptables. La séquence doit s’effectuer en 20 secondes.

Note : Il faut bien sûr qu’auparavant, votre serveur ait fermé tous les ports inutilisés. Plus simplement avec la commande "iptables -P INPUT DROP" qui aura pour effet de fermer tous les ports en entrée. Soyez tout de même vigilant avec cette commande si vous ne voulez pas vous couper votre propre accès.

Une fois que nous avons fini notre accès SSH, nous pouvons fermer le port en envoyant la séquence inverse (que nous aurions pu configurer autrement d’ailleurs). Une deuxième configuration souvent utilisée est celle-ci :

[SSH]
sequence = 2005,1905,3005
seq_timeout = 20 tcpflags = syn
start_command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 10
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Ici, on ouvre le port pour une durée déterminée et il se ferme automatiquement ensuite (le délai est précisé dans "cmd_timeout" qui amène à terme à la "stop_command"), ce qui est plus sûr car on évite ainsi d’oublier de refermer le port SSH.

Nous allons ensuite lancer le démon pour effectuer un premier essai. Il s’agit ici d’un exemple de configuration, l’outil permet de faire des configurations et des actions selon notre volonté et ne se contente pas au maniement des règles iptables.

knockd

Pour lancer l’outil en tant que démon (en arrière-plan, on utilisera l’option "-d")

knockd -d

VI. Accès et utilisation en tant que client

On va donc ensuite faire un premier test de connexion SSH :

Note : Ajustez l’IP du serveur selon votre contexte ainsi que l’utilisateur si besoin.

On voit que la connexion n’aboutit pas et pour cause, le port SSH est toujours fermé. Il nous faut maintenant un client pour aller "toquer" sur notre serveur. On installe également "knockd" qui comporte un client que nous pourrons utiliser :

apt-get install knockd

 On utilise ensuite le client "knock" :

knock 192.168.19.130 -v 2005 1905 3005

Côté serveur, on pourra alors vérifier qu’une ligne supplémentaire est présente dans nos règles iptables :

iptables -L

port-knocking-ssh-02

Après l’envoi de notre séquence, nous aurons donc 20 secondes pour établir notre connexion SSH. Selon la configuration choisie, il faudra penser à refermer le port SSH de notre serveur.

V. Moyen d’attaque (théorie)

Bien que le port knocking constitue une  barrière supplémentaire face à un attaquant ainsi qu’un élément de dissimulation intéressant, il peut être attaqué. Si l’on imagine que l’attaquant écoute les communications en entrées et sorties de notre serveur sur le réseau, il peut saisir la séquence qui amène à l’ouverture du port SSH et ainsi la rejouer au besoin. C’est une attaque plus complexe qu’un simple brute-force sur le port SSH mais qui est toutefois réalisable dans une mesure raisonnable et qui est donc à prendre en compte.

author avatar
Mickael Dorigny Co-founder
Co-fondateur d'IT-Connect.fr. Auditeur/Pentester chez Orange Cyberdéfense.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail