Comment configurer un pare-feu en utilisant Iptables sur Ubuntu 14.04
Vous n'utilisez pas Ubuntu 14.04 ? Choisissez une version ou une distribution différente.
Introduction
La configuration d'un bon pare-feu est une étape essentielle pour sécuriser tout système d'exploitation moderne. La plupart des distributions Linux sont livrées avec plusieurs outils de pare-feu que nous pouvons utiliser pour configurer nos pare-feux. Dans ce guide, nous allons aborder le pare-feu iptables.
Iptables est un pare-feu standard inclus par défaut dans la plupart des distributions Linux (une variante moderne appelée nftables commencera à le remplacer). Il s'agit en réalité d'une interface pour les hooks netfilter au niveau du noyau qui peuvent manipuler la pile réseau Linux. Il fonctionne en faisant correspondre chaque paquet qui traverse l'interface réseau contre un ensemble de règles pour décider quoi faire.
Dans le guide précédent, nous avons appris comment fonctionnent les règles iptables pour bloquer le trafic indésirable. Dans ce guide, nous allons passer à un exemple pratique pour démontrer comment créer un ensemble de règles de base pour un serveur Ubuntu 14.04. Le pare-feu résultant permettra le trafic SSH et HTTP.
Remarque : Ce tutoriel couvre la sécurité IPv4. Dans Linux, la sécurité IPv6 est maintenue séparément de l'IPv4. Par exemple, “iptables” maintient uniquement les règles de pare-feu pour les adresses IPv4, mais il a un homologue IPv6 appelé “ip6tables”, qui peut être utilisé pour maintenir les règles de pare-feu pour les adresses réseau IPv6.
Si votre VPS est configuré pour IPv6, veuillez vous rappeler de sécuriser à la fois vos interfaces réseau IPv4 et IPv6 avec les outils appropriés. Pour plus d'informations sur les outils IPv6, référez-vous à ce guide : Comment configurer des outils pour utiliser IPv6 sur un VPS Linux.
Conditions préalables
Avant de commencer à utiliser ce tutoriel, vous devez avoir un compte superutilisateur séparé, non-root—un utilisateur avec des privilèges sudo—configuré sur votre serveur. Si vous devez le configurer, suivez ce guide : Configuration initiale du serveur avec Ubuntu 14.04.
Commandes de base iptables
Maintenant que vous avez une bonne compréhension des concepts d'iptables, nous devrions aborder les commandes de base qui seront utilisées pour former des ensembles de règles complexes et pour gérer l'interface iptables en général.
Tout d'abord, vous devez être conscient que les commandes iptables doivent être exécutées avec des privilèges d'administrateur. Cela signifie que vous devez vous connecter en tant que root, utiliser su ou sudo -i pour obtenir un shell root, ou précéder toutes les commandes par sudo. Nous allons utiliser sudo dans ce guide puisque c'est la méthode préférée sur un système Ubuntu.
Un bon point de départ est de lister les règles actuelles configurées pour iptables. Vous pouvez le faire avec le drapeau -L :
- sudo iptables -L
Output:Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Comme vous pouvez le voir, nous avons nos trois chaînes par défaut (INPUT, OUTPUT et FORWARD). Nous pouvons également voir la politique par défaut de chaque chaîne (chaque chaîne a ACCEPT comme politique par défaut). Nous voyons également quelques en-têtes de colonnes, mais nous ne voyons aucune règle réelle. C'est parce qu'Ubuntu ne fournit pas de jeu de règles par défaut.
Nous pouvons voir la sortie dans un format qui reflète les commandes nécessaires pour activer chaque règle et politique en utilisant plutôt le drapeau -S :
- sudo iptables -S
Output:-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
Pour reproduire la configuration, il suffira de taper sudo iptables suivi de chacune des lignes dans la sortie. (Selon la configuration, cela peut en fait être légèrement plus compliqué si nous sommes connectés à distance pour éviter d'instaurer une politique de rejet par défaut avant que les règles ne soient en place pour capturer et autoriser notre connexion actuelle.)
Si vous avez des règles en place et souhaitez les supprimer et repartir de zéro, vous pouvez annuler les règles actuelles en tapant :
- sudo iptables -F
Encore une fois, la politique par défaut est importante ici, car, bien que toutes les règles soient supprimées de vos chaînes, la politique par défaut ne changera pas avec cette commande. Cela signifie que si vous êtes connecté à distance, vous devez vous assurer que la politique par défaut de vos chaînes INPUT et OUTPUT est définie sur ACCEPT avant de vider vos règles. Vous pouvez le faire en saisissant:
- sudo iptables -P INPUT ACCEPT
- sudo iptables -P OUTPUT ACCEPT
- sudo iptables -F
Vous pouvez ensuite changer la politique de rejet par défaut en DROP après avoir établi des règles qui autorisent explicitement votre connexion. Nous allons voir comment faire cela dans un instant.
Faites votre première règle
Nous allons commencer à établir nos politiques de pare-feu. Comme nous l'avons dit précédemment, nous allons travailler avec la chaîne INPUT, car c'est le filtre par lequel le trafic entrant sera envoyé. Nous allons commencer par la règle dont nous avons parlé un peu plus haut : la règle qui accepte explicitement votre connexion SSH actuelle.
La règle complète dont nous avons besoin est la suivante :
- sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Cela peut sembler incroyablement compliqué, mais la plupart des choses auront du sens lorsque nous passerons en revue les composants :
-A INPUT: Le drapeau
-Aajoute une règle à la fin d'une chaîne. C'est la partie de la commande qui indique à iptables que nous souhaitons ajouter une nouvelle règle, que nous voulons que cette règle soit ajoutée à la fin de la chaîne, et que la chaîne sur laquelle nous voulons opérer est la chaîne INPUT.-m conntrack: iptables dispose d'un ensemble de fonctionnalités de base, mais possède également un ensemble d'extensions ou de modules qui fournissent des capacités supplémentaires.
Dans cette partie de la commande, nous déclarons que nous souhaitons avoir accès à la fonctionnalité fournie par le module
conntrack. Ce module donne accès à des commandes pouvant être utilisées pour prendre des décisions en fonction de la relation du paquet avec les connexions précédentes.–ctstate : C'est l'une des commandes mises à disposition par l'appel du module
conntrack. Cette commande nous permet de faire correspondre des paquets en fonction de leur relation avec des paquets que nous avons vus auparavant.Nous lui passons la valeur de
ESTABLISHEDpour autoriser les paquets qui font partie d'une connexion existante. Nous lui passons la valeur deRELATEDpour autoriser les paquets qui sont associés à une connexion établie. C'est la partie de la règle qui correspond à notre session SSH actuelle.-j ACCEPT : Cela spécifie la cible des paquets correspondants. Ici, nous disons à iptables que les paquets qui correspondent aux critères précédents doivent être acceptés et autorisés à passer.
Nous avons placé cette règle au début car nous voulons nous assurer que les connexions que nous utilisons déjà sont appariées, acceptées et retirées de la chaîne avant d'atteindre les règles de DROP.
Nous pouvons voir les changements si nous énumérons les règles :
- sudo iptables -L
Output:Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Maintenant que vous connaissez la syntaxe générale, continuons en ajoutant quelques cas supplémentaires où nous voulons accepter la connexion.
Accepter d'autres connexions nécessaires
Nous avons dit à iptables de garder ouvertes toutes les connexions qui sont déjà ouvertes et de permettre de nouvelles connexions liées à ces connexions. Cependant, nous devons créer certaines règles pour établir quand nous voulons accepter de nouvelles connexions qui ne répondent pas à ces critères.
Nous voulons garder deux ports ouverts spécifiquement. Nous voulons garder notre port SSH ouvert (nous allons supposer dans ce guide qu'il s'agit du port par défaut 22. Si vous avez modifié cela dans votre configuration SSH, modifiez votre valeur ici). Nous allons également supposer que cet ordinateur exécute un serveur web sur le port par défaut 80. Si ce n'est pas le cas pour vous, vous n'avez pas à ajouter cette règle.
Les deux lignes que nous allons utiliser pour ajouter ces règles sont :
- sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Comme vous pouvez le voir, ceux-ci sont très similaires à notre première règle, mais peut-être plus simples. Les nouvelles options sont :
- -p tcp: Cette option correspond aux paquets si le protocole utilisé est TCP. C'est un protocole basé sur la connexion qui sera utilisé par la plupart des applications car il permet une communication fiable.
- –dport : Cette option est disponible si le drapeau
-p tcpest donné. Elle impose une exigence supplémentaire de correspondance avec le port de destination pour le paquet correspondant. La première règle correspond aux paquets TCP destinés au port 22, tandis que la deuxième règle correspond au trafic TCP dirigé vers le port 80.
Il existe une règle d'acceptation supplémentaire que nous devons nous assurer que notre serveur peut fonctionner correctement. Souvent, les services sur l'ordinateur communiquent entre eux en s'envoyant des paquets réseau. Ils le font en utilisant une interface réseau pseudo appelée dispositif de bouclage, qui dirige le trafic vers lui-même plutôt que vers d'autres ordinateurs.
Donc, si un service souhaite communiquer avec un autre service qui écoute les connexions sur le port 4555, il peut envoyer un paquet au port 4555 du dispositif de boucle locale. Nous voulons que ce type de comportement soit autorisé, car il est essentiel pour le bon fonctionnement de nombreux programmes.
La règle que nous devons ajouter est la suivante :
- sudo iptables -I INPUT 1 -i lo -j ACCEPT
Cela semble un peu différent de nos autres commandes. Passons en revue ce qu'il fait :
-I INPUT 1: Le drapeau
-Iindique à iptables d'insérer une règle. C'est différent du drapeau-Aqui ajoute une règle à la fin. Le drapeau-Iprend une chaîne et la position de la règle où vous souhaitez insérer la nouvelle règle.Dans ce cas, nous ajoutons cette règle comme la toute première règle de la chaîne INPUT. Cela fera descendre les autres règles. Nous voulons cela en haut car c'est fondamental et ne devrait pas être affecté par les règles suivantes.
-i lo : Ce composant de la règle correspond si l'interface que le paquet utilise est l'interface « lo ». L'interface « lo » est un autre nom pour le dispositif de boucle de retour. Cela signifie que tout paquet utilisant cette interface pour communiquer (paquets générés sur notre serveur, pour notre serveur) devrait être accepté.
Pour voir nos règles actuelles, nous devrions utiliser le drapeau -S. Cela est dû au fait que le drapeau -L n'inclut pas certaines informations, comme l'interface à laquelle une règle est liée, ce qui est une partie importante de la règle que nous venons d'ajouter :
- sudo iptables -S
Output:-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Mise en œuvre d'une règle de suppression
Nous avons maintenant quatre règles distinctes qui acceptent explicitement les paquets en fonction de certains critères. Cependant, notre pare-feu ne bloque actuellement rien.
Si un paquet entre dans la chaîne INPUT et ne correspond à aucune des quatre règles que nous avons établies, il est transmis à notre politique par défaut, qui est d'accepter le paquet de toute façon. Nous devons changer cela.
Il y a deux façons différentes de faire cela, avec quelques différences assez importantes.
La première façon de faire cela est de modifier la politique par défaut de notre chaîne INPUT. Nous pouvons le faire en tapant :
- sudo iptables -P INPUT DROP
Cela attrapera tous les paquets qui passent par notre chaîne INPUT et les supprimera. C'est ce que nous appelons une politique de suppression par défaut. L'une des implications de ce type de conception est qu'elle revient à supprimer des paquets si les règles sont effacées.
Cela peut être plus sécurisé, mais cela peut également avoir de sérieuses conséquences si vous n'avez pas d'autre moyen d'accéder à votre serveur. Avec DigitalOcean, vous pouvez vous connecter via notre console Web pour accéder à votre serveur si cela se produit. La console Web fonctionne comme une connexion locale virtuelle, donc les règles iptables ne l'affecteront pas.
Vous pourriez souhaiter que votre serveur coupe automatiquement toutes les connexions en cas de dumping des règles. Cela empêcherait votre serveur d'être laissé complètement ouvert. Cela signifie également que vous pouvez facilement ajouter des règles à la fin de la chaîne tout en continuant à bloquer les paquets comme vous le souhaitez.
L'approche alternative consiste à conserver la politique par défaut de la chaîne comme acceptée et à ajouter une règle qui rejette tous les paquets restants en bas de la chaîne elle-même.
Si vous avez changé la politique par défaut pour la chaîne INPUT ci-dessus, vous pouvez la remettre à suivre en tapant :
- sudo iptables -P INPUT ACCEPT
Maintenant, vous pouvez ajouter une règle à la fin de la chaîne qui supprimera tous les paquets restants :
- sudo iptables -A INPUT -j DROP
Le résultat dans des conditions de fonctionnement normales est exactement le même qu'une politique de suppression par défaut. Cette règle fonctionne en faisant correspondre chaque paquet restant qui l'atteint. Cela empêche un paquet de jamais être supprimé complètement à travers la chaîne pour atteindre la politique par défaut.
En gros, cela est utilisé pour maintenir la politique par défaut d'accepter le trafic. De cette façon, s'il y a des problèmes et que les règles sont vidées, vous pourrez toujours accéder à la machine via le réseau. C'est une manière de mettre en œuvre une action par défaut sans modifier la politique qui sera appliquée à une chaîne vide.
Bien sûr, cela signifie également que toute règle supplémentaire que vous souhaitez ajouter à la fin de la chaîne devra être ajoutée avant la règle de suppression. Vous pouvez le faire en supprimant temporairement la règle de suppression :
- sudo iptables -D INPUT -j DROP
- sudo iptables -A INPUT new_rule_here
- sudo iptables -A INPUT -j DROP
Ou, vous pouvez insérer les règles dont vous avez besoin à la fin de la chaîne (mais avant la suppression) en spécifiant le numéro de ligne. Pour insérer une règle à la ligne numéro 4, vous pourriez taper :
- sudo iptables -I INPUT 4 new_rule_here
Si vous avez du mal à savoir à quel numéro de ligne correspond chaque règle, vous pouvez dire à iptables de numéroté les règles en tapant :
- sudo iptables -L --line-numbers
Output:Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere
2 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
3 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
4 ACCEPT tcp -- anywhere anywhere tcp dpt:http
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Cela peut être utile pour s'assurer que vous ajoutez votre règle à la position appropriée.
Lister et supprimer les règles Iptables
Si vous souhaitez apprendre les détails sur l'affichage et la suppression des règles iptables, consultez ce tutoriel : Comment lister et supprimer les règles du pare-feu Iptables.
Sauvegarder votre configuration Iptables
Par défaut, les règles que vous ajoutez à iptables sont éphémères. Cela signifie que lorsque vous redémarrez votre serveur, vos règles iptables seront perdues.
C'est en fait une fonctionnalité pour certains utilisateurs car cela leur donne un moyen de revenir s'ils se sont accidentellement exclus du serveur. Cependant, la plupart des utilisateurs souhaiteront un moyen d'enregistrer automatiquement les règles que vous avez créées et de les charger lorsque le serveur démarre.
Il existe plusieurs façons de le faire, mais la méthode la plus simple est d'utiliser le paquet iptables-persistent. Vous pouvez le télécharger depuis les dépôts par défaut d'Ubuntu :
- sudo apt-get update
- sudo apt-get install iptables-persistent
Lors de l'installation, il vous sera demandé si vous souhaitez enregistrer vos règles actuelles pour qu'elles soient chargées automatiquement. Si vous êtes satisfait de votre configuration actuelle (et que vous avez testé votre capacité à créer des connexions SSH indépendantes), vous pouvez choisir d'enregistrer vos règles actuelles.
Il vous demandera également si vous souhaitez enregistrer les règles IPv6 que vous avez configurées. Celles-ci sont configurées via un utilitaire séparé appelé ip6tables, qui contrôle le flux des paquets IPv6 de presque la même manière.
Une fois l'installation terminée, vous disposerez d'un nouveau service appelé iptables-persistent qui est configuré pour s'exécuter au démarrage. Ce service chargera vos règles et les appliquera lorsque le serveur sera démarré.
Mise à jour des enregistrements
Si vous mettez à jour votre pare-feu et souhaitez préserver les modifications, vous devez enregistrer vos règles iptables pour qu'elles soient persistantes.
Sauvegardez vos règles de pare-feu avec cette commande :
- sudo invoke-rc.d iptables-persistent save
Conclusion
Vous devriez maintenant avoir un bon point de départ pour développer un pare-feu qui répond à vos besoins. Il existe de nombreux autres utilitaires de pare-feu et certains qui peuvent être plus faciles, mais iptables est un bon outil d'apprentissage, ne serait-ce que parce qu'il expose une partie de la structure de netfilter sous-jacente et parce qu'il est présent dans tant de systèmes.
Pour en savoir plus sur la sécurisation de votre réseau avec iptables, consultez ces tutoriels :
- Comment mettre en œuvre un modèle de pare-feu de base avec Iptables sur Ubuntu 14.04
- Les essentiels d'Iptables : Règles et commandes courantes du pare-feu
- Comment configurer un pare-feu Iptables pour protéger le trafic entre vos serveurs
- Une plongée dans l'architecture d'Iptables et de Netfilter
- Comment tester la configuration de votre pare-feu avec Nmap et Tcpdump
