« SSH - Configuration du Port Knocking » : différence entre les versions

De PedroWiki
Aller à la navigationAller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
 
(3 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
= Introduction =
= Introduction =


La technique de Port Knocking consiste à autoriser des connexions SSH (mais pas que) en fonction de l'accès à une suite de port depuis le client.
La technique de Port Knocking consiste à autoriser des connexions SSH (mais pas que) en fonction de l'accès à une suite de ports depuis le client.


De cette façon,  
De cette façon,  
Ligne 10 : Ligne 10 :
* certaines IPs de box notamment sont susceptibles de changer dans le temps.
* certaines IPs de box notamment sont susceptibles de changer dans le temps.
* on n'est pas toujours derrière ces IPs au moment où on a besoin de se connecter.
* on n'est pas toujours derrière ces IPs au moment où on a besoin de se connecter.
= Pré requis =
Le système à protéger doit disposer du package <code>iptables</code> et d'une configuration de parefeu restrictive sur le port SSH.
A toutes fins utiles, cf [https://lea-linux.org/documentations/iptables ce très bon guide iptables de Léa Linux].


= Packages à installer =
= Packages à installer =
Ligne 81 : Ligne 87 :
knock <ip_destination> -v <port1> <port2> <port3>...
knock <ip_destination> -v <port1> <port2> <port3>...
</pre>
</pre>
Options:
* <code>-v</code>: mode verbeux, pour voir en temps réel le travail du client knock.
* <code>-d</code>: délai entre chaque accès aux ports de la liste.
Dans le cas où l'on utilise un fichier de configuration SSH (ex: <code>~/.ssh/config</code>), on peut configurer l'accès comme suit:
<pre>
Host maquetteknock
        Hostname 10.0.2.9
        Port 22
        User julien
        IdentityFile ~/.ssh/id_ecdsa
Match host 10.0.2.9 exec "knock -d 500 %h 2001 2004 2007"
</pre>
Le bloc <code>Host</code> est assez classique:
* définition du hostname / de l'IP à joindre.
* port à contacter pour se connecter en SSH.
* l'utilisateur de connexion.
* le fichier de clé privé servant à l'authentification.
La configuration <code>Match host/exec</code> sert, dans notre cas, à exécuter une commande en préalable de l'établissement de la session: ici la commande <code>knock</code> permettant d'ouvrir les flux.
[[Category:Howto]]
[[Category:Systeme]]
[[Category:Linux]]
[[Category:Sécurité]]

Dernière version du 23 décembre 2025 à 13:59

Introduction

La technique de Port Knocking consiste à autoriser des connexions SSH (mais pas que) en fonction de l'accès à une suite de ports depuis le client.

De cette façon,

  • il n'est pas nécessaire d'avoir une règle autorisant une IP ou une liste d'IP à se connecter en SSH.
  • il suffit simplement de connaître la séquence de port à prober pour ouvrir le flux temporairement et pouvoir se connecter.

NB: il peut être contraignant de restreindre l'accès au port SSH par iptables pour plusieurs raisons

  • certaines IPs de box notamment sont susceptibles de changer dans le temps.
  • on n'est pas toujours derrière ces IPs au moment où on a besoin de se connecter.

Pré requis

Le système à protéger doit disposer du package iptables et d'une configuration de parefeu restrictive sur le port SSH.

A toutes fins utiles, cf ce très bon guide iptables de Léa Linux.

Packages à installer

Qu'on souhaite utiliser le service knockd ou le client knock, le package à installer est le même:

apt install knockd

Configuration côté serveur

Configuration dans /etc/knockd.conf:

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

[openSSH]
        sequence    = 2001,2004,2007
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        cmd_timeout = 10
        stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 2007,2004,2001
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[openHTTPS]
        sequence    = 12345,54321,24680,13579
        seq_timeout = 5
        command     = /usr/local/sbin/knock_add -i -c INPUT -p tcp -d 443 -f %IP%
        tcpflags    = syn

Détails sur l'utilité des options:

  • logfile: par défaut, le service log dans le log système global, il est parfois plus pratique d'avoir un log dédié pour éviter les pollutions pendant un diag de fonctionnement.
  • seq_timeout: la durée pendant laquelle le service attends la séquence de ports.
  • command: en général, une commande iptables permettant d'ajouter dynamiquement une règle de parefeu.
  • cmd_timeout: durée au delà de laquelle on exécute **stop_command**.
  • stop_command: dans notre cas, commande iptables retirant l'autorisation temporaire d'accès. **NB**: cela évite d'oublier de jouer la séquence de ports pour refermer le parefeu et donc de laisser un port inutilement ouvert.
  • tcpflags: les types de trames TCP attendues pour le jeu de la séquence.

NB: on voit dans le bloc openHTTPS que le service peut être utilisé à d'autres fins que simplement donner un accès SSH.

Configuration dans /etc/default/knockd:

# control if we start knockd at init or not
# 1 = start
# anything else = don't start
# PLEASE EDIT /etc/knockd.conf BEFORE ENABLING
START_KNOCKD=1

# command line options
KNOCKD_OPTS="-i enp0s3"
  • START_KNOCKD à 1 permet d'activer le service au démarrage du serveur.
  • KNOCKD_OPTS permet d'ajouter des options à l'appel du lancement du service.

NB: l'option -i est très importante, car sans configurer une interface d'écoute, le service ne démarrera tout simplement pas.

Configuration côté client

Pour jouer la séquence d'accès aux ports servant de combinaison d'accès (ou d'annulation de l'accès), utiliser le client knock:

knock <ip_destination> -v <port1> <port2> <port3>...

Options:

  • -v: mode verbeux, pour voir en temps réel le travail du client knock.
  • -d: délai entre chaque accès aux ports de la liste.

Dans le cas où l'on utilise un fichier de configuration SSH (ex: ~/.ssh/config), on peut configurer l'accès comme suit:

Host maquetteknock
        Hostname 10.0.2.9
        Port 22
        User julien
        IdentityFile ~/.ssh/id_ecdsa

Match host 10.0.2.9 exec "knock -d 500 %h 2001 2004 2007"

Le bloc Host est assez classique:

  • définition du hostname / de l'IP à joindre.
  • port à contacter pour se connecter en SSH.
  • l'utilisateur de connexion.
  • le fichier de clé privé servant à l'authentification.

La configuration Match host/exec sert, dans notre cas, à exécuter une commande en préalable de l'établissement de la session: ici la commande knock permettant d'ouvrir les flux.