Configuration serveurs : RADIUS et iptables

avril 14th, 2008

Le serveur RADIUS assure le AAA (Authorization, Authentication et Accounting). Pour ce faire, le service RADIUS recoit des informations du serveur IPSEC à travers la couche L2TP/PPP. C’est effectivement par ce biais que le client peut émettre une demande d’authentification supplémentaire au seul certificat.

sur le serveur IPSEC, nous avons dans /etc/options.l2tpd.lns qui est appelé par xl2tpd (pppoptfile = /etc/ppp/options.l2tpd.lns) les instructions suivantes :
plugin radius.so
plugin radattr.so

qui suffisent à utiliser un serveur RADIUS depuis L2TP.
Le fichier /etc/radiusclient.conf donne :
authserver "serveur radius"
acctserver "serveur radius"

Le reste des options étant des définitions standards, tels les dictionnaires
dictionary /etc/radiusclient/dictionary
dans lequel on retrouve :
INCLUDE /etc/radiusclient/dictionary.rfc2868
INCLUDE /etc/radiusclient/dictionary.microsoft
INCLUDE /etc/radiusclient/dict.perso

Le dictionnaire de la RFC 2868 est récupéré sur une machine sur laquelle se trouve un serveur RADIUS, mais il faut modifier certains type : « integer has_tag » devient « integer » et « string has_tag » devient « string ». Sans ces modifications, une erreur apparait dans les logs au lancement de l2tp. Il faut aussi enlever de ces fichiers dictionnaire les lignes de début et de fin de dictionnaire comme BEGIN-VENDOR et END-VENDOR .
Le dictionnaire de la RFC 2668 nous permet de manipuler les VLANs (Tunnel-Type 13 et Tunnel-Medium-Type IEEE-802 et la valeur du VLAN par le champ Tunnel-Private-Group-Id). Sans ces champs, il est impossible de définir les VLANs.

Cette approche à toute son utilité si nous voulions récupérer un numéro de VLAN depuis le serveur LDAP de l’UFC ou dans un fichier local (ou base de données). Or, notre approche du problème est légerement différente puisque nous n’utilisons pas de prédéfinition de VLAN pour un utilisateur, mais plutôt une définition de REALM permettant pour un même utilisateur d’accéder à différents VLANs.

Le serveur IPSEC est prêt à se servir du serveur RADIUS et les informations que nous récupérons sont :
nom de l’utilisateur, le realm, une date d’expiration, le réseau, la marque iptables, les indications de validité du compte et du realm.
Si le RADIUS du projet VPN est chainé à un RADIUS local de laboratoire, celui-ci peut renvoyer une valeur pour l’adresse IP du client, le RADIUS de laboratoire effectuant l’aspect DHCP. La valeur de l’IP ainsi retournée doit correspondre au réseau.
La marque iptables possède toute une histoire. Sur le serveur IPSEC, nous avons deux cartes réseaux. La première définie le réseau de connexion du serveur au monde extérieur et un route -n nous donne :
0.0.0.0 194.57.91.254 0.0.0.0 UG 0 0 0 eth1
La seconde est configuré en mode trunk et possède tous les VLANs rattachés au VPN. De fait, cette interface possède des sous-interfaces sur des VLANs (ex :
eth0.410 Lien encap:Ethernet HWaddr 00:B0:D0:68:72:BD
inet adr:172.20.252.253 Bcast:172.20.252.255 Masque:255.255.255.0
)
Mais il s’est posé un problème important ; dès la fin de la première connexion, les connexions suivantes n’étaient plus routées correctement. Pour corriger ce problème, nous avons défini un routage sélectif par marquage des paquets suivant leur origine.
auto eth0.410
iface eth0.410 inet static
address 172.20.252.253
netmask 255.255.255.0
network 172.20.252.0
broadcast 172.20.252.255
up ip route add default via 172.20.254 dev eth0.410 table ufc.generic
up ip rule add fwmark 13 table ufc.generic
down ip rule del fwmark 13
down ip route del table ufc.generic

Et on marque les paquets à l’initialisation de la session PPP faite par le client suivant le REALM demandé et accepté.
Avec l’exécutable perl /etc/ppp/ip-up.d/vpn-connect, nous créons un fichier /var/run/radattr.pppXX qui contient les informations retournées par RADIUS (ex :
Framed-IP-Address 172.20.128.37
Framed-IP-Netmask 255.255.255.0
Ufc-Iptables-Mark 12
)
Lors de la deconnexion, c’est le fichier /etc/ppp/ip-down.d/vpn-disconnect qui est exécuté.
Nous avons ainsi les logs de l’exécution des scripts :
Apr 10 16:37:35 test-vpn vpn-connect: /sbin/iptables -t mangle -A PREROUTING -s 172.20.128.37 -i ppp0 -j MARK --set-mark 12
Apr 10 16:37:40 test-vpn vpn-disconnect: iptables -D PREROUTING -s 172.20.128.37 -i ppp0 -j MARK --set-mark 0xc
Sur le serveur, il ne faut pas oublier de définir les valeurs données dans le fichier /etc/network/interfaces ; cela s’effectue en ajoutant les valeurs dans /etc/iproute2/rt_tables :
10 femto.ext
11 lifc.lab
12 lifc.edu
13 ufc.generic

Ainsi le traffic PPP du client est marqué correctement et est routé en utilisant le routeur du VLANs sur lequel il est raccordé.

Configuration serveurs : architecture

avril 14th, 2008

Le projet VPN repose non pas sur un seul serveur, mais sur des serveurs hébergants des services.
Chacun de ces services peut être colocalisé avec d’autres, mais pour des raisons d’administration et de risques (panne, piratgae) ceux-ci sont répartis.
Le serveur IPSEC a une adresse IP publique atteignable depuis l’extérieur de l’UFC sur le protocole ESP (50) ;
Le serveur d’authentification n’est atteignable que par le serveur IPSEC (classe privée). Il héberge un serveur RADIUS ;
La base de données POSTGRESQL qui contient les droits des utilisateurs est atteignable par le serveur RADIUS.

schéma de principe lors de la connexion d\'un client

Problème Windows : IE7 et proxy

avril 10th, 2008

Internet Explorer 7 permet de définir les proxies en fonction de chaque connexion. Il est donc impératif si vous voulez travailler avec IE7 sous une connexion VPN de définir le proxy.pac de l’UFC dans les propriétés de la connexion VPN.
La documentation sur le VPN (document PDF) indique la marche à suivre.

Problème linux : Fedora Core 7, 8, 9 et PPP/L2TP

avril 10th, 2008

La version de base il faut recompiler les sources de PPP (cf CRI XXXXXXXXXXXXXXXXX) car la version 2.4.2 (FC 7, 8) et la version 2.4.4-rel6 (FC 9) ne possède pas l’option replacedefaultroute nécessaire dans la configuration L2TP/PPP

VPN : encapsulation des informations

avril 10th, 2008

sur le shéma ci-dessous, nous voyons comment IPSEC encapsule les données utilisateurs. Dans le mode transport et le mode tunnel.
encapsulation ipsec mode transport et tunnel

sur ce nouveau shéma, nous voyons les différentes étapes d’encapsulation lorsqu’on utilise L2TP en mode tunnel
ipsec et encapsulation l2tp

enfin sur ce troisième shéma, nous décrivons l’encapsulation d’une connexion l2tp à travers du nat
ipsec avec l2tp et du nat-t

Client Linux et Serveur : options dans sysctl.conf

avril 10th, 2008

Pour le bon fonctionnement du proxy-arp du serveur VPN,

le fichier /etc/sysctl.conf du serveur VPN doit être configuré comme suit en ajoutant ces options :
net.ipv4.ip_forward=1
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.conf.all.log_martians=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2


Sans ces options, le proxy-arp du serveur VPN ne fonctionne pas correctement et empêche le client d’accéder à quoi que ce soit hors le serveur VPN lui même.

Gantry : bug dans les modules MP10.pm et MP20.pm

avril 10th, 2008

Un patch a été envoyé (29/02/2008) pour corriger des erreurs sur le mod_perl (1 et 2) dans Gantry.

Certificat client : usage

avril 10th, 2008

Avertissement aux utilisateurs : lorsque le CRI vous délivre, par l’intermédiaire de votre correspondant réseau, un certificat pour utiliser le VPN, ce certificat est à votre nom ; il est personnel, non cessible et vous avez la pleine responsabilité de son utilisation.

Durée de validité du certificat : la durée d’un certificat est normalement de 3 ans sauf spécification contraire.
Lorsque votre certificat arrive à échéance vous serez averti (3 mois, 1 mois, 15 jours avant) ainsi que votre correpondant.

Compatibilité des certificats avec les différents systèmes d’exploitation : un certificat délivré par le CRI à un usager est configuré pour fonctionner avec un certain type de machine.
Les distinctions se font vis à vis de l’OS est plus particulièrement pour MacOS (tiger et suivants), Windows (XP et Vista), Linux (debian/ubuntu, centos/fedora, mandriva).
L’installation d’un certificat prévue pour un MacOS ne fonctionnera pas sur un Windows et vice-versa.

Format du certificat :
Pour windows, le certificat comporte un seul fichier qui porte l’extension .p12.

Pour Linux, le certificat est composé des trois fichiers à copier dans différents répertoires.

Pour MacOS, un seul fichier avec l’extension .p12.

Certificat serveur et MacOS

avril 10th, 2008

Le certificat du serveur doit absolument contenir une information subjectAltName. Dans le fichier openssl.cnf il faut donc (si on utilise tinyCA) configurer la section suivante ainsi :
[ server_cert ]
...
#subjectAltName = email:copy
subjectAltName = IP:"adresse du serveur VPN"

Sans cette option, les clients MacOS ne peuvent pas établir la connexion IPSEC.

VPN : qui s’occupe de quoi ?

avril 10th, 2008

Le projet est techniquement réalisé par Jean-Michel Caricand, Ghislaine Foltête et Marc Hamelin.
Par techniquement on entend la configuration/debug/patch sur les applications openswan, (x)l2tpt, freeradius, gantry, apache, postgresql, openCA/tinyCA. C’est l’interaction entre ces différentes briques de base qui définit le projet VPN.
Le projet est opérationnellement maintenu sur différents niveaux :
RSSI : Bertrand Astric, Patrice Koch
Patch Centos : Ghislain Pruniaux
Patch sur les outils : Jean-Michel Caricand
Maintenance VPN (tous les outils) : Jean-Michel Caricand, Ghislaine Foltête et Marc Hamelin
Suivi des certificats : Ghislaine Foltête et Marc Hamelin sous couvert des RSSI
Realm : correspondants réseaux
Droits utilisateurs : correpondants réseaux
Documentation : Jean-Michel Caricand, Ghislaine Foltête et Marc Hamelin
Communication : Ghislaine Foltête et Marc Hamelin