WLAN Sécurisé

Introduction

La majorité des réseaux wireless utilisent le protocole de chiffrement WEP (comprendre "Wired Equivalent Privacy") afin d'assurer la confidentialité des échanges. Cependant, ce protocole est affecté par plusieurs faiblesses, comme un vecteur d'initialisation RC4 transmis en clair, des faiblesses aux attaques par rejeu etc.

OpenBSD ne dispose actuellement pas de framework WPA/WPA2 et n'offre donc pas cette alternative qui, a défaut d'être idéale, apporte quelques solutions à ces problèmes.

Ainsi, afin d'assurer une sécurité forte pour un réseau wireless peuplé de machines OpenBSD, la solution à adopter est IPsec, supportée depuis plusieurs années au sein des systèmes *BSD, et qui apporte qui plus est une sécurité bien plus élevée que les solutions traditionnelles précédemment évoquées. Si la version précédente de cette documentation était quelque peu complexe, et plongeait le lecteur dans les méandres de la configuration d'isakmpd, cette nouvelle version s'attache à utiliser le nouvel outil de mise en oeuvre d'IPsec sur OpenBSD, ipsecctl, et ce depuis la release 3.8, au combien plus facile à configurer.

Configuration du Point d'accès client

Réseau

Commençons par la configuration réseau; l'interface principale utilisée sur le point d'accès doit être placée en mode hostap. Ceci peut se faire avec le fichier de configuration suivant (pour le cas d'une carte Atheros); dans /etc/hostname.ath0 :

up
inet 192.168.1.254 255.255.255.0 NONE media autoselect \
	mediaopt hostap nwid wlan chan 11
rtsol

Dans /etc/hostname.enc0 :

up

WEP n'est ainsi pas activé, étant relativement inutile. Il est possible, à des fins de commodité, de configurer également un serveur DHCP afin d'attribuer les adresses automatiquement. Il faut dans un tel cas conserver une caractéristique constante, comme l'adresse IP d'un hôte, ou son FQDN. Voici un exemple basé sur les adresses IP.

Une telle configuratuon nécessite que le routage des paquets ipv4 et/ou ipv6 soit activé sur le point d'accès.

% sudo sysctl net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
% sudo sysctl net.inet6.ip6.forwarding=1
net.inet6.ip6.forwarding: 0 -> 1

dhcpd

Dans /etc/dhcpd.conf :

shared-network LOCAL-NET {
	option  domain-name "domain.tld";
	option  domain-name-servers 192.168.1.254;

	# lease de 1 jour
	default-lease-time 86400;
	max-lease-time 86400;

	deny unknown-clients;
	deny bootp;

	subnet 192.168.1.0 netmask 255.255.255.0 {
		option routers 192.168.1.254;

		host client1
		{
			hardware ethernet 00:0F:B4:42:5B:67;
			fixed-address 192.168.1.100;
                }
	}
}

Ainsi, et en ne permettant qu'aux adresses MAC répertoriées d'obtenir une ip (option deny unknown-clients), l'hôte client1 obtiendra systématiquement l'adresse IP 192.168.1.100.

Dans /etc/dhcpd.interfaces :

ath0

Configuration d'IPsec

Pour ce qui est de la configuration IPsec, dans le fichier /etc/ipsec.conf :

ike esp from any to 192.168.1.100 psk "test"

A renouveller donc, pour chaque hôte.

Règles de filtrage

Afin de configurer Packet Filter :

wlan    = "{ 192.168.1.0/24 }"
wlan_if = "ath0"

scrub in

set skip on { lo enc0 }

block all
antispoof quick for { lo $int_if }

pass in on $wlan_if proto esp from $wlan keep state
pass out on $wlan_if proto esp to $wlan keep state
pass in on $wlan_if proto udp from $wlan port isakmp keep state
pass out on $wlan_if proto udp to $wlan port isakmp keep state 

Clients wireless

Réseau

Afin de configurer l'adaptateur wireless du client (lui aussi munit d'un chipset Atheros); dans /etc/hostname.ath0 :

up
nwid wlan chan 11
dhcp
rtsol

Dans /etc/hostname.enc0 :

up

Configuration d'IPsec

Pour ce qui est de la configuration IPsec, dans le fichier /etc/ipsec.conf :

ike esp from any to any peer 192.168.1.254 psk "test"

Ceci aura donc pour effet de définir un intermédiaire par défaut, en l'occurrence le point d'accès.

Lancement

Lancement des différentes composantes

Sur le serveur :

% sudo dhcpd -q
% sudo pfctl -F rules
% sudo pfctl -f /etc/pf.conf
% sudo isakmpd -K
% sudo ipsecctl -vf /etc/ipsec.conf
% sudo sh /etc/netstart

Sur le client

% sudo isakmpd -K
% sudo ipsecctl -vf /etc/ipsec.conf
% sudo sh /etc/netstart

Ces lancements sont automatisables grâce au fichier rc.conf :

...
isakmpd_flags="-K"      # for normal use: ""
...
pf=YES                  # Packet filter / NAT
ipsec=YES               # IPsec
...

Visualisation

Une fois les connexions initiées, il devrait être possible de voir la sortie suivant sur le serveur :

% sudo ipsecctl -sa

FLOWS:
flow esp in from 192.168.1.100 to 0.0.0.0/0 peer 192.168.1.100
flow esp out from 0.0.0.0/0 to 192.168.1.100 peer 192.168.1.100

SADB:
esp tunnel from 192.168.1.254 to 192.168.1.100 spi 0xfa777092 enc aes
auth hmac-sha2-256
esp tunnel from 192.168.1.100 to 192.168.1.254 spi 0x8691a04a enc aes
auth hmac-sha2-256

Ainsi, les flux (en l'occurence pour une topologie de type clients-passerelle) ont été créés, et la SADB ("Security Association DataBase") s'est vu doter de deux entrées correspondant aux sens entrant et sortant. Pour rappel, il est nécessaire que 4 entrées au total soient créées dans les SADB afin que deux hôtes puissent communiquer.

Dianostique

Si la configuration n'est pas fonctionnelle, il est possible de lancer isakmpd avec l'option -DA=XX ou XX représente un indice de verbosité, afin d'obtenir des informations complémentaires (c.f isakmpd(8)). De même, il est possible d'exécuter ipsecctl avec le switch -v.

Quelques éléments en vrac

Authentification

Dans cet exemple, l'authentification par clés statiques a été forcée grâce au mot clé psk. Il est également possible de fonctionner avec des clés et certificats. Auquel cas, la clé publique du point d'accès appartenant au couple clés publique/privée générée automatiquement par rc devra être copiée sur le client, et réciproquement...

Il faut donc dans un tel cas simplifier le fichier ipsec.conf, en supprimant le mot clé psk ainsi que la passphrase associé.

ipcomp

Afin d'accélérer les communications, il est possible d'utiliser le protocole ipcomp.

% sudo sysctl net.inet.ipcomp.enable=1
net.inet.ipcomp.enable: 0 -> 1

Perspectives d'évolution

ipsecctl est un nouveau relativement récent qui présente de nombreux avantages vis à vis des systèmes précurseurs, puisqu'il (pour reprendre le manuel) constitue un niveau d'abstraction supplémentaire afin de simplifier le mise en place d'IPsec. Etant en constante évolution, certaines fonctionnalités sont rajoutées, comme récemment le mot clé dynamic qui permet d'activer le système DPD.


Alexandre Anriot - http://www.atlantilde.com/aanriot/