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.
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.
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 :
- 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.
- Si vous avez suivit ce tutoriel pour changer le port d’écoute de SSH, il faut modifier le paramètre –dport de la ligne.
- 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
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.
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…
- Modification du fichier de règles
nano /etc/iptables/regles.v4 - Appliquer la modification à chaud
iptables-restore < /etc/iptables/regles.v4 - Vérifier que tout fonctionne comme prévu
- 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 !