Si vous êtes du genre à mettre toutes les armes de votre côté en ce qui concerne la sécurité d’un serveur Linux mais que la technique du Port Knocking vous est étrangère, alors ceci devrait vous intéresser. Et puis si la sécurité vous importe peu, tout n’est pas perdu, vous devriez pouvoir trouver une place de consultant chez Sony.

Troll mis à part, le port knocking est une technique permettant de modifier dynamiquement les règles d’un pare-feu grâce au lancement préalable d’une suite de connexions sur des ports distincts (TCP et UDP) dans le bon ordre.

Ainsi, si même après avoir sécurisé un minimum votre accès SSH, vous continuez à essuyer trop de tentatives de type bruteforce, le port knocking peut-être une solution à votre problème.

Note: je prends ici l’exemple de SSH mais vous pouvez bien sûr utiliser le port knocking avec n’importe lequel de vos services.

Installation du daemon knockd

Pour faire fonctionner cette technique, nous allons avoir besoin d’un daemon dont le rôle sera d’écouter les ports afin de détecter une éventuelle séquence connue et agir en conséquence sur les règles du pare-feu.

Sous debian (ou Ubuntu) :

sudo aptitude install knockd
Configuration de knockd

La configuration de knockd se trouve dans /etc/knockd.conf. Voici un exemple de configuration à utiliser pour SSH.

[options]
        UseSyslog

[options]
      logfile = /var/log/knockd.log

[openSSH]
        sequence    = 2000:tcp,3000:udp,4000:tcp
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn 

[closeSSH]
        sequence    = 4000:tcp,3000:udp,2000:tcp
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

Je pense que le fichier parle de lui même :

  • la réception de la séquence 2000:tcp,3000:udp,4000:tcp aura pour conséquence d’ouvrir le port SSH (ici le 22)
  • la séquence inverse fermera le port

A noter : essayez d’utiliser un minimum de 3 ports avec les deux protocoles pour que votre séquence soit difficile à trouver.

On édite ensuite le fichier suivant :

sudo vim /etc/default/knockd

Et on passe la valeur de START_KNOCKD à 1.

Configuration du firewall

Pour que cela fonctionne, votre firewall doit par défaut ne laisser passer aucune connexion sur le port SSH.

Démarrer le daemon

On démarre knockd :

/etc/init.d/knockd start
Et côté client ?

Il y a plusieurs solutions pour activer une séquence.

Utiliser telnet ou alors plus simplement, le client knockd disponible à l’adresse suivante.

Assurez-vous de placer le binaire dans un endroit accessible par votre shell (echo $PATH dans le terminal pour connaître les emplacements).

On fait un toc sur la séquence prévue :

knock [ip] 2000:tcp 3000:udp 4000:tcp

Pour se simplifier la vie, je vous conseil d’éditer un alias dans votre fichier de configuration dédié à votre shell. En ce qui me concerne, j’utilise ZSH donc :

cd
vim .zshrc

Et voici ma configuration (modifiée):

# Serveur
alias sms="toc && ssh [domaine] -p [port]"
# Port knocking
alias toc="knock [domaine] 2000:tcp 3000:udp 4000:tcp"
alias cot="knock [domaine] 4000:tcp 3000:udp 2000:tcp"

Ainsi, en tapant sms je me connecte directement à mon serveur, le tout de manière transparente. Et pour envoyer la séquence inverse, j’utilise l’alias cot.

Pour conclure, knockd est un utilitaire utilisant peu de ressources et très facile à mettre en place qui vous permettra de sécuriser un peu plus les connexions à votre serveur. Bien entendu, ça n’est pas une solution magique qui vous mettra à l’abri de toute intrusion, mais cela vous permettra au moins de rendre la tâche plus difficile aux personnes mal intentionnées.

Et en bonus, le système équivalent dans le monde réel, le tout à base à base d’arduino :p