Autoriser le SSH via Iptables
Sommaire
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 :
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 :
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 -j ACCEPT # Autoriser les échanges sur le port 22 en sortie iptables -t filter -A OUTPUT -p TCP --sport 22 -j ACCEPT
Voila donc à quoi ressemblera notre script Iptables :
Et voici ce que nous devrons avoir comme sortie une fois que nous exécuterons ce même script :
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 :
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 :
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 :
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 :
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.
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!!!
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 !
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
bonjour,
je voudrais remplacé le port 22 par 1733 comment faire?
Crétin. As-tu lu l’article au moins ?