Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
securite:firewall_iptables [2011/12/16 21:44] – créée Anael MOBILIAsecurite:firewall_iptables [2014/05/27 03:32] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
-<style float-right>{{tag>XXX}}</style>+<style float-right>{{tag>iptables firewall pare-feu ipv4 ipv6}}</style>
  
-<style float-left>{{:icones:page_web.png?nolink&70}}</style> +<style float-left>{{:icones:kgpg.png?nolink&70}}</style> 
-====== Titre_page ======+====== Configurer des règles de filtrage réseaux ======
  
 //[[:|Retour à la liste des tutoriels]]// //[[:|Retour à la liste des tutoriels]]//
  
-<note tip>Présentation rapide.</note>+<note tip>Explication des fonctionnalités principales d'iptables et création d'un script de configuration. 
 +\\ 
 +Utilisation d'IPv4 et IPv6</note>
 <note>**Prérequis** <note>**Prérequis**
   * Aucun prérequis pour ce tutoriel.   * Aucun prérequis pour ce tutoriel.
 </note> </note>
 \\ \\
-===== grand1 ===== +===== Préambule ===== 
-lorem ipsum+Afin de sécuriser un serveur, il faut effectuer un filtrage au niveau des connexions réseau : la meilleure manière de se protéger contre une attaque est qu'elle n'atteigne pas la machine !
  
-\\ +Plus d'une personne conseille d'analyser les logs en temps réel de la machine (avec un logiciel spécialisé) afin de bannir les machines tentant de pirater notre serveur.
-===== Liens ===== +
-  * [[.:|Retour à la liste des tutoriels XXX]] +
-  * [[:|Retour à la liste des tutoriels]]+
  
-++__But Configurer un [firewall|tag:firewall] : [iptables|tag:iptables]__+++Cette idée n'est pas optimale en plus d'utiliser des ressources en permanence afin d'analyser les logs, elle ne fait que post-traiter l'attaque.
  
-!!!! I) Préambule +Une bonne sécurisation est dans la prévention de l'attaque.
-Maintenant que nous avons un minimum sécurisé la configuration de nos logiciels, il appartient également d'effectuer un filtrage au niveau des connexions réseau : la meilleure manière de se protéger contre une attaque est qu'elle n'atteigne tout simplement pas la machine ! +
-%%%Plus d'une personne conseille d'analyser les logs en temps réel de la machine (avec un logiciel spécialisé) afin de bannir les machines tentant de pirater notre serveur. +
-%%%Cette idée est mauvaise : en plus d'utiliser des ressources en permanence afin d'analyser les logs, elle ne fait que post-traiter l'attaque. +
-%%%Une bonne sécurisation est dans la prévention de l'attaq-ue. +
-%%%Pour ce faire, je vais utiliser iptables, un logiciel de parefeu extrêmement puissant, intégré par défaut à Ubuntu ! +
-%%%Attention toutefois : une mauvaise configuration d'iptables peut rendre votre serveur totalement in-opérationnel ! +
-%%%Important à savoir : si vous plantez votre configuration, et rendez votre serveur in-opérationnel, redémarrez le : iptables ne conserve pas sa configuration !+
  
-!!!! II) Iptables+<note important>Une mauvaise configuration d'iptables peut rendre votre serveur totalement in-opérationnel ! 
 +\\ 
 +Important à savoir : si vous rendez votre serveur in-opérationnel à cause d'une erreur de configuration, redémarrez le : iptables ne conserve pas sa configuration ! 
 +</note> 
 + 
 + 
 +===== Iptables IPv4 =====
  
-!!! 1) Programmes à autoriser +==== Programmes à autoriser ==== 
-Réfléchissons : quels sont les programmes dont nous avons toujours besoin ? +Quels sont les services dont nous avons toujours besoin ? 
-* Apache pour le serveur web, donc le port 80 +  * Apache pour le serveur web, donc le port 80 
-Ssh pour gérer à distance notre serveur, donc le port 22 +  SSH pour gérer à distance notre serveur, donc le port 22 
-* Ping pour pouvoir vérifier que notre serveur est bien en ligne +  * Ping pour pouvoir vérifier que notre serveur est bien en ligne 
-* Toutes les connexions internes au système d'exploitation (lancées automatiquement au démarrage)+  * Toutes les connexions internes au système d'exploitation (lancées automatiquement au démarrage)
  
-!!! 2) Gestion des droits+==== Gestion des droits ====
 Je vais utiliser une gestion des droits dite par liste blanche : Je vais utiliser une gestion des droits dite par liste blanche :
-* Interdiction de toutes les connexions +  * Interdiction de toutes les connexions 
-* Autorisation au cas par cas. +  * Autorisation au cas par cas. 
-Cette manière est la plus sécurisée de gérer les droits d'accès :-)+Cette manière me semble être la plus adaptée à notre besoin de sécurité.
  
-!!! 3) Notions théoriques 
  
-3 types de flux réseaux sont gérés par iptables : ceux qui rentrent __INPUT__ (du visiteur vers le serveur), ceux qui sortent : __OUTPUT__ (du serveur vers le visiteur) et ceux qui ne font que passer : __FORWARD__ (d'un visiteur, vers un autre serveur / visiteur / ...). +==== Notions théoriques ==== 
-%%%Je ne vais m'intéresser qu'aux flux sortant pour le moment. +3 types de flux réseaux sont gérés par iptables :  
-%%%[Schéma explicatif|http://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO-6.html|en]+ ceux qui entrent **INPUT** (du visiteur vers le serveur), 
 + ceux qui sortent : **OUTPUT** (du serveur vers le visiteur)
 + ceux qui ne font que passer : **FORWARD** (d'un visiteur, vers un autre serveur / visiteur / ...).
  
-!! A) Afficher les règles actuellement appliquées +Je vais travailler uniquement sur les flux entrants.
-///[bash] +
-iptables -L +
-/// +
-Version "verbose" (plus d'informations) +
-///[bash] +
-iptables -L -v +
-///+
  
-!! B) Ajouter une policy globale sur un des 3 types de flux +[[http://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO-6.html|Schéma explicatif]]
-///[bash] +
-iptables -P [INPUT/OUTPUT/FORWARD/...] [ACCEPT/DROP] +
-///+
  
-!! C) Ajouter une règle 
  
-///[bash] +==== Commandes d'iptables ==== 
-iptables -A [INPUT/OUTPUT/FORWARD/...-p [tcp/udp/...] --dport [www/ssl/80/...] -j [ACCEPT/DROP] +<note tip>Une liste de valeurs données entre crochets (**[]**) signifie qu'une des valeurs est à choisir.
-/// +
--A précise le type de flux +
--p précise le type de protocole (le plus souvent TCP) +
-* --dport précise le numéro du port concerné, ou son nom +
-* -j définit la politique du pare-feu+
  
-!! DSupprimer une règle +Je met plusieurs possibilités afin de vous donner un aperçu des commandes possibles.</note> 
-///[bash] +=== Afficher les règles actuellement appliquées === 
-iptables -L --line-numbers +<code bash>iptables -L</code> 
-///+Version "verbose" (plus d'informations) 
 +<code bash>iptables -L -v</code> 
 + 
 +=== Ajouter une règle globale === 
 +Il est possible de définir une règle globale sur un des trois types de flux : 
 +<code bash>iptables -P [INPUT/OUTPUT/FORWARD/...] [ACCEPT/DROP]</code> 
 + 
 +=== Ajouter une règle === 
 +<code bash>iptables -A [INPUT/OUTPUT/FORWARD/...-p [tcp/udp/...] --dport [www/ssl/80/...] -j [ACCEPT/DROP]</code> 
 +  * -A précise le type de flux 
 +  * -p précise le type de protocole (le plus souvent TCP) 
 +  * --dport précise le numéro du port concerné, ou son nom 
 +  * -j définit la politique du pare-feu 
 + 
 +=== Supprimer une règle === 
 +Afficher les règles en vigueur : 
 +<code bash>iptables -L --line-numbers</code>
 Relever le n° et le type de la règle que l'on souhaite supprimer Relever le n° et le type de la règle que l'on souhaite supprimer
-///[bash+<code bash>iptables -D [INPUT/OUTPUT/FORWARD/...] [1/2/...]</code> 
-iptables -D [INPUT/OUTPUT/FORWARD/...] [1/2/...] +  * -D précise la suppression 
-//+  * puis on donne le type de flux concerné 
-* -D précise la suppression +  * et l'id de la règle
-* puis on donne le type de flux concerné +
-* et l'id de la règle+
  
-!!!! IVConfiguration +==== Règles de configuration ==== 
-Pour faire simplevoici l'état de mes recherches pour faire un script iptables correct : +Voici les règles que je vais appliquer 
-''(l'option -i sert à préciser l'interface réseau eth0 <-> 1ère carte réseaulo <-> 127.0.0.1)'' + * Supprimer les configurations d'iptables pouvant exister 
-///[bash]+<code bash>iptables -t filter -F 
 +iptables -t filter -X</code> 
 +  * Autoriser le trafic entrant d'une connexion déjà active 
 +<code bash>iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT</code> 
 +  * Autoriser le trafic entrant SSH 
 +<code bash>iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT</code> 
 +  * Autoriser le trafic entrant web 
 +<code bash>iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT</code> 
 +  * Autoriser le ping 
 +<code bash>iptables -A INPUT -p icmp -j ACCEPT</code> 
 +  * Autoriser toutes les connexions en loopback (connexion locale
 +<code bash>iptables -I INPUT 2 -i lo -j ACCEPT</code> 
 +  * Restriction de tout le reste du trafic entrant 
 +<code bash>iptables -P INPUT DROP</code> 
 + 
 +<note>Si vous possédez un serveur BIND (DNS) pensez à ajouter également : 
 +<code bash>iptables -A INPUT -p udp -i eth0 --dport 53 -j ACCEPT</code></note> 
 + 
 +Bien entendu ceci est adapté dans mon caset est à réfléchir avant de l'appliquer sur un autre serveur ! 
 + 
 +Je vous laisse trouver les configurations optimales pour votre serveur ! 
 + 
 + 
 +==== Pérenniser ==== 
 +=== Explication === 
 +Je vais vous expliquer comment créer un script qui sera exécuté automatiquement au lancement de votre serveur, et configurera donc iptables
 + 
 +J'ai lu des tutoriels recommandant de sauvegarder (automatiquement) la configuration d'iptables à l'extinction du serveur, et de la réinsérer au redémarrage. Je désapprouve cette idée en cas de configuration erronéele seul moyen de récupérer le serveur sera de le réinstaller ! 
 + 
 + 
 +=== Création du script === 
 +Les scripts associés aux services sont stockés dans **/etc/init.d**
 +<code bash>nano /etc/init.d/iptables</code> 
 + 
 +Voici le contenu de mon fichier : 
 +<file bash iptables> 
 +#!/bin/bash
 # vider les tables de filtrage existantes # vider les tables de filtrage existantes
 iptables -t filter -F iptables -t filter -F
Ligne 108: Ligne 141:
 # restriction de tout le trafic entrant # restriction de tout le trafic entrant
 iptables -P INPUT DROP iptables -P INPUT DROP
-/// +</file>
-Bien entendu ceci est adapté dans mon cas, et est à réfléchir avant de l'appliquer sur un autre serveur :) +
-%%%Toutefois si aucune config spécifique n'a été mise en place il devrait faire l'affaire :-) +
-%%%Les deux première règles servent à supprimer toutes les règles pouvant préalablement exister. +
-%%%Si vous possédez un serveur BIND (DNS) pensez à ajouter également : +
-///[bash] +
-iptables -A INPUT -p udp -i eth0 --dport 53 -j ACCEPT +
-///+
  
-!!!! V) Pérenniser +=== Statut exécutable === 
-!!! 1) Explication +Pour rendre le script exécutable, il faut faire : 
-Avoir mis en place une config personnalisée d'iptables c'est bien, la rendre pérenne c'est mieux +<code bash>chmod +x /etc/init.d/iptables</code> 
-%%%J'ai lu des tutos recommandant de sauvegarder (automatiquementla configuration à l'extinction du serveur, et de la réinsérer au redémarrage+ 
-%%%Je désapprouve cette idée : en cas de configuration erronéele seul moyen de récupérer le serveur sera de le réinstaller ! (à nouveau : un reboot réinitialise la configuration d'iptables !) +=== Automatiser le lancement === 
-%%%Je propose donc de tester vos modifications, et une fois celle ci convenables les réunir dans un fichier nommé __iptables__+<code bash>cd /etc/init.d/ 
 +update-rc.d iptables defaults</code> 
 + 
 +<note important>FIXME Un warning s'affiche parlant du LSB du fichier... Ceci n'empêche en rien sa bonne exécution 
 +\\ 
 +[[http://wiki.debian.org/LSBInitScripts|Infos sur LSB]]</note> 
 + 
 + 
 +===== Ip6tables IPv6 ===== 
 +<note important>Si votre serveur possède une adresse IPv4 ainsi qu'une adresse IPv6, il convient de protéger correctement votre serveur sur les deux réseaux. 
 + 
 +Sinon cela reviendrait à mettre une porte blindée devant votre maison, mais laisser la porte de service grande ouverte... inutile !</note> 
 + 
 +==== IPv6, suis-je concerné ? ==== 
 +Pour déterminer si votre serveur possède une adresse IPv6 : 
 +<code bash>ifconfig</code> 
 + 
 +Que faut-il lire ? 
 +<code>eth0      Link encap:Ethernet  HWaddr c8:0a:a9:03:25:78   
 +          inet adr:88.191.122.115  Bcast:88.191.122.255  Masque:255.255.255.0 
 +          adr inet6: 2a01:e0b:1:122:ca0a:a9ff:fe03:2578/64 Scope:Global 
 +          adr inet6: fe80::ca0a:a9ff:fe03:2578/64 Scope:Lien 
 +          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
 +          RX packets:210192407 errors:0 dropped:0 overruns:0 frame:0 
 +          TX packets:97773119 errors:0 dropped:0 overruns:0 carrier:0 
 +          collisions:0 lg file transmission:1000  
 +          RX bytes:143351720634 (133.5 GiB TX bytes:89455408641 (83.3 GiB) 
 +          Interruption:28 Mémoire:feae0000-feb00000 </code> 
 +La ligne nous intéressant est ''adr inet6''
 +<note tip>Si une seule ligne est présente, et commence par fe80, votre serveur ne possède pas de connectivité internet IPv6
 + 
 +Sinonvotre serveur est accessible en IPv6.</note> 
 + 
 +==== ip6tables ==== 
 +Le pare-feu est ip**6**tables. Je vais réutiliser les mêmes configurations que pour l'IPv4. 
 + 
 +<note important>L'autorisation de l'ICMPv6 est obligatoire pour que vos sites web soient accessibles aujourd'hui !</note> 
 + 
 +Je rajoute dans mon script /etc/init.d/iptables : 
 +<file bash iptables> 
 + 
 +# ----------------------------------- I P v 6 -----------------------------------------
  
-!!! 2) Création du script 
-///[bash] 
-nano /etc/init.d/iptables 
-/// 
-On le place directement dans le répertoire init.d qui contient les scripts lancés automatiquement. 
-%%%Voila le contenu de mon fichier : 
-///[bash] 
-#!/bin/bash 
 # vider les tables de filtrage existantes # vider les tables de filtrage existantes
-iptables -t filter -F +ip6tables -t filter -F 
-iptables -t filter -X+ip6tables -t filter -X
  
 # autoriser le trafic entrant d'une connexion déjà active # autoriser le trafic entrant d'une connexion déjà active
-iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT+ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 # autoriser le trafic entrant SSH # autoriser le trafic entrant SSH
-iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT+ip6tables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT
 # autoriser le trafic entrant web # autoriser le trafic entrant web
-iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT+ip6tables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT
 # autoriser le ping # autoriser le ping
-iptables -A INPUT -p icmp -j ACCEPT+ip6tables -A INPUT -p icmpv6 -j ACCEPT
 # autoriser toutes les connexions en loopback (connexion locale) # autoriser toutes les connexions en loopback (connexion locale)
-iptables -I INPUT 2 -i lo -j ACCEPT+ip6tables -I INPUT 2 -i lo -j ACCEPT
  
 # restriction de tout le trafic entrant # restriction de tout le trafic entrant
-iptables -P INPUT DROP +ip6tables -P INPUT DROP 
-/// +</file>
-{{#!/bin/bash}} sert à indiquer le type de script utilisé à l'os ;-)+
  
-!!! 3) Statut exécutable 
-Nous allons maintenant rendre notre script exécutable par l'OS : 
-///[bash] 
-chmod +x /etc/init.d/iptables 
-/// 
  
-!!! 4) Automatiser le lancement +\\ 
-///[bash+===== Liens ===== 
-cd /etc/init.d/ +  * [[.:|Retour à la liste des tutoriels Sécurité]
-update-rc.d iptables defaults +  * [[:|Retour à la liste des tutoriels]
-/// +  * [[http://doc.ubuntu-fr.org/iptables|Doc. Ubuntu-fr]
-Un warning s'affiche parlant du LSB du fichier... ce sera pour une autre fois ;) +  * [[https://help.ubuntu.com/community/IptablesHowTo|Doc. Ubuntu]]
-%%%Cela n'empêche en rien sa bonne exécution ! +
-%%%[Infos sur LSB|http://wiki.debian.org/LSBInitScripts|en+
- +
-%%%[Doc. Ubuntu|http://doc.ubuntu-fr.org/iptables|fr] +
-%%%[Doc. Ubuntu - en|https://help.ubuntu.com/community/IptablesHowTo|en] +
- +
-http://blog.zioup.org//2008/iptables_recent/+