Autoriser le SSH via Iptables

I. Présentation

Iptables est un paquet présent sur la plupart des distributions Debian qui permet de gérer en ligne de commande les règles de Netfilter, un pare-feu natif à ces mêmes distributions. Dans ce tutoriel, nous allons voir comment autoriser uniquement le port SSH à être contacté sur un serveur au travers la manipulation d'Iptables.

II. Explications

Nous allons en effet chercher à sécuriser notre port SSH via Iptables à travers différents paramètres et options. On verra tout d'abord comment fermer tous les ports de notre serveur pour n'ouvrir que le port SSH pour ensuite spécifier des sécurités supplémentaires quant à la connexion SSH. Iptables nous permettra de faire ce genre de sécurité. Pour simplifier la gestion des règles Iptables. Nous travaillerons avec un script qui exécutera les règles Iptables. On doit donc créer un fichier que nous nommerons ici "iptables.sh" :

vim iptables.sh

Puis nous allons commencer par réinitialiser les règles déja écrites :

# !/bin/bash
# Supprimer les règles écrites
iptables -F ; iptables -X
#... nouvelles règles
# Lister les règles nouvellement écrites
iptables -L

Lors du tutoriel, nous mettront donc nos règles entre la suppression des anciennes règles et le listage des nouvelles. On fini par lister les nouvelles règles pour voir si toutes nos règles sont bien passées. Il faut ensuite rendre ce script exécutable pour pouvoir commencer la modification des règles Iptables:

chmod +x iptables.sh

III. Fermer tous les ports

La construction des règles Iptables doit commencer par l'autorisation des ports voulus pour finir par la fermeture du reste des ports (ceux non spécifiés). On finira donc notre script par :

iptables -t filter A INPUT -j DROP
iptables -t filter A OUTPUT -j DROP

Que nous mettrons juste avant le "iptables -L". Nous allons donc commencer par fermer tous les ports de notre serveur. Assurez vous de ne pas être en SSH ou autre connexion distante avant d'exécuter la validation des modifications ou vous vous verrez couper votre accès. En effet, la fermeture de tous les ports du serveur le rend totalement injoignable depuis l'extérieur. Aprés avoir ajouté les règles précédentes dans notre script, voila à quoi notre script doit ressembler :

SSHiptables02

Nous pourrons l'exécuter :

bash iptables.sh

Nous aurons alors l'affichage de nos règles si le "iptables -L" a bien été mis dans notre script :

SSHiptables01

Nous voyons donc bien qu'en entrée (Chain INPUT) et en sortie (Chain OUTPUT), tous les protocoles venant de n'importe quelle source et allant vers n'importe quelle destination sont refusés (DROP).

IV. Ouvrir le port SSH

Nous allons maintenant ouvrir notre port SSH en ajoutant les règles suivantes à notre script juste avant la ligne "iptables -t filter A INPUT -j DROP" :

# Autoriser les échanges sur le port 22 en entrée
iptables -t filter -A INPUT -p TCP --dport 22 -ACCEPT
# Autoriser les échanges sur le port 22 en sortie
iptables -t filter -A OUTPUT -p TCP --sport 22 -ACCEP?T

Voila donc à quoi ressemblera notre script Iptables :

SSHiptables04

Et voici ce que nous devrons avoir comme sortie une fois que nous exécuterons ce même script :

SSHiptables03

On voit donc bien que notre règle autorise le protocole TCP à communiquer en entrée et en sortie sur le source port (tcp spt:ssh) et destination port (tcp dpt:ssh) 22 qui est le port SSH depuis n'importe quelle IP source et IP destination. Ensuite viens notre règle qui ferme tous les autres ports (DROP).

Dés lors, nous pourrons initialiser une connexion SSH sur notre serveur.

V. Ouvrir le port SSH sur une seule interface :

Si notre serveur dispose de plusieurs interfaces, il peut être intéressant de n'autoriser les demandes de connexion SSH que depuis une seule de ces interfaces (celle connectée au réseau interne par exemple). Bien que ce paramètrage puisse se faire directement dans la configuration SSH, on peut également le faire avec iptables. Il nous suffit d''ajouter le nom de l'interface à ouvrir dans notre paramétrage,la ligne suivante :

iptables -t filter -A INPUT --dport 22 -j ACCEPT

deviendra si l'interface à écouter est eth1:

iptables -t filter -i eth1 -A INPUT --dport 22 -j ACCEPT

Note : "eth1" est ici spécifique à ma configuration.

Voila donc à quoi ressemblera notre script :

SSHIptables06

On exécutera donc notre script ("bash iptables.sh") puis nous pourrons effectuer des tests de vérification sur nos deux interfaces pour constater que seule celle précisée fonctionne sur les communications SSH.

VI. Ouvrir le port SSH que pour certaines IP source

Une sécurité supplémentaire serait de n'autoriser les connexions SSH uniquement depuis une seul plage d'IP ou une seule IP. Pour avoir plus d'information sur le filtrage par IP source, on peut utiliser la page manuel d'iptables :

man iptables

On trouve alors le paragraphe d'explication suivant :

SSHiptables07

L'option "-s" ou "--source" nous permet de spécifier une source qui sera sous la forme d'un nom de machine, d'un nom FQDN, d'une IP ou d'une plage IP. On peut utiliser l'écriture de masque en octal(255.255.255.0) ou en décimal (/24) et que l'option "--src" est un alias pour cette option. On améliore donc notre script comme suivant :

SSHiptables08

Il faut donc ajouter l'option "--src 192.168.1.19/32" pour n'autoriser que le poste à l'IP "192.168.1.19" à se connecter en SSH. On peut également préciser une plage d'IP entière si on joue avec le masque. Pour le réseau "192.168.1.0" on mettra "--src 192.168.1.0/24".

On peut également préciser que les sorties SSH ne pourront se faire que vers une IP ou une plage d'IP précise (ou encore un nom) en mettant l'option "--dst" dans la ligne "OUTPUT" sous la même forme que le "--src" de la ligne INPUT.

L'affichage des règles Iptables doit maintenant ressembler à cela :

SSHiptables09

On voit donc dans les colonnes "source" de "Chain INPUT" et "destination" de "Chain OUTPUT" que le port SSH (22) n'est ouvert que pour une IP précise.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Mickael Dorigny

Fondateur d’IT-Connect.fr et d’Information-security.fr.
Auditeur sécurité chez Amossys.

    mickael a publié 477 articles sur IT-Connect.See all posts by mickael

    4 réactions sur “Autoriser le SSH via Iptables

    • 24/03/2014 à 02:32
      Permalink

      slt merci pour ton tuto!!
      par contre moi je cherche à autoriser les acces en ssh pour toutes les IP.
      si j’ai bien compris ton tuto je pourrais comme tu as fais pour autoriser l’acces pour l’IP 192.168.1.19/32…!!
      je peux faire iptables -t filter -i eth1 –src 192.168.1.19/32 -A INPUT -p TCP –dport 22 -j ACCEPT

      merci d’avance pour ta reponse!!!

      Répondre
      • 24/03/2014 à 08:55
        Permalink

        Salut,
        Je pense que pour ne spécifier aucune IP et juste ouvrir le port SSH, tu peux prendre la même commande mais ne pas spécifier de src : iptables -t filter -i eth1 -A INPUT -p TCP –dport 22 -j ACCEPT. Il ouvrira alors simplement le port SSH sans restriction d’IP particulière. Tiens nous au courant !

        Répondre
    • 28/03/2014 à 13:47
      Permalink

      Chacun à sa façon de faire, mais perso je trouve plus logique de commencer le script en bloquant toutes les connexion et ensuite ouvrir les ports qui nous intéressent.

      De même pour utiliser le port par défaut d’un protocole, on peut très bien mettre son nom. Et il me semble que tu as oublié de drop la chaîne forward, je pense bien que rien passe par celui-ci sur un serveur, mais on sait jamais ^^

      Voici comment j’aurais fait le premier script :

      #!/bin/bash

      iptables -F
      iptables -X

      iptables -P OUTPUT DROP
      iptables -P INPUT DROP
      iptables -P FORWARD DROP

      iptables -t filter -A INPUT -p tcp –dport ssh -j ACCEPT
      iptables -t filter -A OUTPUT -p tcp –sport ssh -j ACCEPT

      Après il n’y a pas une façon de faire meilleur que l’autre. Mais si jamais certains ont une logique se rapprochant de la mienne, peut-être que cela pourra lui être utile ^^

      Sinon merci, car je ne savais pas qu’on pouvait supprimer les règles sur toutes les tables en un coup. Avant je faisais :

      iptables -t filter -F
      iptables -t nat -F
      iptables -t mangle -F

      Répondre
    • 03/11/2016 à 17:02
      Permalink

      bonjour,
      je voudrais remplacé le port 22 par 1733 comment faire?

      Répondre

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *