Configuration de iptables sur son serveur Ubuntu

Le pare-feu sert à contrôler tout ce qui transite au niveau du réseau de notre serveur.

La configuration minimal d’un pare-feu pour assurer la sécurité est de définir les règles pour tous les flux externe souhaitant entrer sur la machine. Par exemple, un visiteur souhaitant consulter une page web va essayer de passer par le port 80 du serveur et le pare-feu va autoriser ou non l’accès à ce service.

Pourquoi utiliser un pare-feu ?

L’utilisation du pare-feu va vous permettre de nombreuses chosez dont voici quelques exemples :

  • Limiter l’accès au port SSH à une ou plusieurs adresses connue
  • Empêcher un hacker ayant prit le contrôle de votre machine de faire tourner facilement un service autre que ceux autorisés.
  • Bloquer totalement l’accès à une machine.

Nous allons dans un premier temps configurer notre pare-feu à l’aide de iptables qui est l’outil par défaut sur Ubuntu Serveur puis dans un second temps, une fois que nous aurons validé la cohérence de nos règles, nous allons voir comment appliquer ces règles en permanence. Enfin, nous verrons la procédure pour modifier les règles sans prendre de risque.

Attention : nous partirons du principe que vous venez tout juste d’installer votre serveur. Si ce n’est pas le cas, prenez soin de bien réfléchir avant d’exécuter les commandes au risque de ne plus avoir l’accès à votre serveur !

Installation de iptables-persistent

Commençons par installer un paquet qui nous servira plus tard mais qui dans le cas présent va créer le dossier où nous stockerons toutes nos configurations.

apt install iptables-persistent

Ce paquet va vous demander si il doit récupérer la configuration actuelle. Vous pouvez dire oui aux deux questions car nous allons traiter à la fois l’ipv4 et l’ipv6.

Création des premières règles de filtrage

Rendons-nous dans le dossier /etc/iptabes/ pour regrouper toutes nos configurations au même endroit. Vous trouverez déjà deux fichiers présent à savoir rules.v4 et rules.v6 créé précédemment.

cd /etc/iptables/

Nous allons maintenant créer nos propres fichiers de configuration car lorsque iptables-persistent génère ses deux fichiers, il réécrit tout et ne permet pas de garder des commentaires. Il faut donc récupérer la configuration actuelle comme ceci :

iptables-save > /etc/iptables/regles.v4
ip6tables-save > /etc/iptables/regles.v6

Configuration de la partie ipv4

Ouvrez maintenant avec nano votre fichier de règles ipv4.

nano /etc/iptables/regles.v4

Dans mon cas, j’ai le fichier suivant qui est assez “vide” car fait sur une simple VM Ubuntu.

*filter
:INPUT ACCEPT [131:8952]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [75:7116]
COMMIT

Nous allons commencer par définir l’action par défaut du pare-feu : refuse l’accès à tout. Faites les modifications suivante en gras comme ci-dessous.

*filter
:INPUT DROP [131:8952]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [75:7116]
COMMIT;

Nous allons maintenant ajouter des règles juste avant la dernière ligne “COMMIT” comme l’exemple ci-dessous où nous avons ajouté quelques règles avec en plus un commentaire à la clé.

*filter
:INPUT DROP [131:8952]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [75:7116]

#Boucle local
-A INPUT -i lo -j ACCEPT

#Autoriser les connexions deja etablies
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

COMMIT;

La configuration ci-dessus permet de laisser les services communiquer en local librement ce qui permet d’éviter des problèmes entre les services de la machine. La deuxième règle permet de laisser une connexion déjà ouverte continuer à exister ce qui est le cas de votre accès SSH avec lequel vous êtes en train de configurer votre pare-feu.

Important : La lecture des règles se fait comme dans tous les pare-feu : de haut en bas. Cela signifie que pour un paquet arrivant sur votre machine, le pare-feu va tester toutes les lignes les unes après les autres et si jamais aucune ligne ne correspond, il fera l’action par défaut qui dans notre cas est de refuser le paquet.

Ajouter l’accès aux services SSH et Web

Nous allons maintenant ajouter quelques règles pour autoriser les connexion SSH pour une adresse ip spécifique et les accès à un serveur Apache 2 en HTTP et HTTPS. Ces règles sont à placer de préférence entre notre ligne pour la boucle locale et les connexion déjà établies.

#SSH
-A INPUT -s xxx.xxx.xxx.xxx -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
#HTTP/HTTPS
-A INPUT -p tcp -m tcp -i eth0 --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp -i eth0 --dport 443 -j ACCEPT

Alors plusieurs remarques sont à porter à votre attention :

  1. L’adresse ip xxx.xxx.xxx.xxx est à modifier par l’adresse ip de votre ordinateur si vous travaillez dans le LAN ou de votre routeur si votre serveur est hébergé ailleurs.
  2. Si vous avez suivit ce tutoriel pour changer le port d’écoute de SSH, il faut modifier le paramètre –dport de la ligne.
  3. Il faut vérifier que l’interface renseignée est valide. Vous pouvez voir son nom en utilisant la commande ifconfig et copier-coller l’interface qui correspond à l’adresse ip de votre machine.

Dans l’exemple ci-dessus, la commande ifconfig à retourné la configuration d’une machine virtuelle où mon adresse IP du serveur est 192.168.45.51 et donc le nom de l’interface que je dois renseigner dans les règles iptables est enp0s8.

Interdire l’accès une machine

Si pour une raison ou une autre vous souhaitez interdire l’accès à votre serveur à une machine dont vous connaissez l’adresse ip (y compris les services normalement autorisés), vous pouvez ajouter la règle ci-dessous.

#Bloquer toutes les connexions
-A INPUT -s xxx.xxx.xxx.xxx -j DROP
Comme nous l’avons vu précédemment, il faut définir cette règle en haut de la liste pour être certain qu’elle soit la première règle appliquée pour cet machine.

Configuration de la partie ipv6

Voici ci-dessous notre configuration ipv6 avec les changements en gras.

:INPUT DROP [35:2585]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [2:265]
#Laisser les connexions deja etablit
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT

Nous avons fait le minimum syndical et notez que vous pouvez faire la même chose qu’avec l’ipv4 si vous souhaitez avoir votre serveur accessible en ipv6. A vous de jouer !

Autoriser le ping chez OVH

Si vous louez une machine chez OVH et que vous mettez en l’état nos règles iptables, vous aurez probablement des mails d’alerte pour vous indiquer que votre machine n’est plus “active” et qu’un reboot va être effectué par leur robot de maintenance. Ce problème vient du fait que OVH monitor votre machine à l’aide de l’ICMP (appelé également ping).

Vous avez deux solutions, soit couper le monitoring ce que est déconseillé soit ajouter quelques règles dans votre configuration pour autoriser OVH à “pinger” votre machine.

Voici les règles pour un serveur hébergé à Roubaix.

#ICMP OVH
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s proxy.ovh.net -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s a2.ovh.net -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s 92.222.184.0/24 -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s 92.222.185.0/24 -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s 92.222.186.0/24 -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s 167.114.37.0/24 -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s proxy.p19.ovh.net -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s proxy.rbx.ovh.net -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s proxy.sbg.ovh.net -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s proxy.bhs.ovh.net -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s ping.ovh.net -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s 37.187.231.251 -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s xx.xx.xx.249 -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s xx.xx.xx.250 -j ACCEPT
-A INPUT -i eth0 -p icmp -d ns359885.ip-37-187-22.eu -s xx.xx.xx.251 -j ACCEPT

L’adresse IP en gras 37.187.231.251 est à modifier si vous hébergé un serveur dans un autre data center. Je vous invite à vous référer à la documentation officielle de OVH qui fourni la liste complète.

Pour les ip xx.xx.xx.249, xx.xx.xx.250 et xx.xx.xx.251, la règles est de remplacer xx.xx.xx par le début de l’adresse IP de votre machine. Par exemple, si ma machine a l’ip 1.2.3.4, je devrais remplacer xx.xx.xx par 1.2.3.

Mise en place des règles

Maintenant que nous avons rédigé nos belles règles, nous allons injecter la configuration dans notre pare-feu.

iptables-restore < /etc/iptables/regles.v4
ip6tables-restore < /etc/iptables/regles.v6

Vous pouvez valider que les règles sont bien chargées dans votre pare-feu à l’aide de la commande suivante :

iptables -L

Vous verrez apparaître toutes vos règles comme l’écran ci-dessous.

Une fois ces règles en place, vous allez de voir tester au moins que l’accès SSH est toujours possible. Tant que vous ne fermez pas le terminal actuellement ouvert, vous avez toujours possibilité de changer votre configuration en cas de problème.

Si vous perdez la connexion avec votre serveur après avoir appliqué la configuration cela signifie que vous n’avez pas bien configuré la partie avec SSH. Pour reprendre la main sur votre machine, vous n’aurez pas d’autre solution que de faire un “hard reboot” de votre machine.

Laissez vous un peu de temps pour bien tester que tout fonctionne avant de passer à la suite.

Appliquer la configuration à chaque démarrage

Nous avons rédigé nos règles, nous avons fait en sorte que tout fonctionne correctement et il ne nous reste plus qu’à appliquer ces règles à chaque démarrage.

Au début nous avons installé le paquet iptables-persistent qui s’occupe d’appliquer nos règles au démarrage de la machine. Il nous restent juste à mettre à jour les fichiers /etc/iptables/rules.v4 et /etc/iptables/rules.v6 qui sont ceux lu au démarrage du serveur.

dpkg-reconfigure iptables-persistent;

La commande ci-dessus va vous permettre de relancer le processus de configuration du paquet et donc de récupérer la configuration actuelle du pare-feu. C’est aussi simple que ça !

Modifier les règles

Maintenant que tout est en place et fonctionnel il ne faut pas tout casser.

La procédure suivante permet d’effectuer toutes vérifications lorsqu’on modifie une règle car l’erreur est souvent de modifier à la hâte la configuration à chaud et d’oublier de reporter dans les fichiers de configuration. Et quelques mois après quand on reboot le serveur on ne sait pas pourquoi plus rien ne marche…

  1. Modification du fichier de règles
    nano /etc/iptables/regles.v4
  2. Appliquer la modification à chaud
    iptables-restore < /etc/iptables/regles.v4
  3. Vérifier que tout fonctionne comme prévu
  4. Enregistrer définitivement la nouvelle règle
    dpkg-reconfigure iptables-persistent

Conclusion

Nous avons donc vu les grandes étapes pour s’assurer un minimum de sécurité et maintenant, la configuration d’un pare-feu sur un serveur Ubuntu n’a plus de secret pour vous !

Laisser un commentaire