Comment isoler les serveurs d'un réseau privé à l'aide d'Iptables
Introduction
Dans ce tutoriel, nous allons vous apprendre à utiliser un Iptables avec DigitalOcean Private Networking. Nous expliquerons également pourquoi vous voudriez faire cela et donnerons un exemple de la façon de l'implémenter dans votre propre environnement. L'exemple donné dans ce tutoriel vous expliquera le concept de manière à ce que vous puissiez adapter la configuration à vos propres besoins.
L'option de mise en réseau privée de DigitalOcean accorde une deuxième interface de mise en réseau à un VPS, qui n'est accessible qu'aux autres serveurs provisionnés sur le même compte qui sont également situés dans le même centre de données. Cela signifie que les données envoyées via l'interface privée d'un Droplet ne sont accessibles qu'aux membres de votre équipe ou ayant accès à votre mot de passe DO.
Remarque : Ce tutoriel couvre la sécurité IPv4. Sous Linux, la sécurité IPv6 est maintenue séparément d'IPv4. Par exemple, iptables
ne gère que les règles de pare-feu pour les adresses IPv4, mais il a un équivalent IPv6 appelé ip6tables
, qui peut être utilisé pour gérer les règles de pare-feu pour les adresses réseau IPv6.
Si votre VPS est configuré pour IPv6, n'oubliez pas de sécuriser vos interfaces réseau IPv4 et IPv6 avec les outils appropriés. Pour plus d'informations sur les outils IPv6, reportez-vous à ce guide : Comment configurer les outils pour utiliser IPv6 sur un VPS Linux .
Exemple de scénario
Pour notre exemple, nous utiliserons l'environnement créé par le tutoriel suivant : Comment optimiser les performances de WordPress avec la réplication MySQL sur Ubuntu 14.04 .
Voici un schéma de ce à quoi ressemble l'environnement :
L'exemple d'environnement utilise cinq VPS (et iptables n'est pas configuré) :
- haproxy-www : équilibreur de charge proxy inverse
- wordpress-1 : Premier serveur d'applications
- wordpress-2 : Deuxième serveur d'applications
- mysql-1 : serveur de base de données MySQL maître
- mysql-2 : serveur de base de données MySQL esclave
Si votre configuration ne ressemble pas à ceci, vous devriez toujours pouvoir suivre. De plus, si vous souhaitez en savoir plus sur la configuration d'un VPS avec un réseau privé ou les bases d'iptables, voici quelques liens qui pourraient vous être utiles (ce tutoriel suppose que vous connaissez les bases d'iptables) :
- Comment configurer et utiliser le réseau privé DigitalOcean
- Comment activer le réseau privé DigitalOcean sur les gouttelettes existantes
- Comment fonctionne le pare-feu Iptables
- Comment configurer un pare-feu à l'aide d'Iptables sur Ubuntu 14.04
Si vous êtes déjà familiarisé avec les concepts et que vous souhaitez voir la configuration d'iptables, n'hésitez pas à passer à la section Présentation de la configuration d'Iptables.
Notre objectif
Lorsque nous aurons terminé avec ce didacticiel, nous devrions avoir un environnement qui ressemble à quelque chose comme le diagramme suivant :
Tous les serveurs de la zone de réseau privé ne peuvent être communiqués qu'avec d'autres serveurs de ce réseau privé (la case orange). L'équilibreur de charge sera accessible via Internet et sera également relié au réseau privé. L'application de cette politique sera mise en œuvre via iptables sur chaque serveur.
Remarque : Pour bloquer le trafic vers votre interface publique, vous pouvez soit désactiver votre interface publique, soit configurer des règles de pare-feu pour obtenir un effet similaire avec Iptables. Nous allons opter pour l'option pare-feu car nous pouvons le configurer pour bloquer le trafic réseau indésirable, tout en permettant à notre serveur d'accéder à Internet lorsqu'il initie la connexion (ceci est utile pour des choses comme le téléchargement de mises à jour sur le serveur).
Façons d'accéder à votre VPS
Avant d'aborder la façon de verrouiller votre propre réseau privé, nous discuterons des différentes méthodes pour accéder à vos serveurs (en particulier la ligne de commande). Connaître toutes les méthodes de connexion à votre serveur est particulièrement important car vous pouvez vous verrouiller hors de votre propre serveur si vous ne faites pas attention.
Si vous avez une configuration de réseau privé sur votre VPS DigitalOcean, vous avez trois façons d'y accéder :
- Interface publique
- Interface privée
- Accès à la console du panneau de configuration
Interface publique
L'interface publique est accessible via l'Internet mondial. Cela signifie que vous, ou n'importe qui d'autre sur Internet, pouvez accéder à cette interface à moins qu'elle ne soit verrouillée.
Une interface publique est nécessaire sur les serveurs qui doivent être accessibles via Internet, afin que vos clients ou utilisateurs puissent se connecter à n'importe quel service que vous fournissez (par exemple une page Web ou une application). Si elle doit être accessible par un utilisateur, l'adresse IP d'une interface publique est généralement associée à un nom de domaine (par exemple exemple.com) via DNS.
Chaque VPS a une interface publique activée par défaut. Dans ce didacticiel, nous utiliserons iptables pour limiter l'interface publique afin qu'elle n'accepte que le trafic réseau nécessaire au bon fonctionnement de notre application (c'est-à-dire HTTP).
Interface privée
L'interface privée n'est accessible qu'aux autres VPS du même réseau privé. Dans le cas de DigitalOcean, cela signifie que seuls les autres VPS provisionnés sous le même compte peuvent accéder à l'interface privée.
Si vous êtes connecté à plusieurs VPS sous le même compte, vous pouvez vous connecter à l'interface privée d'un autre VPS via SSH. Par exemple, vous pouvez vous connecter en SSH à l'interface publique de haproxy-www, puis en SSH à l'interface privée de mysql-1 à partir de là. Ceci est utile si vous utilisez iptables pour supprimer les connexions SSH de l'interface publique de certains de vos serveurs.
Dans ce didacticiel, nous limiterons le trafic réseau sur les interfaces privées aux seuls VPS de notre « réseau privé » défini (la case orange dans le schéma ci-dessus) et à certains autres trafics réseau nécessaires (entre l'équilibreur de charge et les serveurs d'application) .
Accès à la console du panneau de configuration
Si vous perdez l'accès à vos interfaces publiques et privées, vous pouvez vous connecter à votre VPS via l'accès à la console. Dans le monde réel, cela revient à connecter un clavier, une souris et un moniteur directement à votre serveur. N'oubliez pas que vous pouvez toujours accéder à votre VPS de cette façon, si vous désactivez accidentellement vos deux interfaces ou votre service SSH.
Remarque : Si vos connexions VPS sont toutes authentifiées avec des clés SSH, vous devrez réinitialiser le mot de passe root via le panneau de configuration pour vous connecter via la console.
Identifier les exigences d'accès à l'interface/au port
Avant de continuer, il est important de déterminer vos exigences d'interface et d'accès au port. De nombreuses applications utilisent des ports par défaut ou peuvent être configurées pour se lier à des interfaces et des ports spécifiques. Ne modifiez pas votre configuration iptables tant que vous n'êtes pas certain de vos besoins en matière de politique, car un pare-feu mal configuré peut potentiellement casser votre application.
Voici une ventilation des besoins d'accès au réseau de notre exemple de scénario :
- haproxy-www :
- wordpress-1 : (tous privés)
- wordpress-2 : (tous privés)
- mysql-1 : (tous privés)
- mysql-2 : Serveur de base de données MySQL esclave
Vous voudrez également autoriser SSH à au moins une des interfaces publiques et SSH entre tous les serveurs de la zone de réseau privé. Dans l'exemple, nous autoriserons le SSH public vers un autre VPS appelé tunnel-1, et uniquement le SSH privé sur les autres serveurs. Cela signifie que nous aurons besoin d'un tunnel SSH via le tunnel-1 vers SSH vers n'importe quel des autres serveurs. Techniquement, vous pouvez utiliser n'importe lequel (ou tous) vos VPS à cette fin.
Maintenant que nous savons ce que notre pare-feu doit accepter, et potentiellement supprimer, passons à sa configuration.
Présentation de la configuration d'Iptables
Voici un aperçu de la façon dont nous allons configurer iptables pour répondre à nos besoins :
- Drop par défaut
- Autoriser SSH depuis l'interface de réseau privé vers tunnel-1 VPS
- Autoriser le trafic Internet initié à partir de votre serveur
- Autoriser explicitement le trafic réseau privé spécifique (par adresse IP et/ou port)
Commençons par haproxy-www, notre seul serveur public. Notez que dans les commandes iptables
, eth0 fait référence à l'interface publique d'un VPS, et eth1 fait référence à l'interface privée d'un VPS - si vos noms d'interface diffèrent, veuillez les remplacer le cas échéant.
Configurer le serveur public (haproxy-www)
SSH vers tunnel-1 :
utilisateur ssh @ tunnel_1_public_IP
À partir de là, connectez-vous en SSH à l'interface privée de haproxy-www :
utilisateur ssh @ haproxy_www_private_IP
Sur haproxy-www, définissez toutes les chaînes par défaut sur ACCEPTER et supprimez toutes les règles existantes :
sudo iptables -P INPUT ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -F
Autorisez tunnel-1 à se connecter en SSH via son interface privée vers haproxy-www :
sudo iptables -A INPUT -p tcp -s tunnel_1_private_IP --dport 22 -i eth1 -j ACCEPTER sudo iptables -A OUTPUT -p tcp -d tunnel_1_private_IP --sport 22 -o eth1 -m state --state ESTABLISHED -j ACCEPT
Autorisez le trafic de bouclage sur votre serveur. Cela permet à votre serveur d'utiliser 127.0.0.1 ou localhost :
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT
Autorisez le trafic public et privé initié à partir de votre serveur. Cela permettra à votre serveur d'accéder à Internet pour faire des choses comme télécharger des mises à jour ou des logiciels :
sudo iptables -I SORTIE -o eth0 -d 0.0.0.0/0 -j ACCEPTER sudo iptables -I ENTRÉE -i eth0 -m état --état ÉTABLI, CONNEXE -j ACCEPTER
Autorisez tout le trafic HTTP (port 80) sur l'interface publique. Ceci est nécessaire pour que les utilisateurs puissent accéder à notre site via http://www.example.com/ :
sudo iptables -A ENTRÉE -i eth0 -p tcp --dport 80 -m état --état NOUVEAU, ÉTABLI -j ACCEPTER sudo iptables -A SORTIE -o eth0 -p tcp --sport 80 -m état --état ÉTABLI - J'ACCEPTE
Autorisez les deux serveurs WordPress à accéder au port 80 via leurs adresses IP privées :
sudo iptables -A INPUT -p tcp -s wordpress_1_private_IP --sport 80 -j ACCEPT sudo iptables -A OUTPUT -p tcp -d wordpress_1_private_IP --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp -s wordpress_2_private_IP --sport 80 -j ACCEPTER sudo iptables -A SORTIE -p tcp -d wordpress_2_private_IP --dport 80 -j ACCEPTER
Maintenant que nous avons autorisé tout le trafic réseau nécessaire, nous pouvons supprimer tout autre trafic en définissant DROP
comme comportement par défaut pour chaque chaîne iptables :
sudo iptables -P INPUT DROP sudo iptables -P OUTPUT DROP sudo iptables -P FORWARD DROP
Maintenant que vous avez terminé de configurer le pare-feu de haproxy-www, vous voudrez vous assurer que tout fonctionne correctement. Si vous êtes satisfait de votre configuration, vous pouvez la sauvegarder en installant le package iptables-persistent avec les commandes apt suivantes :
sudo apt-get update sudo apt-get install iptables-persistent
Lors de l'installation d'iptables-persistent, il vous sera demandé si vous souhaitez enregistrer vos paramètres de pare-feu actuels. Répondez oui.
Désormais, le pare-feu haproxy-www permet ce qui suit :
- SSH depuis tunnel-1 via le réseau privé
- Trafic en boucle
- Activité Internet initiée par haproxy-www
- HTTP sur Internet public
- HTTP entre lui-même et les serveurs d'applications WordPress
- Aucun trafic entrant provenant d'autres sources
Passons à la sécurisation de nos serveurs restants.
Configurer les serveurs de réseau privé
Remarque : Effectuez toutes ces étapes pour tous les serveurs restants : wordpress-1, wordpress-2, mysql-1 et [X127X ]mysql-2. Nous ferons référence à ces serveurs, généralement, comme private-VPS dans cette section.
En raison du grand nombre d'interfaces réseau et de ports qui nécessitent une communication au sein du réseau privé, nous simplifierons les choses en mettant sur liste blanche les adresses IP nécessaires au lieu de n'autoriser que des combinaisons spécifiques d'adresse IP et de port. De plus, nous autoriserons le trafic sortant par défaut et restreindrons simplement le trafic entrant.
SSH vers tunnel-1 :
utilisateur ssh @ tunnel_1_public_IP
À partir de là, connectez-vous en SSH à l'interface private de private-VPS :
utilisateur ssh @ private_VPS_private_IP
Sur private-VPS, définissez toutes les chaînes par défaut sur ACCEPT et supprimez toutes les règles existantes :
sudo iptables -P INPUT ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -F
Autoriser tunnel-1 à SSH via son interface privée vers private-VPS :
sudo iptables -A INPUT -p tcp -s tunnel_1_private_IP --dport 22 -i eth1 -j ACCEPTER
Autorisez le trafic de bouclage sur votre serveur. Cela permet à votre serveur d'utiliser 127.0.0.1 ou localhost :
sudo iptables -A INPUT -i lo -j ACCEPT
Autorisez le trafic public et privé initié à partir de votre serveur. Cela permettra à votre serveur d'accéder à Internet pour faire des choses comme télécharger des mises à jour ou des logiciels :
sudo iptables -I ENTRÉE -i eth0 -m état --état ÉTABLI, CONNEXE -j ACCEPTER
Ajoutez à la liste blanche tous les serveurs qui n'ont besoin que d'accéder à la zone de réseau privé (vous pouvez omettre l'entrée du serveur sur lequel vous travaillez) :
sudo iptables -A INPUT -p tcp -s wordpress_1_private_IP -j ACCEPTER sudo iptables -A INPUT -p tcp -s wordpress_2_private_IP -j ACCEPTER sudo iptables -A INPUT -p tcp -s mysql_1_private_IP -j ACCEPTER sudo iptables -A INPUT -p tcp -s mysql_2_private_IP -j ACCEPTER
Uniquement sur les deux serveurs WordPress, autorisez l'accès HTTP haproxy-www (port 80), afin qu'il puisse récupérer les pages :
sudo iptables -A INPUT -p tcp -s haproxy_www_private_IP --sport 80 -j ACCEPTER sudo iptables -A OUTPUT -p tcp -d haproxy_www_private_IP --dport 80 -j ACCEPTER
Supprimez les chaînes INPUT et FORWARD par défaut. Notez que nous laissons la valeur par défaut de OUTPUT sur ACCEPT, car nous faisons confiance aux serveurs de notre réseau privé :
sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP
Maintenant que vous avez terminé de configurer le pare-feu de Private-VPS, vous voudrez vous assurer que tout fonctionne correctement. Si vous êtes satisfait de votre configuration, vous pouvez la sauvegarder en installant le package iptables-persistent avec les commandes apt suivantes :
sudo apt-get update sudo apt-get install iptables-persistent
Lors de l'installation d'iptables-persistent, il vous sera demandé si vous souhaitez enregistrer vos paramètres de pare-feu actuels. Répondez oui.
Désormais, le pare-feu private-VPS permet ce qui suit :
- SSH depuis tunnel-1 via le réseau privé
- Trafic en boucle
- Activité Internet initiée par le VPS privé
- Tout le trafic réseau sortant
- Tout le trafic réseau entrant entre les serveurs qui ont été mis sur liste blanche (c'est-à-dire tous les serveurs de la zone de réseau privé)
- Aucun trafic entrant provenant d'autres sources
Dépannage : liste Iptables et journalisation
Si vous configurez votre pare-feu et constatez que votre application cesse de fonctionner, la meilleure façon de le dépanner est de consulter la liste des politiques et les journaux.
Afficher la configuration d'Iptables
Pour afficher la configuration ou la liste des règles d'iptables, exécutez la commande suivante :
sudo iptables -vL --line-numbers
Cela affichera toutes les chaînes et règles que vous avez configurées, avec les numéros de ligne. En outre, il indique le nombre de paquets abandonnés. Si vous n'attendez aucun paquet abandonné, vérifiez les journaux.
Lire les journaux Iptables
Créez une nouvelle chaîne appelée LOG :
iptables -N LOG
Acheminez INPUT/OUTPUT/FORWARD vers la chaîne LOG (remplacez CHAIN
par la chaîne que vous souhaitez surveiller, telle que "INPUT") :
iptables -A ENTRÉE -j JOURNAL
Enregistrez maintenant les paquets avec cette commande :
iptables -A LOG -m limit --limit 60/min -j LOG --log-prefix "Iptables DROP: " --log-level 7
Vous pouvez maintenant surveiller les messages de votre système pour voir quels paquets sont rejetés.
Dans Ubuntu, les messages peuvent être lus en temps réel avec la commande suivante :
sudo tail -f /var/log/syslog
Dans CentOS, les messages peuvent être lus en temps réel avec la commande suivante :
sudo tail -f /var/log/messages
Les journaux répertorient l'interface, le port source, le port de destination et d'autres informations sur chaque paquet abandonné. Cela devrait vous aider à comprendre les problèmes que vous pourriez avoir.
Conclusion
Après avoir suivi ce tutoriel, vous devriez avoir une bonne base pour utiliser iptables afin de protéger vos VPS de l'Internet public et des autres VPS au sein du même réseau privé partagé (c'est-à-dire le même centre de données). N'oubliez pas que vous devrez mettre à jour votre pare-feu lorsque vous ajouterez de nouveaux serveurs ou modifierez la configuration de votre serveur.