Sécurité - iptables

De UnixManiax
Aller à la navigation Aller à la recherche


Introduction

La sécurité en informatique est un domaine très vaste. Elle est devenue essentielle ces dernières années, y compris pour les simples particuliers comme vous et moi. C'est en grande partie Internet et l'utilisation qui en est faite par des gens peux scrupuleux, qui sont à l'origine de problèmes de sécurité sur les ordinateurs.

Les principaux risques encourrus sont les attaques de pirates et la propagation des virus.

Pour les virus, nous sommes quasiment à l'abris en utilisant Linux. Ces derniers sont très rares et, la plupart du temps, ne font quasiment aucun dégat, car ils ne peuvent utiliser que les droits de l'utilisateur qui les ont lancé. Donc si vous n'êtes pas root, il n'y a pas grand chose à craindre pour votre système.

Pour les attaques de pirates, nous ne sommes pas à l'abris, même si un système sous Linux est mieux sécurisé qu'un système sous Windows. Dans ce cas, il y a plusieurs précautions à prendre :

  • partitionner correctement son disque dur dès l'installation,
  • utiliser un firewall qui, s'il est bien configuré et régulièrement mis à jour, limitera fortement les possibilités d'attaque d'un pirate, et empêchera tout pirate novice de faire quoique ce soit,
  • fermer les ports ip ouvert par certaines applications (les "trous de sécurité" d'un ordinateur ne sont pas uniquement dûs au système d'exploitation, mais sont bien souvent le fait des applications qui tournent sur ce système,
  • chose la plus importante : toujours sauvegarder ses données.


S'il n'y à qu'une chose à retenir de tout cet article sur la sécurité, c'est qu'aucun système n'est jamais sécurisé à 100%. Un pirate chevronné finira probablement par trouver une faille, et une panne matérielle n'est pas non plus à exclure. Il est donc primordial de toujours sauvegarder ses données importantes sur un support externe inaccessible au pirate et indépendant des pannes matérielles de votre système tel que : cdrom, dvdrom, disquette, lecteur de bande, disque dur externe, etc.

Ici, nous allons parler de la sécurité à l'installation (partitionnement du disque dur) et je donnerai un script de configuration du firewall sans rentrer dans tous les détails obscures du firewall.

Pour savoir comment fermer les ports ip de vos applications et pour connaitre tous les rouages du firewall intégré de Linux (NetFilter/IpTables), je vous renvoie vers l'excellent site d'Olivier Allard-Jacquin : http://olivieraj.free.fr/fr/linux/information/firewall/.


La sécurité dès l'installation

Pour des raisons évidentes, la partition racine / ne doit jamais se trouver pleine. Sinon, le système va être complètement bloqué et risque même de ne plus pouvoir redémarrer.

Les causes d'un remplissage du disque dur sont diverses. Les principales causes sont :

  • les fichiers journaux du système (logs) sont devenus trop nombreux ou trop volumineux. Ils se trouvent dans le répertoire /var/log.
  • les répertoires utilisateurs (/home/...) contiennent trop de fichiers ou des fichiers trop volumineux, soit à cause d'une erreur de manipulation, soit parce qu'on a voulu copier des fichiers sans vérifier auparavant l'espace disponible sur le disque dur.
  • un pirate s'est attribué vos droits et sature de fichiers votre répertoire utilisateur (/home/...)
  • un pirate qui sature votre ordinateur de requêtes et qui arrive à remplir vos répertoires /tmp ou /var.


Comment se protéger de tels risques ?

C'est très simple. Il faut, dès l'installation de Linux, créer des partitions pour les répertoires sensibles. Ainsi, ces répertoires auront une taille bien définie, qu'ils ne pouront jamais dépasser et qui sera complètement indépendante de la taille des autres répertoires. Donc si un pirate rempli le répertoire /tmp, seule la partition le contenant sera pleine, et la racine / sera quant à elle parfaitement intacte. Le système ne plantera pas.

Bien sûr, si le pirate arrive à prendre le contrôle de la partition racine, notre protection ne sera plus efficace. Mais il est beaucoup plus dur pour un pirate d'accéder à la racine du disque dur, que de saturer l'ordinateur de requêtes. Et puis nous verons au chapitre suivant comment limiter encore les risques en mettant en place un firewall.

Comment partitionner le disque dur ?

Comme nous venons de le voir, les répertoires sensibles sont /var, /tmp et /home. Il nous faut donc créer une partition pour chacun d'eux.

Pour fonctionner, Linux a aussi besoin bien évidement d'une partition racine "/".

Vous pourrez aussi avoir besoin d'une partition de démarrage /boot. En fait, cela dépend de votre gestionnaire de démarrage (bootloader), le plus souvent il s'agit de LILO ou Grub. Dans les anciennes versions de LILO, il lui était impossible d'aller au delà du 1024 ème cylindre du disque dur. Donc sur les grands disques durs, il lui était impossible de charger le noyau de Linux au démarrage, la seule solution étant de créer une partition /boot au début du disque. Avec les dernières versions le problème est corrigé. Avec Grub, pas de problème. Pour savoir si vous devez ou non en créer une, je vous renvoie vers la documentation de votre distribution. En cas de doute, créez-en une : ça ne coute rien, et beaucoup de personnes continuent à le faire par habitude (moi y compris :o). Cette partition ne nécessite que très peu de place sur le disque.

L'utilisation d'une partition swap est fortement conseillée, elle est même obligatoire à l'installation de nombreuses distributions Linux. Cette partition est utilisée uniquement par le système. Pour schématiser, elle sert d'extention à la RAM lorsque celle-ci est pleine. Elle utilise un système de fichier particulier, et ne peut exister que sous forme de partition ; elle ne porte d'ailleurs pas de nom de répertoire, et on ne peut pas voir son contenu.

La taille conseillée du swap est de une à deux fois la taille de votre RAM. Si vous avez suffisement d'espace disque, mieux vaut mettre deux fois votre RAM, surtout si vous utilisez des programmes gros consommateurs de RAM. Si vous êtes vraiment limité par l'espace disque, une fois la taille de la RAM devrait suffir. C'est à vous de voir en fonction de votre utilisation.

Bon, arrêtons là les bavardages et passons aux choses concrètes. Voici donc mes conseils de partitionnement d'un disque dur de 10 Go. A vous de l'adapter selon vos besoins et selon la taille de votre disque, bien entendu.

Partition Espace conseillé Notes
/boot 32 Mo 16 à 32 Mo maxi, quelquesoit la taille de votre disque dur
swap 512 Mo 1 à 2 fois la RAM (conseillé)
/ 4 064 Mo
/tmp 512 Mo
/var 1 024 Mo
/home 4 096 Mo


Mise en place d'un firewall

Le but d'un firewall est de filter les données transitant entre Internet et votre ordinateur, et de ne laisser passer que le strict nécessaire. Ainsi, on limite les possibilités pour un pirate de vous attaquer.

Linux possède, depuis les versions 2.4 du noyau, un firewall directement intégré au noyau : netfilter. Celui-ci se configure à l'aide du programme iptables. C'est un firewall très puissant dôté de fonctionnalités avancées.

Mon but n'est pas ici de vous expliquer en détail le fonctionnement de Netfilter/Iptables, d'autres le font beaucoup mieux que moi, comme par exemple Olivier Allard-Jacquin sur son excellent site : http://olivieraj.free.fr/fr/linux/information/firewall/. Je vais simplement vous donner des exemples de scripts tout faits, vous permettant de protéger simplement votre ordinateur, en vous expliquant au fur et à mesure ce qu'on fait.


Construction d'un firewall

Voici les différentes étapes pour construire votre firewall.

Note : dans les lignes qui suivent, on considère que le modem correspond à l'interface ppp0. Si ce n'est pas le cas, il suffit de remplacer ppp0 par le nom de votre modem.


initialiser les tables

#initialisation de la table filter
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# initialisation de la table NAT
iptables -t nat -F
iptables -t nat -X
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

# initialisation de la table mangle
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT


autoriser l'interface réseau à dialoguer avec elle-même

iptables -A OUTPUT -o lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
iptables -A INPUT -i lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT


ouvrir seulement les ports nécessaires

# activer la résolution de noms (DNS). Pratique pour pouvoir surfer sur internet
# avec les noms des sites plutot qu'avec les adresses ip ! ;-)
iptables -A INPUT -i ppp0 --protocol udp --source-port 53 -j ACCEPT
iptables -A OUTPUT -o ppp0 --protocol udp --destination-port 53 -j ACCEPT
iptables -A INPUT -i ppp0 --protocol tcp --source-port 53 -j ACCEPT
iptables -A OUTPUT -o ppp0 --protocol tcp --destination-port 53 -j ACCEPT

# ouverture des ports tcp http (80) et https (443) entre le firewall et internet
# Vous pouvez indiférement mettre le nom du protocole ou le numéro de port
# correspondant (par exemple http ou 80).
# Vous pouvez voir la liste des protocoles et ports associés dans le fichier /etc/services.
iptables -A INPUT -i ppp0 -d 0.0.0.0/0 -p tcp --sport http -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o ppp0 -s 0.0.0.0/0 -p tcp --dport http -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i ppp0 -d 0.0.0.0/0 -p tcp --sport https -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o ppp0 -s 0.0.0.0/0 -p tcp --dport https -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# autoriser le transfert ftp - un peu plus complexe car le ftp ouvre plusieurs ports
modprobe ip_conntrack_ftp
iptables -A INPUT -i ppp0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

Si vous préférez ouvrir tous les ports, pour être sûr de pouvoir utiliser toutes vos applications sans gêne (peer to peer, messagerie ou autres applis ouvrant un port tcp), remplacez les lignes ci-dessus par celles qui suivent. Attention toutefois, vous ouvrez plus de ports, donc vous diminuez la sécurité du système.

Vous pouvez voir la liste des protocoles et ports associés dans le fichier /etc/services.

iptables -A INPUT -i ppp0 -d 0.0.0.0/0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o ppp0 -s 0.0.0.0/0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

Note : l'option "-m state" permet de surveiller le sens d'établissement des connexions. C'est à dire qu'ici on peut établir une nouvelle connexion vers internet, mais internet ne peut pas ouvrir de nouvelle connexion, il ne peut que y répondre. C'est très important, car un pirate ne pourra pas établir de connexion sur votre ordinateur, même s'il connait votre adresse ip. C'est un des points les plus important.


autoriser les ping et traceroute vers l'internet (mais pas de l'internet vers votre ordinateur) - facultatif

Cette partie est facultative. Elle est utile si vous désirez faire des pings vers l'internet. Dans le cas contraire, ne mettez pas ces lignes, elles ne vous serviront à rien.

# autorise les paquets icmp (ping, traceroute, etc.) de votre ordinateur vers internet
# (mais pas d'internet vers votre ordinateur)
iptables -A INPUT -i ppp0 -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT


Warning.gif Si vous possédez un réseau privé derrière votre firewall, vous devez rajouter tout ce qui suit.


Note : dans les lignes qui suivent, on considère que le modem correspond à l'interface ppp0, que la carte réseau qui relie votre firewall au réseau privé est eth0, et que votre réseau privé est du type 192.168.0.x. Dans le cas contraire il suffira de modifier les parties concernées.

autoriser la connexion entre le firewall et le réseau privé sans limites

iptables -A OUTPUT -o eth0 -s 192.168.0.0/255.255.255.0 -d 192.168.0.0/255.255.255.0 -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.0.0/255.255.255.0 -d 192.168.0.0/255.255.255.0 -j ACCEPT


autoriser la connexion entre internet et le réseau privé

echo 1 > /proc/sys/net/ipv4/ip_forward


filtrer les paquets entre internet et le réseau privé

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ppp0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT


Et voici les scripts, prêt à être téléchargés et tout de suite fonctionnels !

  • script firewall si vous ne possédez qu'un seul ordinateur : firewall-mono-pc.sh
  • script firewall si vous possédez un ordinateur connecté à internet, partageant sa connexion avec d'autres ordinateurs en réseau local : firewall-multi-pc.sh

Pour rendre le script exécutable, il faut faire chmod +x nom-du-script.

Ensuite, pour le lancer, il suffit de faire ./nom-du-script.

Il ne vous reste plus qu'à l'exécuter à chaque fois que vous vous connectez à Internet.