Comment utiliser Port Knocking sur Linux (et pourquoi vous ne devriez pas)

Le cliquetis de port est un moyen de sécuriser un serveur en fermant les ports du pare-feu, même ceux dont vous savez qu’ils seront utilisés. Ces ports sont ouverts à la demande si – et seulement si – la demande de connexion fournit le coup secret.

Frapper au port est un «coup secret»

Dans les années 1920, quand interdiction était en plein essor, si vous vouliez entrer dans un speakeasy, vous deviez connaître le coup secret et le taper correctement pour entrer.

Frapper au port est un équivalent moderne. Si vous souhaitez que les utilisateurs aient accès aux services sur votre ordinateur, mais que vous ne souhaitez pas ouvrir votre pare-feu à Internet, vous pouvez utiliser le cliquetis de port. Il vous permet de fermer les ports de votre pare-feu qui autorisent les connexions entrantes et de les ouvrir automatiquement lorsqu’un modèle prédéfini de tentatives de connexion est effectué. La séquence des tentatives de connexion agit comme un coup secret. Un autre coup secret ferme le port.

Frapper au port est une nouveauté, mais il est important de savoir que c’est un exemple de la sécurité par l’obscurité, et ce concept est fondamentalement défectueux. Le secret de l’accès à un système est sûr car seuls les membres d’un groupe spécifique le savent. Mais une fois que ce secret est dévoilé – soit parce qu’il est révélé, observé, deviné ou élaboré – votre sécurité est nulle. Il vaut mieux sécuriser votre serveur par d’autres moyens plus puissants, comme exiger des connexions basées sur des clés pour un serveur SSH.

Les approches les plus robustes de la cybersécurité sont multicouches, donc le cliquetis de port devrait peut-être être l’une de ces couches. Plus il y a de couches, mieux c’est, non? Cependant, vous pourriez soutenir que le cliquetis de port n’ajoute pas grand-chose (voire rien) à un système correctement durci et sécurisé.

La cybersécurité est un sujet vaste et compliqué, mais vous ne devriez pas utiliser le port cogné comme seule forme de défense.

Installation de knockd

Pour démontrer le cliquetis de port, nous allons l’utiliser pour contrôler le port 22, qui est le port SSH. Nous utiliserons un outil appelé knockd. Utilisez apt-get pour installer ce paquet sur votre système si vous utilisez Ubuntu ou une autre distribution basée sur Debian. Sur les autres distributions Linux, utilisez plutôt l’outil de gestion des packages de votre distribution Linux.

Tapez ce qui suit:

sudo apt-get install knockd

Vous avez probablement déjà le pare-feu iptables installé sur votre système, mais vous devrez peut-être installer le package iptables-persistent. Il gère le chargement automatique des règles iptables enregistrées.

Tapez ce qui suit pour l’installer:

sudo apt-get install iptables-persistent

Lorsque l’écran de configuration IPV4 apparaît, appuyez sur la barre d’espace pour accepter l’option «Oui».

Appuyez sur la barre d'espace pour accepter

Appuyez à nouveau sur la barre d’espace dans l’écran de configuration IPv6 pour accepter l’option «Oui» et continuer.

Appuyez sur la barre d'espace pour accepter

La commande suivante indique à iptables d’autoriser la poursuite des connexions établies et en cours. Nous allons maintenant émettre une autre commande pour fermer le port SSH.

  Comment changer la langue dans Chrome

Si quelqu’un est connecté par SSH lorsque nous émettons cette commande, nous ne voulons pas qu’il soit coupé:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Cette commande ajoute une règle au pare-feu, qui dit:

-A: ajoutez la règle au tableau des règles de pare-feu. Autrement dit, ajoutez-le au bas.
INPUT: Il s’agit d’une règle concernant les connexions entrantes.
-m conntrack: les règles de pare-feu agissent sur le trafic réseau (paquets) qui correspondent aux critères de la règle. Le paramètre -m oblige iptables à utiliser des modules de correspondance de paquets supplémentaires – dans ce cas, celui appelé conntrack fonctionne avec les capacités de suivi de connexion réseau du noyau.
–Cstate ESTABLISHED, RELATED: Ceci spécifie le type de connexion auquel la règle s’appliquera, à savoir les connexions ESTABLISHED et RELATED. Une connexion établie est déjà en cours. Une connexion associée est une connexion établie en raison d’une action à partir d’une connexion établie. Peut-être que quelqu’un qui est connecté veut télécharger un fichier; cela peut se produire sur une nouvelle connexion initiée par l’hôte.
-j ACCEPT: si le trafic correspond à la règle, passez à la cible ACCEPT dans le pare-feu. En d’autres termes, le trafic est accepté et autorisé à traverser le pare-feu.

Nous pouvons maintenant émettre la commande pour fermer le port:

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

Cette commande ajoute une règle au pare-feu, qui dit:

-A: Ajoutez la règle au tableau des règles de pare-feu, c’est-à-dire ajoutez-la en bas.
INPUT: Cette règle concerne les connexions entrantes.
-p tcp: cette règle s’applique au trafic qui utilise le protocole de contrôle de transmission.
–Dport 22: cette règle s’applique spécifiquement au trafic TCP qui cible le port 22 (le port SSH).
-j REJECT: si le trafic correspond à la règle, passez à la cible REJECT dans le pare-feu. Donc, si le trafic est rejeté, il n’est pas autorisé à travers le pare-feu.

Nous devons démarrer le démon netfilter-persistent. Nous pouvons le faire avec cette commande:

sudo systemctl start netfilter-persistent

Nous voulons que netfilter-persistent passe un cycle de sauvegarde et de rechargement, donc il charge et contrôle les règles iptable.

Tapez les commandes suivantes:

sudo netfilter-persistent save

sudo netfilter-persistent reload

Vous avez maintenant installé les utilitaires et le port SSH est fermé (avec un peu de chance, sans interrompre la connexion de qui que ce soit). Maintenant, il est temps de configurer le coup secret.

Configurer knockd

Il y a deux fichiers que vous éditez pour configurer knockd. Le premier est le fichier de configuration knockd suivant:

sudo gedit /etc/knockd.conf

L’éditeur gedit s’ouvre avec le fichier de configuration knockd chargé.

Le fichier de configuration knockd dans l'éditeur gedit.

Nous éditerons ce fichier en fonction de nos besoins. Les sections qui nous intéressent sont «openSSH» et «closeSSH». Les quatre entrées suivantes se trouvent dans chaque section:

séquence: séquence de ports auxquels une personne doit accéder pour ouvrir ou fermer le port 22. Les ports par défaut sont 7000, 8000 et 9000 pour l’ouvrir, et 9000, 8000 et 7000 pour le fermer. Vous pouvez les modifier ou ajouter d’autres ports à la liste. Pour nos besoins, nous nous en tiendrons aux valeurs par défaut.
seq_timeout: la période pendant laquelle quelqu’un doit accéder aux ports pour déclencher l’ouverture ou la fermeture.
commande: La commande envoyée au pare-feu iptables lorsque l’action d’ouverture ou de fermeture est déclenchée. Ces commandes ajoutent une règle au pare-feu (pour ouvrir le port) ou la suppriment (pour fermer le port).
tcpflags: le type de paquet que chaque port doit recevoir dans la séquence secrète. Un paquet SYN (synchroniser) est le premier d’une TCP demande de connexion, appelée poignée de main à trois.

  Comment utiliser Hardcode Tray pour changer les icônes de la barre d'état système sous Linux

La section «openSSH» peut être lue comme «une demande de connexion TCP doit être adressée aux ports 7000, 8000 et 9000 – dans cet ordre et dans les 5 secondes – pour que la commande d’ouverture du port 22 soit envoyée au pare-feu.»

La section «closeSSH» peut être lue comme «une demande de connexion TCP doit être adressée aux ports 9000, 8000 et 7000 – dans cet ordre et dans les 5 secondes – pour que la commande de fermeture du port 22 soit envoyée au pare-feu.»

Les règles du pare-feu

Les entrées «commande» dans les sections openSSH et closeSSH restent les mêmes, sauf pour un paramètre. Voici comment ils sont constitués:

-A: ajoutez la règle au bas de la liste des règles de pare-feu (pour la commande openSSH).
-D: supprime la commande de la liste des règles de pare-feu (pour la commande closeSSH).
INPUT: Cette règle concerne le trafic réseau entrant.
-s% IP%: l’adresse IP du périphérique demandant une connexion.
-p: protocole réseau; dans ce cas, c’est TCP.
–Dport: le port de destination; dans notre exemple, c’est le port 22.
-j ACCEPT: Saute à la cible d’acceptation dans le pare-feu. En d’autres termes, laissez le paquet passer par le reste des règles sans agir dessus.

Modifications du fichier de configuration knockd

Les modifications que nous apporterons au fichier sont surlignées en rouge ci-dessous:

Le fichier de configuration knockd dans l'éditeur gedit avec les modifications en surbrillance.

Nous étendons le «seq_timeout» à 15 secondes. C’est généreux, mais si quelqu’un lance manuellement des demandes de connexion, il peut avoir besoin de beaucoup de temps.

Dans la section «openSSH», nous changeons l’option -A (append) de la commande en -I (insert). Cette commande insère une nouvelle règle de pare-feu en haut de la liste des règles de pare-feu. Si vous laissez l’option -A, elle ajoute la liste des règles de pare-feu et la place en bas.

Le trafic entrant est testé par rapport à chaque règle de pare-feu de la liste de haut en bas. Nous avons déjà une règle qui ferme le port 22. Ainsi, si le trafic entrant est testé par rapport à cette règle avant de voir la règle qui autorise le trafic, la connexion est refusée; s’il voit d’abord cette nouvelle règle, la connexion est autorisée.

La commande close supprime la règle ajoutée par openSSH des règles de pare-feu. Le trafic SSH est à nouveau géré par la règle préexistante «le port 22 est fermé».

Après avoir effectué ces modifications, enregistrez le fichier de configuration.

Modifications du fichier de contrôle knockd

Le fichier de contrôle knockd est tout à fait plus simple. Avant de plonger et de modifier cela, cependant, nous devons connaître le nom interne de notre connexion réseau; pour le trouver, tapez cette commande:

ip addr

le

La connexion que cette machine utilise pour rechercher cet article est appelée enp0s3. Notez le nom de votre connexion.

La commande suivante modifie le fichier de contrôle knockd:

sudo gedit /etc/default/knockd

Voici le fichier knockd dans gedit.

Le fichier de contrôle knockd dans gedit.

Les quelques modifications que nous devons apporter sont surlignées en rouge:

  Comment installer les extensions Chrome dans les navigateurs basés sur Chromium

Le fichier de contrôle knockd dans gedit avec les modifications en surbrillance.

Nous avons changé l’entrée «START_KNOCKD =» de 0 à 1.

Nous avons également supprimé le hash # au début de l’entrée «KNOCKD_OPTS =» et remplacé «eth1» par le nom de notre connexion réseau, enp0s3. Bien sûr, si votre connexion réseau est eth1, vous ne la modifierez pas.

La preuve est dans le pudding

Il est temps de voir si cela fonctionne. Nous allons démarrer le démon knockd avec cette commande:

sudo systemctrl start knockd

Maintenant, nous allons sauter sur une autre machine et essayer de nous connecter. Nous avons également installé l’outil knockd sur cet ordinateur, non pas parce que nous voulons configurer le port knocking, mais parce que le package knockd fournit un autre outil appelé knock. Nous utiliserons cette machine pour tirer dans notre séquence secrète et frapper à la porte pour nous.

Utilisez la commande suivante pour envoyer votre séquence secrète de demandes de connexion aux ports de l’ordinateur hôte avec l’adresse IP 192.168.4.24:

knock 192.168.4.24 7000 8000 9000 -d 500

Cela indique à Knock de cibler l’ordinateur à l’adresse IP 192.168.4.24 et de lancer une demande de connexion aux ports 7000, 8000 et 9000, à son tour, avec un -d (délai) de 500 millisecondes entre eux.

Un utilisateur appelé «dave» fait alors une requête SSH à 192.168.4.24:

ssh [email protected]

Sa connexion est acceptée, il entre son mot de passe et sa session à distance commence. Son invite de commande passe de dave @ nostromo à dave @ howtogeek. Pour se déconnecter de l’ordinateur distant, il tape:

exit

Son invite de commande revient à son ordinateur local. Il utilise encore une fois Knock, et cette fois, il cible les ports dans l’ordre inverse pour fermer le port SSH sur l’ordinateur distant.

knock 192.168.4.24 9000 8000 7000 -d 500

Cliquetis de port et session de connexion ssh dans une fenêtre de terminal.

Certes, ce n’était pas une session à distance particulièrement fructueuse, mais cela démontre l’ouverture et la fermeture du port via le cliquetis du port et tient dans une seule capture d’écran.

Alors, à quoi cela ressemblait-il de l’autre côté? L’administrateur système sur l’hôte de frappe de port utilise la commande suivante pour afficher les nouvelles entrées qui arrivent dans le journal système:

tail -f /var/log/syslog

Un syslog montrant les événements de frappe de port dans une fenêtre de terminal.

Vous voyez trois entrées openSSH. Ceux-ci sont déclenchés lorsque chaque port est ciblé par l’utilitaire de frappe à distance.
Lorsque les trois étapes de la séquence de déclenchement sont remplies, une entrée qui dit « SÉSAME OUVRE-TOI,« Est enregistré
La commande pour insérer la règle dans la liste des règles iptables est envoyée. Il permet l’accès via SSH sur le port 22 à partir de l’adresse IP spécifique du PC qui a donné le coup secret correct (192.168.4.23).
L’utilisateur «dave» se connecte pendant quelques secondes seulement, puis se déconnecte.
Vous voyez trois entrées closeSSH. Celles-ci sont déclenchées lorsque chaque port est ciblé par l’utilitaire de frappe à distance – il indique à l’hôte de frappe de port de fermer le port 22.
Une fois les trois étapes déclenchées, nous obtenons à nouveau le message «OPEN SESAME». La commande est envoyée au pare-feu pour supprimer la règle. (Pourquoi pas «CLOSE SESAME» lors de la fermeture du port? Qui sait?)

Maintenant, la seule règle dans la liste des règles iptables concernant le port 22 est celle que nous avons tapée au début pour fermer ce port. Le port 22 est donc à nouveau fermé.

Frappez-le à la tête

C’est l’astuce du salon de frappe à bâbord. Traitez-le comme une diversion et ne le faites pas dans le monde réel. Ou, si vous le devez, ne comptez pas sur cela comme votre seule forme de sécurité.