Port Knocking SSH

Masquage du port SSH par séquence de knock - BTS SIO SISR

Objectif

Mettre en place un système de Port Knocking pour protéger l'accès SSH. Le port SSH restera fermé par défaut et ne s'ouvrira qu'après avoir frappé une séquence spécifique de ports dans le bon ordre.

Cette technique de sécurité par l'obscurité ajoute une couche de protection contre les scans de ports et les tentatives de brute force SSH.

Prérequis

  • Serveur Debian 11 / Ubuntu
  • SSH fonctionnel et configuré
  • Accès root ou sudo
  • iptables installé (généralement présent par défaut)
  • Connexion physique ou console de secours (en cas de blocage SSH)
AVERTISSEMENT CRITIQUE

Avant de configurer le port knocking, s'assurer d'avoir :
  • Un accès console physique ou via hyperviseur (VirtualBox, ESXi, etc.)
  • Une sauvegarde de la configuration réseau
  • Une session SSH ouverte en parallèle pour tester
Risque : se bloquer soi-même en cas d'erreur de configuration.

Procédure Complète

Étape 1 : Installation de knockd

Mettre à jour les dépôts et installer knockd :

apt update
apt install knockd -y

Vérifier l'installation :

knockd --version

Étape 2 : Configuration de knockd

Éditer le fichier de configuration principal :

nano /etc/knockd.conf

Remplacer le contenu par la configuration suivante :

[options]
 UseSyslog

[openSSH]
 sequence = 7000,8000,9000
 seq_timeout = 15
 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
 tcpflags = syn

[closeSSH]
 sequence = 9000,8000,7000
 seq_timeout = 15
 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
 tcpflags = syn

Sauvegarder et quitter (Ctrl+O, Entrée, Ctrl+X)

Explications détaillées de la configuration :
  • [options] : section de configuration globale
  • UseSyslog : active l'enregistrement dans les logs système
  • [openSSH] : règle pour ouvrir le port SSH
  • sequence = 7000,8000,9000 : séquence de ports à frapper dans l'ordre
  • seq_timeout = 15 : délai maximum (en secondes) pour compléter la séquence
  • %IP% : variable remplacée automatiquement par l'IP source du client
  • tcpflags = syn : écoute uniquement les paquets TCP SYN
  • [closeSSH] : règle pour fermer le port SSH (séquence inverse)

Étape 3 : Configuration de l'interface réseau

Éditer le fichier de configuration pour spécifier l'interface réseau :

nano /etc/default/knockd

Modifier les lignes suivantes :

START_KNOCKD=1
KNOCKD_OPTS="-i eth0"
Note : Remplacer eth0 par le nom de votre interface réseau.
Pour identifier votre interface :
ip a

Interfaces courantes : eth0, ens33, enp0s3, ens18

Étape 4 : Configuration du firewall (iptables)

Bloquer le port SSH par défaut :

iptables -A INPUT -p tcp --dport 22 -j DROP

Autoriser les connexions SSH établies (important pour ne pas couper les sessions actives) :

iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Sauvegarder les règles iptables :

apt install iptables-persistent -y
netfilter-persistent save
Explications iptables :
  • -A INPUT : ajoute une règle à la chaîne INPUT (trafic entrant)
  • -p tcp --dport 22 : cible le port TCP 22 (SSH)
  • -j DROP : rejette silencieusement les paquets
  • -m state --state ESTABLISHED,RELATED : autorise les connexions déjà établies
  • iptables-persistent : permet de conserver les règles après redémarrage

Étape 5 : Démarrage de knockd

Activer knockd au démarrage du système :

systemctl enable knockd

Démarrer le service :

systemctl start knockd

Vérifier le statut :

systemctl status knockd
Résultat attendu :
Le service doit être "active (running)" et écouter sur l'interface spécifiée.

Utilisation côté client

Installation du client knock (Linux)

Sur la machine cliente (Debian/Ubuntu) :

apt install knockd -y

Ouvrir le port SSH

Frapper la séquence pour ouvrir le port :

knock ADRESSE_IP_SERVEUR 7000 8000 9000

Exemple :

knock 192.168.1.100 7000 8000 9000

Connexion SSH immédiatement après :

Fermer le port SSH

Frapper la séquence inverse pour fermer :

knock 192.168.1.100 9000 8000 7000

Alternative : nmap (si knock n'est pas disponible)

for PORT in 7000 8000 9000; do nmap -Pn --max-retries 0 -p $PORT 192.168.1.100; done

Alternative : telnet (Windows/Linux)

telnet 192.168.1.100 7000
(Ctrl+C pour quitter)
telnet 192.168.1.100 8000
(Ctrl+C)
telnet 192.168.1.100 9000
(Ctrl+C)
ssh [email protected]

Script bash automatisé

Créer un script pour simplifier l'usage :

nano ~/knock-ssh.sh

Contenu du script :

#!/bin/bash
SERVER="192.168.1.100"
knock $SERVER 7000 8000 9000
sleep 1
ssh utilisateur@$SERVER

Rendre le script exécutable :

chmod +x ~/knock-ssh.sh

Utilisation :

~/knock-ssh.sh

Vérifications

Vérification du service knockd

systemctl status knockd

Doit afficher "active (running)"

Vérification des logs

tail -f /var/log/syslog | grep knockd

Doit afficher les tentatives de knock en temps réel

Vérification des règles iptables

iptables -L INPUT -v -n

Doit montrer les règles dynamiques ajoutées par knockd après un knock réussi

Test depuis une machine distante

  1. Tenter une connexion SSH directe (doit échouer) :
    ssh [email protected]
    # Doit rester bloqué ou afficher "Connection refused"
  2. Frapper la séquence :
    knock 192.168.1.100 7000 8000 9000
  3. Connexion SSH immédiate (doit réussir) :

Test de la séquence de fermeture

Depuis une autre session SSH (ne pas fermer la session active) :

knock 192.168.1.100 9000 8000 7000

Tenter une nouvelle connexion SSH depuis un autre terminal : elle doit échouer

Sécurité et Limites

Avantages du Port Knocking

  • Masque le service SSH des scans de ports automatisés
  • Réduit les tentatives de brute force SSH
  • Ajoute une couche de sécurité supplémentaire
  • Ne nécessite pas de modification du client SSH standard
  • Logs précis des tentatives de knock

Limites et inconvénients

Limites de cette technique (niveau BTS SIO) :
  • Sécurité par l'obscurité (pas de chiffrement de la séquence)
  • Vulnérable au sniffing réseau (un attaquant peut capturer la séquence)
  • Complexité d'usage pour les utilisateurs non techniques
  • Risque de blocage en cas de mauvaise configuration
  • Pas de protection contre les attaques par rejeu (replay attacks)
  • Ne remplace PAS l'authentification par clés SSH

Recommandations de sécurité complémentaires

Le port knocking doit TOUJOURS être combiné avec :
  1. Authentification par clés SSH (désactiver les mots de passe)
  2. Fail2ban pour bannir les IPs suspectes
  3. Changement du port SSH (ex: 2222 au lieu de 22)
  4. Restriction des utilisateurs SSH (AllowUsers dans sshd_config)
  5. Désactivation du compte root SSH (PermitRootLogin no)

Configuration SSH renforcée

Éditer /etc/ssh/sshd_config :

nano /etc/ssh/sshd_config

Paramètres recommandés :

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers utilisateur1 utilisateur2
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2

Redémarrer SSH :

systemctl restart sshd

Surveillance des logs

# Logs SSH
tail -f /var/log/auth.log

# Logs knockd
tail -f /var/log/syslog | grep knockd

# Logs iptables (si activé)
tail -f /var/log/kern.log

Variante : Port Knocking avec authentification OTP

Pour aller plus loin (hors périmètre BTS standard), il existe des solutions combinant port knocking et OTP (One-Time Password) comme fwknop (Firewall Knock Operator) utilisant SPA (Single Packet Authorization).

Alternatives plus robustes

  • VPN (WireGuard, OpenVPN) : accès SSH via tunnel chiffré
  • Bastion SSH (Jump Host) : serveur intermédiaire pour rebondir
  • SSH via Tor : anonymisation du trafic
  • 2FA/MFA : authentification à deux facteurs (Google Authenticator, Yubikey)

Dépannage

Problème : knockd ne démarre pas

journalctl -xe -u knockd

Vérifier :

  • La syntaxe du fichier /etc/knockd.conf
  • Le nom de l'interface réseau dans /etc/default/knockd
  • Les permissions du fichier de configuration

Problème : La séquence ne fonctionne pas

  • Vérifier que l'interface réseau est bien spécifiée
  • Vérifier les logs en temps réel : tail -f /var/log/syslog
  • Tester avec tcpdump pour voir si les paquets arrivent :
    tcpdump -i eth0 port 7000 or port 8000 or port 9000

Problème : Bloqué après configuration

Accéder via console physique ou hyperviseur et :

systemctl stop knockd
iptables -F
iptables -P INPUT ACCEPT
systemctl restart sshd

Points Clés pour l'Oral BTS

  • Port Knocking : technique de sécurité par l'obscurité
  • Principe : frapper une séquence de ports pour débloquer un service
  • knockd : daemon Linux qui écoute les séquences et exécute des règles iptables
  • Limites : vulnérable au sniffing, ne remplace pas l'authentification forte
  • Complémentarité : doit être combiné avec clés SSH, fail2ban, firewall
  • Usage : protection contre scans automatisés et brute force SSH
  • Alternatives : VPN, bastion SSH, 2FA sont plus robustes