Présentation
Un guide de base pour sécuriser l'accès à votre serveur avec iptables.
Prérequis
Serveur exécutant CentOS 6.5 ou une version antérieure (ces instructions peuvent également fonctionner sous d'autres distributions de Linux, mais avec de légères modifications en fonction de la distribution ; cet article fonctionnera à partir de CentOS 6.5)
Si vous n'avez pas encore de serveur, envisagez de lancer un serveur privé virtuel à partir d'Atlantic.Net
iptables installé
Commencer avec IPTables de base via la ligne de commande
Tout d'abord, vérifions qu'iptables est installé et actif (toutes ces commandes nécessiteront des privilèges root, assurez-vous donc que votre utilisateur a accès à ces privilèges - ou, si vous préférez, élevez-vous à root et évitez d'avoir à préfacer tout vos commandes avec 'sudo')
sudo service iptables status
état du service iptables
Pour ce nouveau serveur, iptables ne fonctionne pas, il autorise donc actuellement tout le trafic. Pas bon. Réglons cela.
Pour couvrir certaines bases, nous allons définir le comportement par défaut pour supprimer tout le trafic et n'autoriser qu'un certain trafic (il s'agit d'une pratique de sécurité souvent appelée "liste blanche"). Nous allons d'abord tout faire sur la ligne de commande, puis nous allons le configurer pour que ces règles soient persistantes lors des redémarrages.
Commençons par démarrer le service, puis vérifions ce qui est en cours d'exécution.
sudo service iptables start
sudo service iptables status
Notez que la politique par défaut dans chacune de ces chaînes est d'accepter le trafic. Modifions la valeur par défaut pour INPUT pour supprimer le trafic. (ATTENTION :assurez-vous d'avoir au moins une règle ACCEPT dans la chaîne INPUT pour autoriser l'adresse IP de votre poste de travail ou le port 22 si vous accédez à ce serveur à distance via ssh. Dans la sortie ci-dessus de l'état iptables, notez que le trafic TCP vers le port 22 ("tcp dpt:22") est accepté. Si cette règle n'existait pas, nous pourrions nous exclure de ce serveur !)
sudo iptables -P INPUT DROP
Le '-P ' indique que nous allons modifier la politique générale, 'INPUT ‘ est la chaîne particulière à modifier, et ‘DROP ‘ est la cible de stratégie par défaut.
Maintenant, ajoutons quelques règles spécifiques.
Tout d'abord, nous allons autoriser l'accès au trafic HTTP et HTTPS, que nous voulons accessible depuis n'importe quelle adresse IP. Lors de l'ajout de règles à iptables, il est important de faire attention à l'ordre de ces règles car iptables analyse les règles dans l'ordre et traitera le trafic en fonction de la cible indiquée dans la règle, puis quittera la chaîne (dans la plupart des cas). Dans la sortie ci-dessus, notez que la dernière règle rejettera le trafic. Si nous ajoutons une règle d'autorisation à la fin de cette chaîne, elle ne sera jamais invoquée, car la règle de rejet située au-dessus rejettera le trafic et arrêtera de traiter les règles suivantes dans la chaîne INPUT.
Alors, découvrons à quel numéro de ligne nous voulons insérer notre nouvelle règle :
sudo iptables -nL INPUT --line-numbers
Statut d'Iptables
Le '-nL ‘ combine quelques drapeaux :‘n ' ignore la résolution DNS (afin que nous puissions voir quelles adresses IP chaque règle examine); ‘L ‘ répertorie chaque règle dans la chaîne indiquée. La dernière option, '–numéros de ligne ', de manière appropriée, ajoute des numéros de ligne à chaque entrée de règle. (Cette sortie est similaire à ce que vous pourriez obtenir avec 'sudo service iptables status ', mais cette commande fournit les règles pour toutes les chaînes, alors que le 'iptables ' la commande ci-dessus nous donne les moyens de réduire la portée de la sortie par chaîne individuelle.)
Dans ce cas, nous insérerons nos règles juste au-dessus de la règle de rejet :
sudo iptables -I INPUT 5 -m tcp -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 6 -m tcp -p tcp --dport 443 -j ACCEPT
Liste Iptables avec numéros de ligne
Qu'est-ce que tout cela signifie ?
* '-je ' indique que nous allons insérer cette règle au numéro de ligne indiqué (le numéro suivant le nom de la chaîne dans laquelle nous insérons la règle).
* ‘-m tcp -p tcp –dport 80 ‘ spécifie que cette règle correspondra aux paquets TCP arrivant avec un port de destination de 80 (ou 443, dans le cas de la deuxième règle).
* '-j ACCEPTER ' indique que, si cette règle correspond, alors "sautez" ce paquet vers la cible ACCEPTER (ce qui est le long chemin pour dire qu'il est autorisé).
Notez qu'une fois que nous avons entré la première commande, la règle de rejet serait poussée jusqu'à la ligne numéro 6, c'est pourquoi la deuxième règle s'insère sur la ligne numéro 6.
Ajoutons maintenant une règle pour autoriser l'accès à partir d'une adresse IP particulière, quel que soit le type de trafic ou de port.
sudo iptables -I INPUT 4 -s 192.168.0.1 -j ACCEPT
Ici, nous insérons cette règle juste au-dessus de la règle autorisant tout le trafic ssh sur la ligne 4. Le '-s ' spécifie l'IP source. Nous aurions tout aussi bien pu autoriser une plage d'adresses IP source utilisant également la notation CIDR, afin d'autoriser l'ensemble de la plage 192.168.0.0/24 :
sudo iptables -I INPUT 4 -s 192.168.0.0/24 -j ACCEPT
Nous pourrions rendre cette règle plus spécifique - disons que nous voulons uniquement pouvoir accéder à ce serveur en ssh à partir de cette adresse 192.168.0.1. Allons aussi de l'avant et lançons un commentaire !
sudo iptables -R INPUT 4 -s 192.168.0.1 -m tcp -p tcp --dport 22 -j ACCEPT -m comment --comment "Only home workstation can ssh in"
Tout d'abord, puisque cette règle remplacera la précédente, notez le '-R '–cela signifie 'remplacer' sur le numéro de ligne indiqué au lieu d'insérer. Cette règle combine la vérification de l'IP source et du port de destination, donc pour qu'elle autorise le trafic, nous devrons faire correspondre les deux. L'option de correspondance finale pour le commentaire est facultative, mais elle peut être très utile lors de la liste des règles iptables pour indiquer brièvement pourquoi cette règle est en place - ce qui peut être très utile lorsque vos règles iptables deviennent plus impliquées ou lorsqu'il existe des règles qui ne sont pas n'est pas immédiatement évident lorsqu'il est répertorié (comme celui de l'interface de bouclage, pour lequel j'avais ajouté le commentaire plus tôt).
Nous pourrions, à ce stade, supprimer la règle permettant à n'importe quelle IP d'accéder à ce serveur via ssh :
sudo iptables –D INPUT 5
(Le ‘-D ' spécifie que le numéro de ligne indiqué dans cette chaîne sera supprimé.)
Une fois que vous avez terminé d'ajouter des règles, assurez-vous d'enregistrer :
sudo service iptables save
Cela enregistrera vos règles iptables en cours d'exécution dans /etc/sysconfig/iptables afin que, la prochaine fois que vous redémarrez votre serveur, il charge automatiquement les règles que vous avez passées à entrer ici. Si vous souhaitez modifier votre fichier iptables avec des commentaires plus descriptifs (ou gérer un ensemble plus vaste et plus complexe de règles de pare-feu), consultez l'article sur la configuration de base du fichier IPTables.