Le frappement de port est une méthode d'ouverture dynamique des ports réseau en « frappant » (c'est-à-dire en se connectant) sur une séquence prédéfinie de ports. Ceci est particulièrement utile pour obscurcir un port réseau ouvert de l'analyse de port puisque le port en question sera fermé à moins que la séquence de frappe de port ne soit exécutée. Une séquence de frappe de port suffisamment longue est pratiquement impossible à forcer :par exemple, pour réussir à deviner (par force brute) une combinaison de 3 ports TCP, un attaquant devrait essayer de frapper sur chacune des 281 000 milliards de combinaisons possibles, et rechercher ports ouverts après chaque séquence de frappe de port. Comme vous pouvez probablement l'imaginer, cela prendrait très, très longtemps.
Ce guide vous aidera dans l'installation de knockd, un démon de frappe de port flexible, sur Debian 10. À des fins de démonstration, nous le configurerons pour masquer le port SSH, bien que tout autre port/service puisse être protégé avec cette approche.
Exigences
- Un serveur exécutant Debian 10.
- Accès root à votre serveur.
- La variable d'environnement $EDITOR doit être définie.
- Un deuxième système de test.
REMARQUE :Si vous avez l'intention d'utiliser le port knocking pour masquer le port SSH, assurez-vous de disposer d'une méthode d'accès alternative (via la console par exemple), qui vous sera utile si vous vous verrouillez accidentellement.
Avant d'installer knockd, vérifiez le nom de l'interface réseau publique de votre système avec la commande suivante :
ip link show | grep -v lo
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
Notez le nom de l'interface (ens18 dans ce cas). Il sera nécessaire plus tard.
Étape 1 :Installer Knockd
knockd est un démon de frappe de port qui écoute les connexions et ouvre les ports en conséquence. Nous utiliserons knockd avec les règles iptables pour implémenter le port knocking. Installez les packages requis comme suit :
apt update apt install knockd iptables-persistent
Étape 2 :Configuration de Knockd
Knockd utilise un seul fichier de configuration, /etc/knockd.conf, pour définir les séquences de frappe et d'autres paramètres. Il existe deux modes de fonctionnement pratiques. Le premier nécessite une seule séquence de frappe pour ouvrir et fermer le port prédéfini, tandis que l'autre utilise des séquences d'ouverture et de fermeture séparées. Nous utiliserons le premier car il nécessite moins d'interaction de l'utilisateur.
Tout d'abord, sauvegardez le fichier de configuration existant :
mv /etc/knockd.conf /etc/knockd.conf.bak
Deuxièmement, ouvrez le fichier de configuration dans votre éditeur de texte :
$EDITOR /etc/knockd.conf
Et entrez la configuration ci-dessous :
(remplacez ens18 par le nom de votre interface réseau.)
[options] UseSyslog Interface = ens18 [SSH] sequence = 1000,2000,3000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT cmd_timeout = 20
Cela demandera à knockd d'activer le trafic vers le port 22 après avoir reçu la séquence de frappe correcte (1000,2000,3000 dans ce cas), puis de désactiver à nouveau le trafic après un délai de 20 secondes. Les connexions SSH ne seront donc acceptées que pendant cette fenêtre de 20 secondes.
Ensuite, activez knockd en éditant le fichier /etc/default/knockd :
$EDITOR /etc/default/knockd
Et définissez START_KNOCKD sur 1 :
START_KNOCKD=1
Enregistrez le fichier et quittez. Nous modifierons également l'unité systemd pour knockd. Pour ce faire, créez un nouveau fichier d'unité pour remplacer la valeur par défaut :
$EDITOR /etc/systemd/system/knockd.service
Et collez ce qui suit :
[Unit] Description=Port-Knock Daemon After=network.target Requires=network.target Documentation=man:knockd(1) [Service] EnvironmentFile=-/etc/default/knockd ExecStartPre=/usr/bin/sleep 1 ExecStart=/usr/sbin/knockd $KNOCKD_OPTS ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed Restart=always SuccessExitStatus=0 2 15 ProtectSystem=full CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN [Install] WantedBy=multi-user.target
Utilisez ensuite la commande suivante pour charger et activer la nouvelle unité :
systemctl daemon-reload systemctl enable --now knockd.service
Étape 3 :Règles de pare-feu
À ce stade, Knockd est prêt, mais tout le trafic est activé par défaut via le pare-feu. Nous allons créer des règles de pare-feu pour refuser l'accès au port 22/tcp.
Les commandes suivantes garantissent que les connexions existantes ne sont pas interrompues.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Voici les règles pour supprimer les connexions au port 22/tcp :
iptables -A INPUT -p tcp --destination-port 22 -j DROP ip6tables -A INPUT -p tcp --destination-port 22 -j DROP
Ensuite, enregistrez les chaînes de règles actuelles pour la persistance entre les redémarrages :
iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6
Étape 4 :Tester
À partir d'un autre système, essayez de démarrer une nouvelle session SSH sur votre serveur. Vous ne devriez pas pouvoir vous connecter. Pour effectuer la séquence de frappe, différents outils peuvent être utilisés, bien que nous démontrions avec frappe, le client de frappe inclus avec Knockd. Installez le package knockd comme indiqué à l'étape 1 sur un autre système, puis exécutez les commandes :
knock server_ip_address 1000 2000 3000 ssh [email protected]_ip_address
La connexion SSH devrait maintenant réussir.
Configuration alternative
Knockd peut également être configuré pour exiger deux séquences distinctes pour l'ouverture et la fermeture des ports réseau. Ceci est utile si vous souhaitez garder les ports ouverts pendant de longues périodes. Pour configurer Knockd de la manière, ouvrez son fichier de configuration :
$EDITOR /etc/knockd.conf
Et remplacez la configuration existante par ce qui suit :
[options] UseSyslog Interface = your_interface [openSSH] sequence = 1000,2000,3000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT [closeSSH] sequence = 3000,2000,1000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
Redémarrez ensuite le service pour charger la nouvelle configuration :
systemctl restart knockd.service
Conclusion
Knockd peut être une solution efficace aux attaques par force brute, qui sont très courantes sur SSH et d'autres services. Même si systemd redémarrera Knockd en cas d'échec, vous devriez toujours disposer d'une méthode de secours pour accéder à votre serveur si vous utilisez le port-knocking pour masquer le port SSH.