Product SiteDocumentation Site

4.18. Sécurisation des accès réseau

FIXME : Besoin de plus de contenu (spécifique à Debian).

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 [39].

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
Pour plus d'informations sur les syncookies TCP, consultez http://cr.yp.to/syncookies.html.

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.
La mise en place de pare-feu dans Debian est abordée plus en détail dans Section 5.14, « Ajouter des capacités au pare-feu ».

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). [40]
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é[41] ;
  • des correctifs du noyau[42].
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). [43]
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:
  • utiliser un cache ARP statique. Vous pouvez mettre en place des entrées «statiques» dans le cache ARP avec:
      arp -s nom_d_hôte adresse_matérielle 
    
    En plaçant des entrées statiques pour chaque hôte important du réseau, vous garantissez que personne ne pourra créer ou modifier une entrée (dissimulée) pour ces hôtes (les entrées statiques n'expirent pas et elles ne peuvent pas être modifiées) et les réponses ARP falsifiées seront ignorées ;
  • détecter le trafic ARP suspect. Vous pouvez utiliser arpwatch, karpski ou des IDS plus généraux qui peuvent également détecter le trafic ARP suspect (snort, http://www.prelude-ids.org, etc.) ;
  • implémenter un filtrage de trafic IP validant l'adresse MAC.


[39] Dans Debian, les paquets kernel-source-version copient les sources sous /usr/src/kernel-source-version.tar.bz2, remplacez simplement version par la version des sources du noyau installé.
[40] Pour reproduire cela (exemple fourni par Felix von Leitner sur la liste de diffusion Bugtraq):
 hôte a (eth0 connecté sur l'eth0 de l'hôte b) : ifconfig eth0 10.0.0.1 ifconfig eth1 23.0.0.1 tcpserver -RHl localhost 23.0.0.1 8000 echo fnord hôte b : ifconfig eth0 10.0.0.2 route add 23.0.0.1 gw 10.0.0.1 telnet 23.0.0.1 8000
[41] Le fait que ce comportement puisse être changé par le routage a été décrit par Matthew G. Marsh dans l'enfilade sur Bugtraq:
eth0 = 1.1.1.1/24 eth1 = 2.2.2.2/24 ip rule add from 1.1.1.1/32 dev lo table 1 prio 15000 ip rule add from 2.2.2.2/32 dev lo table 2 prio 16000 ip route add default dev eth0 table 1 ip route add default dev eth1 table 2
[42] Il existe des correctifs disponibles pour ce comportement comme décrit dans l'enfilade sur Bugtraq à http://www.linuxvirtualserver.org/~julian/#hidden et http://www.fefe.de/linux-eth-forwarding.diff.
[43] Un attaquant peut avoir beaucoup de problèmes à transférer un accès après une configuration de l'adresse IP s'il n'est pas le domaine de broadcast (même réseau) que l'hôte attaqué. Si l'attaque passe par un routeur, il peut être assez difficile pour les réponses de retourner quelque part.