Port Knocking sur Ubuntu : guide d'installation et de configuration

Pourquoi utiliser le port knocking
Le port knocking agit comme un coup de poing codé sur une porte. Plutôt que d’ouvrir directement le port SSH au monde entier, vous le bloquez par défaut et n’autorisez temporairement l’accès qu’après qu’un client ait envoyé la bonne séquence de connexions sur des ports prédéfinis. C’est une couche de défense supplémentaire contre les scanners de ports automatisés.
Définition courte : Port knocking — méthode où un service reste fermé jusqu’à ce que le client exécute une séquence d’accès réseau prédéfinie.
Important : Le port knocking n’est pas une solution unique. Combinez-le toujours avec l’authentification par clé, mises à jour régulières et surveillance.
H2: Ce que nous allons couvrir
- Installation des paquets nécessaires (openssh-server, knockd, iptables, iptables-persistent)
- Configuration d’iptables pour bloquer SSH par défaut
- Configuration de /etc/knockd.conf et activation du service
- Tests pratiques (telnet, outils automatisés)
- Scénarios d’échec, alternatives et durcissement
- Checklist de production et critères d’acceptation
Étape 1 : vérifier et installer les paquets requis
Tous les commandes doivent être exécutées en tant que root. Pour passer en root :
sudo su
Mettez à jour la liste des paquets :
apt-get update
Installez le serveur SSH si nécessaire :
apt-get install openssh-server
Installez knockd, le démon qui gère le port knocking :
apt-get install knockd
Exemple d’extraction de paquets (sortie d’apt) :
Get:1 http://security.debian.org wheezy/updates Release.gpg [1,554 B]
Get:2 http://security.debian.org wheezy/updates Release [102 kB]
Get:3 http://security.debian.org wheezy/updates/main amd64 Packages [336 kB]
Hit http://mirrors.digitalocean.com wheezy Release.gpg
Hit http://mirrors.digitalocean.com wheezy Release
Get:4 http://security.debian.org wheezy/updates/main Translation-en [195 kB]
Hit http://mirrors.digitalocean.com wheezy/main amd64 Packages
Hit http://mirrors.digitalocean.com wheezy/main Translation-en
Fetched 635 kB in 1s (358 kB/s)
Reading package lists... Done
root@howtoforge:~#
root@howtoforge:~# apt-get install openssh-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
openssh-client
Suggested packages:
ssh-askpass libpam-ssh keychain monkeysphere rssh molly-guard ufw
The following packages will be upgraded:
openssh-client openssh-server
2 upgraded, 0 newly installed, 0 to remove and 32 not upgraded.
Need to get 1,364 kB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue [Y/n]?
Appuyez sur Y puis Entrée pour continuer.
Ensuite, installez iptables si ce n’est pas déjà fait :
apt-get install iptables
Étape 2 : ajouter des règles iptables
Commencez par vider les règles existantes et autoriser les connexions sortantes :
iptables --flush
iptables -t nat --flush
iptables -t mangle --flush
iptables --policy OUTPUT ACCEPT
Autorisez les connexions établies pour ne pas couper votre session SSH actuelle :
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Note importante : dans la directive ci-dessus, il n’y a pas d’espace autour de la virgule dans ESTABLISHED,RELATED.
Puis bloquez par défaut le port SSH (22) :
iptables -A INPUT -p tcp --destination-port 22 -j DROP
Sauvegarder et restaurer automatiquement ces règles au démarrage avec iptables-persistent :
apt-get install iptables-persistent
Pendant l’installation, le paquet vous demandera si vous souhaitez sauvegarder les règles IPv4 et IPv6 actuelles ; sélectionnez Yes pour les deux.
Si vous souhaitez sauvegarder manuellement les règles en sortie texte :
iptables-save
Exemple de fichier de règles sauvegardées :
# Generated by iptables-save v1.4.14 on Tue Feb 23 04:59:28 2016
*filter
:INPUT ACCEPT [1:40]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17:1976]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j DROP
COMMIT
# Completed on Tue Feb 23 04:59:28 2016
Grâce à ces règles, votre session courante reste active tandis que toute nouvelle tentative d’accès sur le port SSH est rejetée.
Étape 3 : configurer knockd
Ouvrez le fichier de configuration :
nano /etc/knockd.conf
Un exemple de configuration typique :
[options]
UseSyslog
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
Explications rapides :
- UseSyslog : active l’envoi des logs vers syslog.
- sequence : série de ports à contacter dans l’ordre. Changez ces ports et l’ordre par défaut pour éviter qu’ils ne soient devinés.
- seq_timeout : délai (en secondes) pour compléter la séquence. 5 secondes convient pour des scripts automatisés.
- command : commande exécutée quand la séquence est correcte. knockd remplacera %IP% par l’adresse IP du client.
- tcpflags : si défini sur syn, seuls les paquets TCP avec le drapeau SYN sont considérés.
Conseil : choisissez des ports aléatoires non standard et testez localement avant déploiement.
Activer le démarrage automatique de knockd
Éditez :
nano /etc/default/knockd
Changez :
START_KNOCKD=0
en :
START_KNOCKD=1
Si vous avez plusieurs interfaces réseau, vous pouvez préciser l’interface à écouter dans KNOCKD_OPTS en la décommentant.
Démarrez le service :
service knockd start
Lorsque knockd tourne, il appliquera les commandes iptables définies dans /etc/knockd.conf quand la bonne séquence arrivera.
Étape 4 : accéder au serveur lorsque knockd est actif
Après avoir mis en place le blocage sur le port SSH, une connexion SSH directe doit échouer ou se terminer par un timeout. Si l’outil ne renvoie rien, tapez Ctrl-C pour annuler la tentative.
Tester le knocking avec telnet
Sur Linux : installez telnet via apt. Sur Windows : activez le client Telnet dans « Activer ou désactiver des fonctionnalités Windows ».
Ensuite, dans l’ordre (remplacez par votre adresse IP et vos ports) :
telnet votreip 7000
telnet votreip 8000
telnet votreip 9000
Faites les trois en moins de 5 secondes si vous avez gardé seq_timeout=5. Puis lancez votre connexion SSH :
ssh utilisateur@votreip
Pour refermer l’accès, frappez la séquence inverse :
telnet votreip 9000
telnet votreip 8000
telnet votreip 7000
Note : il est plus pratique et fiable d’automatiser le knock via un script ou un outil comme knock-client plutôt que d’utiliser telnet manuellement.
Tests pratiques et critères d’acceptation
- Test 1 (fonctionnel) : avant le knock, ssh doit se terminer par timeout.
- Test 2 (succès) : après avoir envoyé la séquence correcte depuis une IP, SSH doit être accessible depuis cette IP.
- Test 3 (isolation) : d’une autre IP, SSH doit rester inaccessible.
- Test 4 (timeout sequence) : si la séquence n’est pas complétée dans seq_timeout, l’accès ne doit pas être ouvert.
Critères d’acceptation : les 4 tests ci-dessus doivent réussir dans un environnement de préproduction.
Alternatives et quand le port knocking échoue
- Port knocking classique peut échouer si :
- Le client est derrière un NAT qui modifie la source des paquets (IP différente ou translation de ports).
- Le réseau intermédiaire filtre ou normalise les paquets SYN (certains proxies/pare-feux).
- Un IDS/IPS signale la séquence comme suspecte.
Alternatives :
- Single Packet Authorization (SPA) — ex. fwknop : envoie un paquet chiffré unique, plus discret et résistant à la normalisation.
- VPN d’accès : demande une authentification VPN avant d’accéder aux services internes.
- Port knocking basé sur UDP au lieu de TCP si votre environnement le permet.
Quand préférer SPA ou VPN : pour des environnements avec NAT complexe, ou requérant une traçabilité et une résilience supérieures.
Durcissement et bonnes pratiques
- Conserver l’authentification par clé publique pour SSH et désactiver l’authentification par mot de passe.
- Limiter la durée d’ouverture du port : exécuter iptables -D automatiquement après X minutes.
- Journaliser et surveiller les tentatives de knock (syslog) et exporter vers un SIEM.
- Changer régulièrement la séquence et les ports utilisés.
- Restreindre knockd à une interface réseau spécifique si possible.
- Interdire knockd sur des interfaces publiques non nécessaires.
Exemple d’ajout pour fermer automatiquement après 10 minutes (script simple) :
# /usr/local/bin/close_ssh_after.sh
sleep 600
/sbin/iptables -D INPUT -s $1 -p tcp --dport 22 -j ACCEPT
Et invoquez ce script dans la commande de knockd :
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT; /usr/local/bin/close_ssh_after.sh %IP%
(Remplacez par une implémentation plus robuste en production.)
Confidentialité et conformité (GDPR)
- Knockd enregistre l’adresse IP source (%IP%) lorsqu’il ouvre le port. Ces logs sont des données personnelles selon le RGPD.
- Minimisez la rétention des logs : conservez uniquement le nécessaire pour la sécurité et la réponse aux incidents.
- Documentez la finalité et conservez un registre des traitements si vous opérez en UE.
- Informez l’équipe sécurité et le DPO lorsque vous mettez en place la journalisation centralisée.
Checklist de production avant passage en service
- Authentification par clé activée et mot de passe SSH désactivé.
- Tests de knock réussis depuis chaque lieu d’administration.
- Monitoring et alertes sur les logs de knockd et iptables.
- Procédure de récupération testée (accès d’urgence via console cloud ou KVM).
- Politique de rétention des logs conforme au RGPD.
- Plan de rotation des séquences/ports et contrôle d’accès pour modifier la configuration.
Playbook incident rapide
- Si l’accès SSH est perdu pour tous : utiliser la console de gestion du fournisseur cloud (KVM) pour accéder au serveur.
- Vérifier /var/log/syslog et /var/log/auth.log pour les entrées knockd et iptables.
- Restaurer temporairement iptables depuis /etc/iptables/rules.v4 ou via iptables-restore.
- Enquêter sur l’origine : IP, timestamps, fréquence.
- Modifier la séquence/ports et rouvrir access si nécessaire.
- Documenter l’incident et appliquer corrections.
Mini-méthodologie pour déployer en 30 minutes
- Faire une sauvegarde de la configuration iptables et sshd_config.
- Installer knockd et iptables-persistent.
- Ajouter les règles iptables : accepter ESTABLISHED,RELATED puis DROP dport 22.
- Configurer /etc/knockd.conf avec une séquence et seq_timeout raisonnable.
- Activer et démarrer knockd.
- Tester avec un script de knock depuis l’IP d’administration.
- Mettre en place la surveillance et la journalisation.
1-ligne glossaire
- knockd : démon qui surveille des tentatives de connexion sur des ports spécifiques et exécute des commandes quand la séquence correspond.
- SPA (Single Packet Authorization) : méthode envoyant un paquet chiffré unique pour ouvrir un service.
Exemples de test automatisé (snippet)
Bash : script simple de knock et connexion SSH :
#!/bin/bash
HOST=$1
shift
PORTS=("$@")
for p in "${PORTS[@]}"; do
timeout 1 bash -c "echo > /dev/tcp/$HOST/$p" 2>/dev/null || true
done
ssh admin@$HOST
Utilisation : ./knock-and-ssh.sh 192.0.2.1 7000 8000 9000
Résumé et conseils finaux
Le port knocking est une barrière d’obscurcissement utile pour réduire la surface d’attaque visible. Pour être vraiment efficace : combinez-le avec l’authentification par clé, la journalisation, la rotation des séquences et, si besoin, une méthode plus robuste comme SPA ou VPN. Testez les scénarios d’échec, préparez une procédure de récupération et limitez la conservation des logs pour rester conforme.
Important : ne comptez pas uniquement sur le port knocking pour la sécurité. C’est une défense en profondeur, pas un contrôle d’accès unique.
Merci d’avoir suivi ce guide — si vous voulez, je peux fournir un modèle de playbook exact adapté à votre topologie réseau ou un exemple de configuration fwknop pour comparer SPA et port knocking.
Matériaux similaires

Raccourci clavier pour télécharger images web

Corriger l'erreur CDP.dll manquant sous Windows

Détecter un texte généré par IA : guide pratique

Installer RabbitMQ sur CentOS 7

SSHFS sur CentOS : installer et monter un dossier
