4.18.1. Configuration des options réseau du noyau
Beaucoup de fonctionnalités du noyau peuvent être modifiées en cours de fonctionnement en envoyant quelque chose (par la commande
echo
) dans le système de fichiers
/proc
ou en utilisant
/sbin/sysctl
. En entrant
/sbin/sysctl
-A
, vous pouvez voir ce que vous pouvez configurer et quelles sont les options, elles peuvent être modifiées en exécutant:
/sbin/sysctl -w variable=valeur
(consultez
sysctl(8)). Vous aurez seulement en de rares occasions à éditer quelque chose ici, mais vous pouvez augmenter la sécurité de cette manière aussi. Par exemple :
net/ipv4/icmp_echo_ignore_broadcasts = 1
C'est un «émulateur Windows» parce que ça agit comme Windows sur les ping de broadcast si celui-ci est positionné à 1. C'est-à-dire que les requêtes d'echo ICMP envoyées à l'adresse broadcast seront ignorées. Sinon, cela ne fait rien.
Si vous voulez empêcher le système de répondre aux requêtes d'echo ICMP, activez cette option de configuration:
net/ipv4/icmp_echo_ignore_all = 1
Pour enregistrer les paquets avec des adresses impossibles (à cause de routes erronées) sur le réseau, utilisez:
/proc/sys/net/ipv4/conf/all/log_martians = 1
Pour plus d'informations sur ce qui peut être fait avec
/proc/sys/net/ipv4/*
, consultez
/usr/src/linux/Documentation/filesystems/proc.txt
. Toutes les options sont décrites de façon complète sous
/usr/src/linux/Documentation/networking/ip-sysctl.txt
.
4.18.2. Configurer syncookies
Cette option est à double tranchant. D'un côté, elle protège le système contre le syn packet flooding; d'un autre côté, elle viole les standards définis (RFCs).
net/ipv4/tcp_syncookies = 1
Si vous voulez changer cette option à chaque fois que le noyau fonctionne, vous devez le faire dans
/etc/network/options
en positionnant
syncookies=yes
. Cela prendra effet à chaque fois que
/etc/init.d/networking
est exécuté (ce qui est habituellement fait lors du démarrage) tandis que la commande suivante aura un effet unique jusqu'au prochain redémarrage:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
Cette option n'est dispobile que si vous avez compilé le noyau avec
CONFIG_SYNCOOKIES
. Tous les noyaux Debian sont compilés avec cette option incluse, mais vous pouvez le vérifier en exécutant:
$ sysctl -A |grep syncookies
net/ipv4/tcp_syncookies = 1
4.18.3. Sécurisation du réseau pendant l'amorçage
Quand vous positionnez des options de configuration de réseau du noyau, vous devez le configurer pour que ce soit chargé à chaque fois que le système est redémarré. L'exemple suivant active un grand nombre des options précédentes ainsi que d'autres options utiles.
Il y a en fait deux façons de configurer le réseau au démarrage. Vous pouvez configurer /etc/sysctl.conf
(consultez sysctl.conf(5)) ou introduire un script qui est appelé quand l'interface est activée. La première option sera appliquée à toutes les interfaces alors que la seconde option vous permettra de configurer cela interface par interface.
Un exemple de fichier de configuration
/etc/sysctl.conf
qui sécurisera quelques options de réseau au niveau du noyau est présenté ci-dessous. Notez les commentaires dans ce fichier,
/etc/network/options
peut forcer certaines options si elles sont en contradiction avec celles de ce fichier lors de l'exécution de
/etc/init.d/networking
(ce qui a lieu après
procps
dans la séquence de démarrage).
#
# /etc/sysctl.conf - Fichier de configuration pour positionner les
# variables système
# Consultez sysctl.conf(5) pour plus de renseignements. Consultez
# également les fichiers sous Documentation/sysctl/,
# Documentation/filesystems/proc.txt et
# Documentation/networking/ip-sysctl.txt dans les sources du noyau
# (/usr/src/kernel-$version si vous avez installé un paquet de noyau)
# pour plus d'informations sur les valeurs qui peuvent être définies ici.
#
# Attention : /etc/init.d/procps est exécuté pour positionner les
# variables suivantes. Cependant, après cela, /etc/init.d/networking
# positionne certaines options réseau avec des valeurs intrinsèques. Ces
# valeurs peuvent être forcées en utilisant /etc/network/options.
#
#kernel.domainname = example.com
# Paramètres supplémentaires - adapté du script fourni
# par Dariusz Puchala (voir ci-dessous)
# Ignorer les broadcasts ICMP
net/ipv4/icmp_echo_ignore_broadcasts = 1
#
# Ignorer les erreurs ICMP erronées
net/ipv4/icmp_ignore_bogus_error_responses = 1
#
# Ne pas accepter les redirections ICMP (empêche les attaques en
# homme au milieu)
net/ipv4/conf/all/accept_redirects = 0
# _ou_
# N'accepter les redirections ICMP que pour les passerelles
# de notre liste de passerelles par défaut (activé par défaut)
# net/ipv4/conf/all/secure_redirects = 1
#
# Ne pas accepter les redirections ICMP (ce n'est pas un routeur)
net/ipv4/conf/all/send_redirects = 0
#
# Ne pas faire suivre les paquets IP (ce n'est pas un routeur)
# Remarque : assurez-vous que /etc/network/options contient
# « ip_forward=no »
anet/ipv4/conf/all/forwarding = 0
#
# Activer les TCP Syn Cookies
# Remarque : assurez-vous que /etc/network/options contient
# « syncookies=yes »
net/ipv4/tcp_syncookies = 1
#
# Enregistrer les paquets martiens
net/ipv4/conf/all/log_martians = 1
#
# Activer la vérification d'adresse source pour toutes les
# interfaces pour empêcher certaines attaques par usurpation
# Remarque : assurez-vous que /etc/network/options contient
# « spoofprotect=yes »
net/ipv4/conf/all/rp_filter = 1
#
# Ne pas accepter les paquets de routage source IP
# (ce n'est pas un routeur)
net/ipv4/conf/all/accept_source_route = 0
Pour utiliser le script, vous devez tout d'abord le créer, par exemple, dans
/etc/network/interface-secure
(le nom est donné comme exemple) et l'appeler à partir de
/etc/network/interfaces
comme ceci:
auto eth0
iface eth0 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.255.xxx
broadcast xxx.xxx.xxx.xxx
gateway xxx.xxx.xxx.xxx
pre-up /etc/network/interface-secure
Dans cet exemple, avant que l'interface eth0 ne soit activée, le script sera appelé pour sécuriser toutes les interfaces réseau comme montré ci-dessous.
#!/bin/sh -e
# Nom du script : /etc/network/interface-secure
#
# Modification de plusieurs comportements par défaut pour sécuriser contre
# certaines attaques et usurpations IP pour toutes les interfaces.
#
# Fourni par Dariusz Puchalak.
#
# Activation de la protection broadcast echo.
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Désactivation de l'IP forwarding.
echo 0 > /proc/sys/net/ipv4/conf/all/forwarding
# Activation de la protection TCP syn cookies.
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Enregistrement des paquets avec des adresses impossibles
# (cela comprend les paquets usurpés (spoofed), les paquets routés
# source, les paquets redirigés), mais faites attention à cela
# sur les serveurs web très chargés.
echo 1 >/proc/sys/net/ipv4/conf/all/log_martians
# Activation de la protection sur les mauvais messages d'erreur.
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Protection d'usurpation IP.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
# Désactivation des redirections ICMP.
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
# Désactivation des paquets source routés.
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
exit 0
Remarquez que vous pouvez en fait avoir des scripts par interface qui activeront différentes options réseau pour différentes interfaces (si vous en avez plus d'une), il vous suffit de changer la ligne pre-up en:
pre-up /etc/network/interface-secure $IFACE
et utiliser un script qui n'applique les changements qu'à une interface spécifique et non à toutes les interfaces disponibles. Notez cependant que certaines options réseau ne peuvent être appliquées que globalement. Un exemple de script est celui-ci:
#!/bin/sh -e
# Nom du script : /etc/network/interface-secure
#
# Modifie plusieurs comportements par défaut pour sécuriser contre
# certaines attaques et usurpations TCP/IP pour une interface donnée.
#
# Fourni par Dariusz Puchalak.
#
IFACE=$1
if [ -z "$IFACE" ] ; then
echo "$0 : un nom d'interface doit être fourni en argument"
echo "Utilisation : $0 <interface>"
exit 1
fi
if [ ! -e /proc/sys/net/ipv4/conf/$IFACE/ ]; then
echo "$0 : l'interface $IFACE n'existe pas "
echo "(impossible de trouver /proc/sys/net/ipv4/conf/)"
exit 1
fi
# Désactivation de l'IP forwarding.
echo 0 > /proc/sys/net/ipv4/conf/$IFACE/forwarding
# Enregistrement des paquets avec des adresses impossibles
# (cela inclut les paquets usurpés (spoofed), les paquets routés
# source, les paquets redirigés), mais faites attention à cela
# sur les serveurs web très chargés.
echo 1 >/proc/sys/net/ipv4/conf/$IFACE/log_martians
# Protection d'usurpation IP.
echo 1 > /proc/sys/net/ipv4/conf/$IFACE/rp_filter
# Désactivation des redirections ICMP.
echo 0 > /proc/sys/net/ipv4/conf/$IFACE/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/$IFACE/send_redirects
# Désactivation des paquets source routés.
echo 0 > /proc/sys/net/ipv4/conf/$IFACE/accept_source_route
exit 0
Vous pouvez également créer un script init.d
et le faire exécuter au démarrage (en utilisant update-rc.d
pour créer les liens rc.d
appropriés).
4.18.4. Configuration des fonctionnalités de pare-feu
De façon à avoir des privilèges de pare-feu, soit pour protéger le système local ou d'autres derrière lui, le noyau doit être compilé avec les options correspondant aux pare-feu. Le noyau standard de Debian 2.2 (Linux 2.2) fournit ipchains
qui est un pare-feu pour filtrer les paquets, le noyau standard de Debian 3.0 (Linux 2.4) fournit lui le pare-feu iptables
(netfilter).
Dans tous les cas, il est relativement facile d'utiliser un noyau différent de celui fourni par Debian. Vous pouvez trouver des noyaux précompilés sous forme de paquets que vous pouvez facilement installer sur le système Debian. Vous pouvez également télécharger les sources du noyau en utilisant kernel-source-X
et construire des paquets de noyau personnalisé en utilisant make-kpkg
du paquet kernel-package.
4.18.5. Désactiver les problèmes d'hôtes weak-end
Les systèmes avec plus d'une interface sur différents réseaux peuvent avoir des services configurés pour qu'ils ne puissent s'associer qu'à une adresse IP donnée. Cela prévient habituellement les accès aux services quand ils sont interrogés par une adresse donnée. Cependant, cela ne veut pas dire (bien qu'il s'agisse d'une erreur classique) que le service est lié à une adresse
matérielle donnée (carte interface).
Cela semble, cependant, ne pas fonctionner avec les services liés à 127.0.0.1, vous pourriez devoir écrire des tests utilisant des sockets bruts.
Ce n'est pas un problème ARP et ce n'est pas une violation de RFC (c'est ce que l'on appelle le
weak end host dans la
ftp://ftp.isi.edu/in-notes/rfc1122.txt, section 3.3.4.2). Rappelez-vous que les adresses IP n'ont rien à voir avec les interfaces physiques.
Sur les noyaux 2.2 (et antérieurs), cela peut être corrigé avec:
# echo 1 > /proc/sys/net/ipv4/conf/all/hidden
# echo 1 > /proc/sys/net/ipv4/conf/eth0/hidden
# echo 1 > /proc/sys/net/ipv4/conf/eth1/hidden
...
Sur les noyaux suivants, cela peut être corrigé avec:
des règles iptables ;
un routage correctement configuré
;
Tout au long de ce texte, il y aura plusieurs occasions pour lesquelles il est affiché comment configurer certains services (serveur SSH, Apache, service d'impression, etc.) pour les avoir en attente sur une adresse donnée, le lecteur devra prendre en compte que, sans les correctifs donnés ici, le correctif n'empêchera pas les accès depuis le même réseau (local).
FIXME : Commentaires sur Bugtraq indiquant qu'il existe une méthode spécifique à Linux pour associer à une interface donnée.
FIXME : Créer un bogue sur netbase pour que le correctif de routage soit le comportement standard dans Debian?
4.18.6. Protéger contre les attaques ARP
Quand vous ne faites pas confiance aux autres machines du réseau (ce qui devrait toujours être le cas parce que c'est l'attitude la plus sûre), vous devriez vous protéger contre les différentes attaques ARP existantes.
Comme vous le savez, le protocole ARP est utilisé pour lier des adresses IP à des adresses MAC (consultez la
ftp://ftp.isi.edu/in-notes/rfc826.txt pour tous les détails). À chaque fois que vous envoyez un paquet à une adresse IP, une résolution ARP est effectuée (en regardant en premier dans le cache local ARP, puis si l'adresse IP n'est pas présente dans le cache, en diffusant une requête ARP) pour trouver l'adresse matérielle de la cible. Toutes les attaques ARP ont pour but d'amener la machine à croire que l'adresse IP de la machine B est associée à l'adresse MAC de la machine de l'intrus; puis tous les paquets que vous voudrez envoyer à l'adresse IP associée à la machine B seront envoyée à la machine de l'intrus, etc.
Ces attaques (empoisonnement du cache, falsification ARP, etc.) permettent à l'attaquant de renifler le trafic même sur des réseaux utilisant des switchs, pour pirater facilement des connexions, pour déconnecter tout hôte du réseau, etc. Les attaques ARP sont puissantes et simples à implémenter et plusieurs outils existent comme
arpspoof
du paquet
dsniff ou
http://arpoison.sourceforge.net/.
Cependant, il existe toujours une solution: