Vérifiez les compatibilités avec les TCP Wrappers
Le premier processus de filtrage réseau sous Linux est le TCP Wrapper. Cette technique s'appuie sur la librairie partagée libwrap et permet de définir des règles d'accès sur deux fichiers de configuration :
le fichier /etc/hosts.allow, qui contient la liste des règles autorisant la connexion à un service ;
le fichier /etc/hosts.deny, qui contient la liste des règles refusant la connexion à un service.
Dans le cas où les deux fichiers seraient renseignés et présenteraient des incohérences (par exemple un même service autorisé dans l'un et refusé dans l'autre), ce serait le fichier host.allow qui prévaudrait : les règles qu'il contient sont prioritaires.
Le grand avantage de cette technique, c'est qu'il est possible de modifier ces règles sans toucher à la configuration spécifique des services concernés. Par contre, le service doit être compilé avec la librairie libwrap.
Je vous montre cela en vidéo, juste ci-dessous ! Vous pouvez également suivre pas à pas avec la version texte juste après.
Pour vérifier si un service peut être compilé avec libwrap, lancez les commandes suivantes :
[root@fichesproduits ~]# which sshd /usr/sbin/sshd [root@fichesproduits ~]# ldd /usr/sbin/sshd | grep libwrap libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fc69c57f000) [root@fichesproduits ~]# find / -name mysqld /usr/libexec/mysqld [root@fichesproduits ~]# ldd /usr/libexec/mysqld | grep libwrap [root@fichesproduits ~]# which httpd /usr/sbin/httpd [root@fichesproduits ~]# ldd /usr/sbin/httpd | grep libwrap [root@fichesproduits ~]# which proftpd /usr/sbin/proftpd [root@fichesproduits ~]# ldd /usr/sbin/proftpd | grep libwrap [root@fichesproduits ~]#
Les résultats montrent que seul le service sshd est compatible avec la fonctionnalité TCP Wrapper.
Ici, pour établir les règles de connexion au service sshd, il faudrait renseigner les deux lignes suivantes dans les fichiers :
# /etc/hosts.allow sshd: 1.2.3.0/255.255.255.0 # Masque réseau complet sshd: 192.168.0.0/255.255.255.0 # Adresse IP spécifique # /etc/hosts.deny sshd: ALL # Rejet de tout le reste
C'est notamment le cas du service proftpd, qui devient compatible une fois compilé avec le module contrib/mod_wrap.c.
Auditez les règles du firewall Netfilter
Le second processus de filtrage réseau est le firewall Netfilter, codé directement dans le noyau Linux.
Ce firewall fonctionne avec un système composé de trois principaux éléments :
les chaînes, qui déterminent la caractéristique principale du paquet réseau. La chaîne INPUT règle le trafic entrant, OUTPUT règle le trafic sortant, et FORWARD le trafic qui transite par le serveur ;
les règles, qui servent à reconnaître le type de paquet. Cela peut se faire, entre autres, en fonction de son adresse source, de son port de destination, ou encore de son protocole ;
les actions, qui sont associées aux chaînes et aux règles. Elles déterminent ce qu'il se passe : par exemple, INPUT and DPORT 80 ACCEPT va laisser entrer tous les paquets à destination du port 80.
Cette description est volontairement succincte, mais il faudrait un cours entier pour détailler le fonctionnement de Netfilter. :)
Je vous montre cela en vidéo, juste ci-dessous ! Vous pouvez également suivre pas à pas avec la version texte juste après.
Avant toute chose, il vous faut vérifier que le code de Netfilter est bien intégré au noyau :
[root@fichesproduits ~]# grep IPTABLES /boot/config-`uname -r` CONFIG_IP_NF_IPTABLES=m CONFIG_IP6_NF_IPTABLES=m
La commande ci-dessus indique que le code Netfilter est compilé comme un module et qu'il est nécessaire de le charger pour accéder aux fonctionnalités du firewall. Cela ne convient pas au vu de la recommandation que nous avions émise sur le noyau dans le chapitre 1 de la partie 2 (« Bloquer le chargement de modules supplémentaires »).
Linux fournit avec son firewall un jeu de binaires qui permet de manipuler sa configuration, en l’occurrence avec la commande iptables.
Pour voir la configuration actuelle du firewall Netfilter, lancez la commande suivante :
[root@fichesproduits ~]# iptables -L -n 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
Le résultat de cette commande affiche une configuration par défaut typique : une vraie passoire ! Le firewall ne dispose d'aucune règle et est configuré par défaut sur l'action ACCEPT. Évidemment, cette situation ne convient pas.
Il faudrait déjà passer la configuration par défaut en DROP.
:INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0]
Et ensuite laisser entrer les paquets à destination des services. Ci-dessous, illustration avec le port par défaut du service Web :
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -A OUTPUT -o eth0 -p tcp -m tcp --sport 80 -j ACCEPT
ATTENTION : il ne faut pas oublier que la configuration du firewall Netfilter s'effectue toujours à chaud et que le noyau ne garde pas cette configuration d'un reboot à l'autre. Il est donc nécessaire de renseigner des fichiers de configuration comme /etc/sysconfig/iptables afin de charger des règles par défaut à la fin du processus de démarrage.
Auditez les sysctl du noyau
C'est ce dernier aspect qui nous intéresse ici. Suivez-moi dans le tutoriel vidéo pour en savoir plus !
Il existe de nombreuses sysctl pour le réseau. Chacune permet de renforcer un peu plus la sécurité réseau de la machine. Nous allons ici recenser les plus communes et leur implication :
SYSCTL | Description |
---|---|
net.ipv4.ip_forward = 0 | Absence de routage sur les interfaces |
net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 | Refus des paquets de source routing |
net.ipv4.icmp_echo_ignore_broadcasts = 1 | Configuration contre les tempêtes ICMP (Smurf attacks) |
net.ipv4.accept_source_route = 0 | Configuration contre les paquets contenant leur propre routage (utile seulement aux attaquants) |
net.ipv4.rp_filter = 1 | Configuration contre les paquets avec une IP incohérente avec l'interface réseau de destination (Spoofing) |
Il faut ajouter ces configurations dans le fichier /etc/sysctl.conf pour qu'elles soient appliquées à chaque redémarrage du serveur.
En résumé
Le filtrage réseau est un critère important pour la sécurité d'une machine hébergeant des services réseau soumis à des flux potentiellement non contrôlés, comme un site Web public. Afin de recommander des actions visant à protéger le serveur des attaques réseau, nous avons utilisé trois fonctionnalités du noyau :
la librairie libwrap avec les TCP Wrappers,
le filtrage avec Netfilter
et les sysctl réseau.
Il existe cependant un service particulièrement sensible sur ce type de serveur : SSH. Retrouvez-moi dans le dernier chapitre de cette partie pour effectuer son audit en détail.