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.
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
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
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.
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
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
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.
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 ...
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.
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.
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é.
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
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.