Le succès du Wi-Fi est indéniable. Que ce soit au travail ou à la maison, la possibilité de pouvoir se connecter au réseau sans fil apporte un grand confort d'utilisation. Mais, du point de vue de la sécurité, c'est un cauchemar: En effet, contrairement à un bête câble qui est essentiellement une liaison entre deux points, une connexion Wi-Fi arrose tout se qui se trouve dans sa zone. Autrement dit, n'importe qui à portée de réception peut intercepter le trafic entre un périphérique et son point d'accès.

Wi-Fi+filaire.png

Comparaison Wi-Fi - Fialire — Avec un réseau filaire, un simple contrôle physique permet de limiter les connexions au réseau. Par contre, en Wi-Fi, tout ordinateur dans la zone de couverture d'un poste et/ou de son point d'accès peut intercepter le trafic. D'autant plus que le signal se déplace dans les trois dimensions de l'espace, franchit aisément des obstacles tels que les murs ou les plafonds et que la portée du Wi-Fi peut atteindre facilement plusieurs dizaines de mètres!

Conscient de cela, la Wi-Fi alliance proposait dès 1999 le chiffrement WEP (Wired Equivalent Privacy) ... qui s'est rapidement révélé comporter de sérieuses faiblesses.

Aujourd'hui WEP est déprécié au profit de son successeur Wi-Fi Protected Access (WPA ou mieux WPA2). Pour fonctionner correctement, WPA suppose que le client et son point d'accès soient tous deux configurés pour utiliser ce protocole. Configurer la borne ne pose généralement pas de problème – et se limite souvent à activer l'option adéquate et à définir une passphrase dans l'interface d'administration. Par contre, configurer votre ordinateur sous Linux peut être plus problématique. Surtout si vous ne souhaitez pas utiliser les outils avancés livrés avec des environnements graphiques lourds comme Gnome. Si vous êtes dans ce cas, voici donc comment établir une connexion à un réseau WiFi sécurisé par WPA sous Debian.


Configuration initiale

Comme toute configuration réseau sous Debian, le secret est dans le fichier /etc/network/interfaces. Sur mon portable, l'interface réseau correspondant à la carte Wi-Fi est eth2. Partons pour commencer d'une configuration classique avec adresse IP statique:

iface eth2 inet static
	address 10.129.36.30
	netmask 255.255.255.0
	gateway 10.129.36.245
	dns-nameservers 10.129.36.2

Remarque:

Ici, j'ai opté pour une adresse statique, mais DHCP est une option plus fréquente:

 iface eth2 inet dhcp

Supplicant

Installation

Sous Debian vous aurez besoin du paquet wpasupplicant pour ce qui suit. Si ce logiciel n'est pas déjà sur votre machine utilisez le gestionnaire de paquets de votre distribution pour procéder à l'installation.

sh# apt-get install wpasupplicant

Dans la terminologie IEEE 802.1X, le supplicant est une entité qui cherche à s'authentifier vis-à-vis d'un tiers dans une relation point-à-point. Dans la pratique, c'est un logiciel sur la machine cliente qui cherche à se connecter à un point d'accès Wi-Fi. Sous Linux, cette tâche peut être confiée à l'utilitaire wpa_supplicant. Celui-ci peut utiliser différentes techniques d'authentification. Comme un certificat ou encore une passphrase. C'est cette dernière option que nous allons mettre en oeuvre.

S'il est possible d'invoquer manuellement wpa_supplicant, le paquet Debian wpasuppliant nous permet aussi d'ajouter un certain nombre d'options aux strophes (stanzas) définie dans /etc/network/interfaces pour piloter cet utilitaire. Les deux options de bases sont:

wpa-ssid
Pour configurer l'identifiant du réseau (SSID) Wi-Fi auquel vous souhaitez vous connecter;
wpa-psk
Pour définir la clé pré-partagée (pre-shared key) entre le point d'accès et le client. Nous verrons dans un instant comment cette clé est calculée:
iface eth2 inet static
	address 10.129.36.30
	netmask 255.255.255.0
	gateway 10.129.36.245
	dns-nameservers 10.129.36.2
	wpa-ssid gatehal
	wpa-psk 85d27a6a75b733b36d63bf354545e60ad6202aa726874df04fd309ddf333f9fe

Remarque:

Non, ce n'est pas vraiment ma clé;)!

Le calcul de votre clé peut se faire avec l'utilitaire wpa_passphrase. Celui-ci utilise le SSID du réseau et la passphrase en clair pour calculer la clé pré-partagée:

sh$ wpa_passphrase gatehal
# reading passphrase from stdin
V0us n3 dev1n3reZ j@ma1$!
network={
	ssid="gatehal"
	#psk="V0us n3 dev1n3reZ j@ma1$!"
	psk=85d27a6a75b733b36d63bf354545e60ad6202aa726874df04fd309ddf333f9fe
}

Pour notre propos, ce qui nous intéresse est le champs psk qu'il faut recopier dans le fichier /etc/network/interfaces.

Attention:

WPA n'est pas synonyme de sécurité inviolable. En effet, la sécurité fournie ici n'est pas plus robuste que votre passphrase. Et des logiciels aussi courants qu'aircrack peuvent aussi craquer une clé WPA si la passphrase est faible!

A partir de maintenant (si vous ne vous êtes pas trompé dans votre passphrase!), vous devriez pouvoir vous connecter à votre point d'accès:

sh# ifup eth2

Si vous avez iwconfig, vous pouvez le vérifier:

sh# iwconfig eth2
eth2      IEEE 802.11g  ESSID:"gatehal"  
          Mode:Managed  Frequency:2.412 GHz  Access Point: 00:26:XX:XX:XX:XX   
          Bit Rate:24 Mb/s   Tx-Power=20 dBm   Sensitivity=8/0  
          Retry limit:7   RTS thr:off   Fragment thr:off
          Encryption key:AE77-9C7D-DCCE-0829-7EC6-E247-60CB-BCA4   Security mode:open
          Power Management:off
          Link Quality=75/100  Signal level=-54 dBm  Noise level=-87 dBm
          Rx invalid nwid:0  Rx invalid crypt:62  Rx invalid frag:0
          Tx excessive retries:1  Invalid misc:30   Missed beacon:0

SSID caché

Pour continuer, voyons maintenant comment se connecter à un réseau qui ne diffuse pas son SSID. Bien que populaire, cette technique n'est certainement pas une mesure de sécurité! En effet, non seulement il s'agit là d'une simple dissimulation, mais en plus l'identifiant du réseau n'est pas forcément très bien caché [1]. Néanmoins, il peut y avoir des raisons tout à fait légitimes pour utiliser cette possibilité. Dans mon cas, il s'agissait surtout d'éviter de polluer la liste des réseaux qu'un utilisateur lambda est susceptible de voir avec un réseau auquel de toute manière il ne pourra pas se connecter.

Ici, le truc va simplement consister à utiliser les options wpa-ap-scan et wpa-scan-ssid supplémentaires dans la strophe de configuration de votre interface réseau sans fil. Celles-ci changent la stratégie utilisée par wpa_supplicant pour localiser les points d'accès (voir http://bugs.debian.org/358137):

iface eth2 inet static
	address 10.129.36.30
	netmask 255.255.255.0
	gateway 10.129.36.245
	dns-nameservers 10.129.36.2
	wpa-ap-scan 1
	wpa-scan-ssid 1
	wpa-ssid gatehal
	wpa-psk 85d27a6a75b733b36d63bf354545e60ad6202aa726874df04fd309ddf333f9fe

Oups

Voilà: vous pouvez désormais établir une connexion sécurisée à votre point d'accès. Très bien. A ceci près que toute notre sécurité repose sur la clé pré-partagée contenues dans le fichier /etc/network/interfaces. Or:

sh$ ls -l /etc/network/interfaces
-rw-r--r-- 1 root root 1812 2010-04-05 17:17 /etc/network/interfaces

Et oui: ce fichier est autorisé en lecture pour tout le monde! Autrement dit, n'importe qui ayant accès à votre machine peut récupérer la clé et l'utiliser pour se connecter de manière indue à votre point d'accès. Pas forcément très grave sur votre portable personnel. Plus gênant si le poste est partagé par plusieurs utilisateurs.

La solution évidente ici serait d'utiliser chmod pour supprimer les droit en lecture excessifs:

sh# chmod o-r /etc/network/interfaces

Ceci dit, je n'aime pas trop restreindre les permissions des fichiers standards. Non seulement cela peut interférer avec certains logiciel pré-supposant avoir accès à ces ressources, mais surtout, il existe toujours un risque que les permissions par défaut se voient restaurées par erreur: A l'occasion d'une mise à jour par exemple. Ou par un excès de zèle d'un administrateur stagiaire.

Pour ces raisons, je vais plutôt choisir une autre option: à savoir exporter la configuration WPA dans son propre fichier de configuration doté des permissions adéquates. Selon votre niveau de paranoïa, vous aurez le loisir de mettre ce fichier où vous voulez (comme sur une partition chiffrée, par exemple). Pour ma part, je vais rester modeste et me contenter de le mettre dans le répertoire /etc/local-wpa créé pour l'occasion:

sh# mkdir /etc/local-wpa
sh# chown root /etc/local-wpa
sh# chmod go-rwx /etc/local-wpa/
sh# ls -ld /etc/local-wpa/
drwx------ 2 root root 4096 2010-04-06 16:08 /etc/local-wpa/

Quand au contenu du fichier de configuration à proprement parlé, le voici:

sh# cat > /etc/local-wpa/wpa.conf << EOF
ap_scan=1

network={
	scan_ssid=1
	ssid="gatehal"
	psk=85d27a6a75b733b36d63bf354545e60ad6202aa726874df04fd309ddf333f9fe
}
EOF
sh# chmod og-rw /etc/local-wpa/wpa.conf

Par analogie avec la configuration utilisée dans /etc/network/interfaces vous devriez pouvoir retrouver la signification des différentes valeurs. J'attire juste votre attention sur la syntaxe subtilement différente, avec notamment l'utilisation de souligné au lieu de tiret, du symbole égal ou encore de guillemets et accolades. Autre petit piège, ap_scan est une option globale. Alors que les autres sont des options liées à chaque réseau. Pour tous les détails, je vous renvoie à la documentation (voir ci-dessous).

Bien sûr, pour terminer, il faut aussi supprimer de /etc/network/interfaces les informations que nous avons reportées dans /etc/local-wpa/wpa.conf. Et demander le chargement de ce fichier de configuration:

iface eth2 inet static
	address 10.129.36.30
	netmask 255.255.255.0
	gateway 10.129.36.245
	dns-nameservers 10.129.36.2
	wpa-conf /etc/local-wpa/wpa.conf

Vous pouvez maintenant redémarrez votre interface Wi-Fi pour vous assurer du fonctionnement de cette nouvelle configuration:

sh# ifdown eth2 && ifup eth2

Ressources

Vous trouverez plein d'informations et d'exemples dans l'aide de wpasupplicant. Si vous avez installé ce paquet, vous la trouverez dans /usr/share/doc/wpasupplicant/README.*.gz:

sh$ gunzip - < /usr/share/doc/wpasupplicant/README.Debian.gz | more
sh$ gunzip - < /usr/share/doc/wpasupplicant/README.wpa_supplicant.conf.gz | more