« Le système d'exploitation GNU-Linux/Protection avec iptables » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
wikification & simplification automatiques des liens
Ligne 13 : Ligne 13 :
Le but est donc de modifier les tables en ajoutant et supprimant des règles dans les différentes tables. pour cela nous utilisons la commande ''iptables''.
Le but est donc de modifier les tables en ajoutant et supprimant des règles dans les différentes tables. pour cela nous utilisons la commande ''iptables''.


[[Fichier:Netfilter.png‎ ]]
[[Fichier:Netfilter.png‎]]
== Syntaxe globale ==
== Syntaxe globale ==


Ligne 141 : Ligne 141 :
Ces modifications ne seront pas prises en compte au redémarrage. Il faut pour cela créer un fichier script contenant toutes les commandes précédentes.
Ces modifications ne seront pas prises en compte au redémarrage. Il faut pour cela créer un fichier script contenant toutes les commandes précédentes.


<source lang="bash">
#!/bin/sh
#!/bin/sh
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT
iptables -I INPUT 2 -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -P INPUT DROP
iptables -I INPUT 2 -i lo -j ACCEPT
iptables -P INPUT DROP
</source>


Créez ce fichier dans le répertoire ''/etc/init.d/'' et n'oubliez pas de le rendre exécutable.
Créez ce fichier dans le répertoire ''/etc/init.d/'' et n'oubliez pas de le rendre exécutable.
Enfin, utilisez la commande [http://fr.wikibooks.org/wiki/Le_syst%C3%A8me_d%27exploitation_GNU-Linux/Le_processus_d%27initialisation#La_commande_update-rc.d update-rc.d] afin que ce script soit exécuté au démarrage.
Enfin, utilisez la commande [[../Le processus d'initialisation#La commande update-rc%d|update-rc.d]] afin que ce script soit exécuté au démarrage.


# update-rc.d votre_fichier defaults
# update-rc.d votre_fichier defaults

Version du 6 mars 2012 à 14:25

Iptables est un outil permettant de paramétrer Netfilter le filtre de paquet intégré à Linux.

Principe des tables

Netfilter utilise une liste de règles inscrites dans 3 tables : INPUT, OUTPUT, FORWARD.

Le paquet arrivant est voué à:

  • soit être filtré suivant les règle de la table INPUT pour être utilisé par un processus de la machine
  • soit être transféré à une autre machine en respectant les règle de la table FORWARD
  • soit quitter la machine dans les condition de la table OUTPUT

Le but est donc de modifier les tables en ajoutant et supprimant des règles dans les différentes tables. pour cela nous utilisons la commande iptables.

Syntaxe globale

#iptables <une action sur une table de netfilter> <la table en question> <condition(s) d'application> -j <action sur le paquet>
#exemple 
iptables  -A  INPUT  --p icmp  -j  ACCEPT
#on ajoute à la table INPUT la règle ACCEPT pour les paquet icmp (ping) entrant,
#bien entendu il faut aussi accepter les paquet sortants. D'où :
iptables  -A  OUTPUT  --p icmp  -j  ACCEPT

Les actions sur les tables

Le principe

Par défaut, iptables est composé de 3 catégories appelées "chaînes" (chain) :

  • INPUT : Chaîne où l'on règle le trafic entrant.
  • FORWARD : Chaîne où l'on règle le trafic qui sera redirigé.
  • OUTPUT : Chaîne où l'on règle le trafic sortant.

A chaque chaîne est attribuée une "politique" (policy), les deux principales sont :

  • ACCEPT : Politique d'acceptation. Par défaut, tout ce qui n'est pas dans la chaîne est accepté.
  • DROP : Politique de refus. Par défaut, tout ce qui n'est pas dans la chaîne sera rejeté. (utile pour filtrer les connections entrantes)

Un exemple concret. Par défaut, si vous n'avez jamais touché à votre iptables, voici ce que vous devez avoir :

# iptables -L
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

On constate ici que rien n'est sécurisé : tout entre (Chain INPUT, policy ACCEPT), tout sort (Chain OUTPUT, policy ACCEPT).

Le réglage simple

Tout d'abord, si votre iptables ne ressemble pas à l'exemple ci-dessus, ou tout simplement si vous souhaitez réinitialiser vos réglages, tapez ces commandes :

# iptables -F
(Efface toutes les règles définies par l'utilisateur)
# iptables -X
(Efface toutes les chaînes définies par l'utilisateur)

Les commandes de base :

Les règles sont lues dans un ordre précis. De la première vers la dernière. De cette manière, dans l'hypothèse où la première règle interdit une connexion alors que la suivante l'autorise, la connexion sera interdite.

  • APPEND : Ajouter une règle dans une chaîne. La règle ainsi créée s'ajoute après la dernière règle.
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(Ajoute une règle dans la chaîne INPUT. L'exemple sera détaillé plus loin.)
  • INSERT : Insère une règle dans un chaîne. La règle ainsi créée s'ajoute avant la première règle.
# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(Insère une règle au début de la chaîne INPUT. L'exemple sera détaillé plus loin.)
  • LIST : Liste les règles existant dans toutes les chaînes.
# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:pop3s 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
  • DELETE : Supprime une règle d'une chaîne.
# iptables -D INPUT 2
(Supprime la règle n°2 de la chaîne INPUT.)
  • POLICY : Configure la politique d'une chaîne.
# iptables -P INPUT DROP
(Passe la politique de la chaîne INPUT en DROP. Toutes les connections seront rejetées par défaut.)

Créer une configuration de base :

Nous allons autoriser une connexion déjà établie (ESTABLISHED) à recevoir du trafic.

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Autorisons maintenant le trafic sur deux ports utilisés par des services très répandus / utilisés. Bien évidemment à vous de faire le tri en fonction de ce que vous utilisez ou non.

  • Trafic SSH :
# iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT
  • Trafic Web :
# iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT
  • Requêtes Ping :
# iptables -A INPUT -p icmp -j ACCEPT
  • Trafic Local :
# iptables -I INPUT 2 -i lo -j ACCEPT
Nous insérons cette règle en deuxième position afin qu'elle prime sur les autres.
Comme il a déjà été dit plus haut, les règles sont parcourues de haut en bas.

Voici ce que vous devriez avoir pour l'instant si vous listez les filtres (l'option -v permet de voir sur quelle interface la règle est appliquée) :

# iptables -L -v
 Chain INPUT (policy ACCEPT 155 packets, 21332 bytes)
  pkts bytes target     prot opt in     out     source               destination         
    20  1562 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED 
     0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
     0     0 ACCEPT     tcp  --  eth0   any     anywhere             anywhere            tcp dpt:ssh 
     0     0 ACCEPT     tcp  --  eth0   any     anywhere             anywhere            tcp dpt:http
     0     0 ACCEPT     icmp --  any    any     anywhere             anywhere            
 
 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
  pkts bytes target     prot opt in     out     source               destination         
 
 Chain OUTPUT (policy ACCEPT 343 packets, 59235 bytes)
  pkts bytes target     prot opt in     out     source               destination      

Comme vous pouvez le constater, la politique est une politique d'acceptation (policy ACCEPT). Donc tous les paquets entrent sans restriction. En résumé, jusque là, nos modifications n'ont servies à rien. Nous allons donc devoir modifier la politique en politique de refus (policy DROP).

# iptables -P INPUT DROP

La modification est effective immédiatement. A partir de maintenant, seuls les paquets tcp entrants sur les ports 80, 22 ainsi que les requêtes ICMP sont acceptés.

Ces modifications ne seront pas prises en compte au redémarrage. Il faut pour cela créer un fichier script contenant toutes les commandes précédentes.

#!/bin/sh
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -I INPUT 2 -i lo -j ACCEPT
iptables -P INPUT DROP

Créez ce fichier dans le répertoire /etc/init.d/ et n'oubliez pas de le rendre exécutable. Enfin, utilisez la commande update-rc.d afin que ce script soit exécuté au démarrage.

# update-rc.d votre_fichier defaults

Les conditions

ports en destination et en source

protocoles

états

Les actions sur les paquets

Exemple