La première étape du tutoriel vise à sécuriser la machine et a installer le firewall dessus. Sous linux, le firewall s'appelle "iptables" (et pas OpenOffice, n'en déplaise à Christine "Anéfé" Albanel).

On va commencer par mettre le fichier de configuration pour iptables dans le dossier /etc/ de linux, qui est le dossier où on met en général les configurations. Nous commençons donc par passer root en tapant "su" (oui c'est mal de "su" normalement on devrait "sudo"):

User@Host:~$ su
Mot de passe :
Host:/home/User#

Une fois cette étape réalisée, nous allons pouvoir écrire le fichier de configuration d'iptables. Je suis un peu psycho-rigide quand je fais des configurations, j'aime bien faire un dossier par logiciel, mais aussi travailler avec des liens symboliques (permettant d'avoir et de tester plusieurs configurations différentes).

Host:/home/User# mkdir /etc/iptables/
Host:/home/User# cd /etc/iptables/
Host:/etc/iptables#

On vérifie juste l'état d'accessibilité du dossier créé:

Host:/etc/iptables# ls -lart /etc/ | grep iptables
drwxr-xr-x  2 root root     4096 sep 24 01:30 iptables

Le dossier appartient à root, et est en read-only pour les autres utilisateurs. On aurait pu limiter l'accès en lecture pour les autres utilisateurs, mais étant donné qu'un simple NMAP sur la machine nous donnera pratiquement les même infos que la configuration iptables, je préfère le laisser en lecture seule.

Nous allons maintenant créer le fichier de configuration iptables, que nous allons nommer "iptables.conf.0":

Host:/etc/iptables# vim iptables.conf.0

Copiez collez le fichier de configuration suivant (les explications sont données directement dans le fichier de configuration):

# Iptables-save v1.4.2
*filter

# Par défaut, tout ce qui va rentrer dans la machine va être jeté à la poubelle
:INPUT DROP [22:2996]

# Tout ce qui est forwardé au réseau interne (NAT) est accepté.
# Cette règle n'est pas important dans notre cas, la Dédibox n'ayant pas de réseau derrière elle
:FORWARD ACCEPT [0:0]

# Par défaut, tout ce qui va sortir de la machine ne sera pas filtré
:OUTPUT ACCEPT [182:24609]

# Nous allons accepter tous les paquets provenant de l'interface loopback.
# Ces paquets étant interne à la machine, nous ne risquons rien.
-A INPUT -i lo -j ACCEPT

# Toutes les connections actives doivent être conservées
# C'est relativement important, sinon on se fait déconnecter du SSH lorsque la config se met en place
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# On accepte les communications entrantes sur le port SSH
# Sans cela, on ne pourrait plus se logguer sur la machine!
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT

# Et on ouvre le port HTTP pour que le serveur web puisse recevoir les connexions de l'extérieur
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT

COMMIT

Une fois ces opérations réalisées, on sécurise de suite la machine en effectuant la commande:

Host:/etc/iptables# iptables-restore < /etc/iptables/iptables.conf.0

On peut ensuite voir l'état du filtrage des paquets de la machine avec la commande iptables -L:

Host:/etc/iptables# iptables -L -v
Chain INPUT (policy DROP 3459 packets, 415K bytes)
 pkts bytes target     prot opt in     out     source               destination
16256 1841K ACCEPT     all  --  lo     any     anywhere             anywhere
74670   24M ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
 4977  298K ACCEPT     tcp  --  eth0   any     anywhere             anywhere            tcp dpt:ssh
  232 13536 ACCEPT     tcp  --  eth0   any     anywhere             anywhere            tcp dpt:www

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 95335 packets, 13M bytes)
 pkts bytes target     prot opt in     out     source               destination

On voit la liste des règles de filtrage sur l'entrée de l'interface eth0 (carte réseau).

Il nous faut maintenant rajouter un lien symbolique vers notre fichier de configuration; ainsi si l'on veut changer de configuration, un jour, il nous suffira d'incrémenter le nombre du fichier iptables.conf.0, de tenter un iptables-restore avec; et si tout va bien changer le lien symbolique vers le nouveau fichier de configuration.

Host:/etc/iptables/ln -s iptables.conf.0 iptables.conf

On vérifie en vitesse les droits des fichiers (pour pas qu'un utilisateur mal intentionné modifie les règles de filtrage à l'insu de notre plein gré):

Host:/etc/iptables# ls -lart
total 12
-rw-r--r--  1 root root  701 sep 24 01:30 iptables.conf.0
lrwxrwxrwx  1 root root   15 sep 24 01:30 iptables.conf -> iptables.conf.0
drwxr-xr-x  2 root root 4096 sep 24 01:30 .
drwxr-xr-x 65 root root 4096 sep 24 03:31 ..

Le fichier est seulement lisible par les utilisateurs, et accessible en écriture par le super-utilisateur. Tout va donc bien.

Il nous reste un problème: quand on démarre la machine, le fichier de configuration n'est pas chargé automatiquement. Sous Debian, il est conseillé d'installer un script qui va se charger d'effectuer le chargement du fichier de configuration iptables au montage de l'interface ethernet eth0 (plutôt que dans init.d).

Les scripts contenus dans /etc/network/if-up.d/ sont executés automatiquement au montage de l'interface réseau. Nous allons donc créer un nouveau script d'initialisation d'iptables à cet endroit:

Host:/etc/iptables# vim /etc/network/if-up.d/iptables

Et l'on met dans ce fichier le contenu suivant:

#!/bin/sh
iptables-restore < /etc/iptables/iptables.conf

Il ne nous reste plus qu'à rendre le fichier en question exécutable, grâce à la commande chmod:

/etc/network/if-up.d/ chmod 755 /etc/network/if-up.d/iptables

On vérifie que la commande a bien été prise en compte et que le fichier est bien exécutable:

Host:/etc/iptables# ls -lart /etc/network/if-up.d/
total 32
-rwxr-xr-x 1 root root   94 jan 20  2008 openntpd
-rwxr-xr-x 1 root root 4297 aoû 12  2008 mountnfs
-rwxr-xr-x 1 root root  755 jan 14  2009 openssh-server
-rwxr-xr-x 1 root root  289 jun 10 21:32 bind9
drwxr-xr-x 7 root root 4096 sep 24 01:18 ..
-rwxr-xr-x 1 root root   58 sep 24 01:32 iptables
drwxr-xr-x 2 root root 4096 sep 24 01:32 .

Le script est exécutable. Il ne nous reste plus qu'à rebooter pour vérifier que le script s'enclenche bien au démarrage de la machine:

Host:/etc/iptables# reboot

Une fois le reboot effectué, reconnectez vous à la machine. La commande iptables -L -v devrait afficher les mêmes règles que ci-dessus. Votre firewall est en place! La prochaine étape sera de sécuriser un peu plus l'accès SSH de la machine, et empêcher par exemple des gens de brute-forcer le mot de passe root.