Ceci est une ancienne révision du document !



Port Knocking : sécuriser l'accès à un port

Le port-knocking est une méthode permettant de modifier le comportement d'un firewall en temps réel pour provoquer l'ouverture d'un port suite au lancement préalable d'une suite de connexions sur des ports distincts dans le bon ordre, à l'instar d'un code frappé à une porte.

Cette technique est notamment utilisée pour protéger l'accès au port 22 dédié au Secure shell (SSH) ; elle ne nécessite pas beaucoup de ressources et reste facile à mettre en œuvre.

En résumé, le port knocking est donc une méthode simple pour autoriser un accès distant sur un port non constamment ouvert. Cela permet d'éviter les scans de ports et certaines attaques.

La méthode de port-knockin est considérée comme sécurisée étant donné qu'elle est située à un niveau bas des couches TCP/IP et qu'elle ne requière pas de port ouvert (le service knockd est aussi invisible d'attaques malveillantes.)

Pour la suite des opérations, des pré-requis sont nécessaires :

  • Disposer des droits d'administration ;
  • Disposer d'une connexion à Internet configurée et activée pour télécharger le logiciel ;
  • Avoir activé l'accès au dépôt APT 'universe'.

Le serveur doit donc avoir un pare-feu et exécuté le service knock. Le service est donc en écoute d'une séquence spécifique TCP ou UDP. Si la séquence est correcte, alors une commande est exécutée. Généralement, l'adresse ip source est autorisée à accéder au port d'une application à travers le pare-feu.

La configuration du serveur est très simple puisqu'il suffit d'installer le paquet knockd

Après que le paquet soit installé, éditer son fichier de configuration /etc/knockd.conf.

2 approches vont être présentées :

  • La première est destinée aux connections qui ne nécessitent pas d'être maintenues (comme HTTP)
  • La seconde méthode à celles qui doivent l'être (comme SSH et IRC).

Connexions non maintenues (no keep-alive)

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

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

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

Nous avons définis 2 séquences :

  • openHTTP ouvre le port HTTP 80 si la séquence de ports 7000, 8000 et 9000 a été exécutée
  • closeHTTP ferme le port HTTP 80 si la séquence de ports 9000, 8000 et 7000 a été exécutée

Connexions maintenues (keep-alive)

Ce deuxième exemple est un peu différent du précédent :

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

[SSH]
      sequence    = 7000,8000,9000
      seq_timeout = 5
      command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
      tcpflags    = syn
      cmd_timeout   = 10
      stop_command  = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Il est recommandé de n'ouvrir le port qu'un court instant (10 secondes dans cet exemple). Pour que cela soit fonctionnel, le pare-feu doit être de type stateful (il doit exister une règle pour accepter les connexions avec -m state –state RELATED,ESTABLISHED)

Explications : si un utilisateurs connecte dans l'ordre les ports 7000, 8000 puis 9000, la comande sera exécutée (ouvrir le port 22). 10 secondes plus tard, la commande stop_command sera exécutée, fermant ainsi le port pour les nouvelles connexions (mais pas celle en cours !)

Attention

Changez impérativement la séquence d'exemple de votre fichier de configuration, et bien entendu, pensez à communiquer la nouvelle !

Vous devez également changer la configuration par défaut dans le fichier /etc/default/knockd pour que le service démarre automatiquement. Pour cela, mettre à 1 la valeur de la ligne START_KNOCKD=

Pour en savoir plus, exécutez dans un terminal la commande man knockd

C'est tout !

Pour initié une séquence sur les ports, vous pouvez utiliser le client de votre choix : telnet, nc…

Ou bien utiliser un logiciel client spécifique au port-knocking comme knock, après avoir installé le paquet knockd (sur le client cette fois-ci !)

Pour l'utiliser, lancer simplement la commande :

knock hostname port1 port2 port3

Pour en savoir plus, exécutez dans un terminal la commande man knock

  • port-knocking.1201455506.txt.gz
  • Dernière modification: Le 18/04/2011, 14:57
  • (modification externe)