FreeRadius
De OpenWikiBSD.
Sommaire |
Pour quoi faire ?
Du Wifi, du Wifi, du Wifi.... Certains dans les établissements scolaires sautent comme des cabris pour faire mumuse avec leur Smartphone ou pour éviter de débrancher l'imprimante de la salle des profs et lui piquer son câble réseau... (Bon, d'accord, je me retrouve un peu dans la première catégorie..)
Donc, du Wifi. OK Mais du vrai, pas du hotspot public en accès ouvert ou avec une clé WEP en 4 octet dont la passphrase commence par to et finit par to et qui sera affichée sur la machine à café de la salle des profs...
Et un MINIMUM de gestion des clients et de leur utilisateur...
Bref, afin d'installer un service Wifi pas trop troué, on installe un serveur Radius (en VM)....
Comment faire ?
Plusieurs possibilités existent, mais au final, le choix est pour le moins réduit :
- Le mot de passe est stocké chiffré dans l'annuaire LDAP de manière non-reversible. Donc
MS-CHAPcôté authentification etPEAPcôté protocole.
- On ne veut pas avoir de certificat client à gérer, donc
EAP-TLS.
- On veut un algorithme de chiffrement robuste donc
EAP-MD5et assez ouvert dont la solidité ne repose pas exclusivement sur la solidité des mots de passe, doncLEAP.
Reste....tada ..
Principe
La connexion est chiffrée en WPA-Enterprise. En gros, un certificat serveur seul est utilisé pour chiffrer la connexion (EAP-TTLS) entre le poste client et le point d'accès Wifi (802.11b & g) qui va servir d'intermédiaire avec le serveur Radius. Ce dernier va alors interroger l'annuaire LDAP pour valider les identifiants de connexion. Très simple pour l'utilisateur (un tout petit peu moins pour l'administrateur ;-) ) et très sécurisé. Les clés de chiffrement sont à usage unique et à changement réguliers.
Le concept :[1]
Installation
- OS :OpenBSD 4.5
- Fichiers d'exemple : /usr/local/share/examples/freeradius
- Fichier de conf : /etc/raddb/radiusd.conf
pkg_add -v http://ftp.arcane-networks.fr/pub/OpenBSD/$(uname -r)/packages/$(uname -m)/freeradius echo "if [ -x /usr/local/sbin/radiusd ]; then install -d -o _freeradius /var/run/radiusd echo -n ' radiusd'; /usr/local/sbin/radiusd fi " >> /etc/rc.local
- Test :
/usr/local/sbin/radiusd -X
....
rlm_eap: SSL error error:02001002:system library:fopen:No such file or directory rlm_eap_tls: Error reading certificate file /etc/raddb/certs/server.pem rlm_eap: Failed to initialize type tls
Il manque le certificat serveur indispensable pour l'usage de radius. Ce n'est pas très grave; on sait déjà faire
Il faut coller le certificat serveur.pem dans /etc/raddb/certs/server.pem
et le certificat de l'AC, dans /etc/raddb/certs/ca.pem
cp radius.pem /etc/raddb/certs/server.pem chmod 744 /etc/raddb/certs/server.pem
Puis faire de même avec le certificat de l'autorité de certification....
cp ca.pem /etc/raddb/certs/ca.pem chmod 744 /etc/raddb/certs/ca.pem
Vérifiez quand même que tout colle bien côté X509, ça aidera à éviter les soucis ultérieurs :
openssl verify -verbose -CApath /etc/raddb/certs/ -CAfile /etc/raddb/certs/ca.pem /etc/raddb/certs/server.pem /etc/raddb/certs/server.pem: OK
Important
Si vous rencontrez toujours cette erreur:
/usr/local/sbin/radiusd -X blah blah rlm_eap: SSL error error:02001002:system library:fopen:No such file or directory rlm_eap_tls: Error reading certificate file /etc/raddb/certs/server.pem rlm_eap: Failed to initialize type tls
Sachez qu'il y a un souci dans l'install par défaut de freeradius\OpenBSD. Il manque deux fichiers
dd if=/dev/urandom of=/etc/raddb/certs/random bs=1024 count=100 openssl dhparam -out /etc/raddb/certs/dh 1024
Et tout rentre dans l'ordre.
/usr/local/sbin/radiusd -X
doit à ce moment être en attente de connexion.
Configuration
Une bonne règle de base avec Feeradius : C'est un outil fort complexe, fort puissant et TRES facile à casser. On fera donc en sorte de ne modifier QUE le strict minimum...
Les fichiers importants
users
Il gère les.....utilisateurs, bravo !
- Ajoutez un user test, pour le début
echo " usertest Cleartext-Password := \"password\" " >> /etc/raddb/users
clients.conf
Il gère les clients au sens radius (les authenticator, les switches, les AP Wifi).
- Copie de sauvegarde
cp /etc/raddb/clients.conf /etc/raddb/clients.conf.ORI
- Ajout des AP Wifi, du serveur Nagios etc..
echo "
#Nagios
client Nagios {
secret = SECRETNAGIOS
shortname = Nagios
ipaddr = @IP NAgios
}
#Wifi AP3
client AP3 {
secret = \"SECRET_AP3\"
shortname = AP3
ipaddr = @IP AP3
nastype = other
}
# En local
client localhost {
ipaddr = 127.0.0.1
secret = \"SECRETLOCAL\"
require_message_authenticator = no
shortname = localhost
nastype = other
}
" > /etc/raddb/clients.conf
Où les SECRET_XX est le secret partagé entre l'authenticator et le serveur radius.
Si votre supplicant n'est pas correctement enregistré dans clients.conf :
Ignoring request to authentication address * port 1812 from unknown client @IP port 54762
Réseau
Comme on a eu un souci avec les limitations du matériel , il a fallu aliaser (un petit néologisme pour la route) la carte réseau:
ifconfig em0 alias 192.168.1.9 netmask 255.255.255.0
La carte est donc aliasée (rebelote) :
ifconfig -a em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 172.16.0.223 netmask 0xffff0000 broadcast 172.16.255.255 inet 192.168.1.9 netmask 0xffffff00 broadcast 192.168.1.255
LDAP
Alors, selon cette page , seule l'authentification PAP serait utilisable avec une base d'utilisateurs stockée dans un annuaire OpenLDAP. Ce qu'undique également cette page.
Le schema est là :/usr/local/share/doc/freeradius/examples/openldap.schema
A coller sur le serveur LDAP (Un serveur SambaEdu3, serait bienvenu) dans /etc/ldap/schema/radius.schema
Puis ajouter à /etc/ldap/slapd.conf :
include /etc/ldap/schema/radius.schema
pkg_add -v http://ftp.arcane-networks.fr/pub/OpenBSD/$(uname -r)/packages/$(uname -m)/freeradius-ldap
Décommenter ldap dans /etc/raddb/sites-enabled/inner-tunnel
Ajouts dans radiusd.conf, dans la section modules :
ldap ldap {
server = "@IP_SRV_LDAP"
identity = "cn=admin,BASE_DN"
password = PASS_admin
basedn = "BASE_DN"
filter = "(|(|(uid=%{Stripped-User-Name:-%{User-Name}})(mail=%{Stripped-User-Name:-%{User-Name}}))(mail=%{Stripped-User-Name:-%
{User-Name}}@lyceenobel.org))"
base_filter = "(objectclass=radiusprofile)"
ldap_connections_number = 5
timeout = 4
timelimit = 3
net_timeout = 1
tls {
start_tls = no
}
dictionary_mapping = ${raddbdir}/ldap.attrmap
auto_header = yes
groupname_attribute = radiusGroupName
groupmembership_filter = "(|(|(uid=%{Stripped-User-Name:-%{User-Name}})(mail=%{Stripped-User-Name:-%{User-Name}}))(mail=%{Strip
ped-User-Name:-%{User-Name}}@lyceenobel.org))"
groupmembership_attribute = radiusGroupName
access_attr = "uid"
### password_attribute = userPassword
set_auth_type = yes
}
Enfin, ajouter dans users :
DEFAULT Ldap-UserDN := `uid=%{User-Name},ou=People,BASEDN`
Les logs
Syslog
On va loguer les tentatives de connexion des utilisateurs :
# Log authentication requests to the log file.
#
# allowed values: {no, yes}
#
auth = no
devient
auth = yes
On relance radius
On peut également loguer les mdp des tentatives de connexions, voire des connexions. Ca me parait TRES risqué d'un pt de vue légal..
# allowed values: {no, yes}
#
auth_badpass = no
auth_goodpass = no
Moi, je ne me risquerais à loguer ces données.
Ce qui donne :
tail -n 500 -f /var/log/radius/radius.log |grep Login Login OK: [user1] (from client AP4 port 33 cli @MAC1 via TLS tunnel) Login OK: [user1] (from client AP4 port 33 cli @MAC1) Login OK: [schwarzp] (from client AP4 port 33 cli @MAC via TLS tunnel) Login OK: [schwarzp] (from client AP4 port 33 cli @MAC)
MySQL
mysql create database radius; grant all on radius.* to USER@localhost identified by 'PASSWORD'; exit
mysql radius < /usr/local/share/examples/freeradius/sql/mysql/schema.sql
Adapter sql.conf avec les variables de cx.
Ajouter dans /etc/raddb/radiusd.conf, à la fin :
post-auth {
Post-Auth-Type ACCEPT {
# User OK
sql
}
Post-Auth-Type REJECT {
# Login failed: log to SQL database.
sql
}
}
Le fichier contenant les commandes SQL est /etc/raddb/sql/mysql/dialup.conf
Ce qui donne à la fin :
mysql> select * from radpostauth; +----+-----------+------------------------------------------------------------------+--------------------+---------------------+ | id | username | pass | reply | authdate | +----+-----------+------------------------------------------------------------------+--------------------+---------------------+ | 1 | teste | 0x46313041383633343035344138453741463342363634313135324243343642 | Access-Reject | 2010-06-10 15:23:54 | | 2 | teste | 0x46313041383633343035344138453741463342363634313135324243343642 | Access-Reject | 2010-06-10 15:25:58 | | 3 | teste | 0x46313041383633343035344138453741463342363634313135324243343642 | Access-Reject | 2010-06-10 15:53:28 | | 4 | teste | 0x46313041383633343035344138453741463342363634313135324243343642 | Access-Reject | 2010-06-10 16:10:57 | | 5 | teste | 0x46313041383633343035344138453741463342363634313135324243343642 | Access-Reject | 2010-06-10 16:27:25 | | 6 | teste | 0x46313041383633343035344138453741463342363634313135324243343642 | Access-Reject | 2010-06-10 16:29:07 | | 7 | usertest | password | Access-Reject | 2010-06-10 18:21:42 | | 8 | usertest | password | Access-Reject | 2010-06-10 18:22:47 | +----+-----------+------------------------------------------------------------------+--------------------+---------------------+
Oui, je logue les mdp, enfin leur hash, mais ça me pose souci néanmoins. De plus il faut voir comment loguer les CX réussies.
Monter son FreeWifi-like à soi
Et si aviez envie de faire comme Free ? Tout plein d'AP partout en France (ou ailleurs) et une base d'authentification unique ? Un AP estampillécompatible openBSD-edu.net et vous pouvez vous loguer avec vos identifiants de l'annuaire LDAP distant de plusieurs centaines (milliers ??) de km ?
Trop de la balle!
- Vous demandez à votre AP d'utiliser comme serveur Radius la patte LAN de votre routeur NAT.
- Vous redirigez toute requête entrante sur la patte LAN en UDP/1812 vers l@IP publique de votre établissement
rdr pass log on $Interface_LAN proto udp from $PLageIP_WIFI to $@IP_LAN_PEDA port radius -> $@WAN_EPLE port radius
- Sur le routeur de l'établissement, vous faites la manip inverse
rdr pass on $INterface_WAN proto udp from $La_Liste_des_@IP_atutorisees to $@IP_WAN port radius -> $@IP_SRV_RADIUS port radius
Cerise sur le gateau, si vous utilisez le même SSID qu'au bahut,...c'est totalement transparent! Je vous promet un beau succès d'estime avec vos collègues dont le smartphone configuré pour l'établissement marche à l'identique chez vous et......leur permet de regarder la coupe du monde de foot (Spéciale dédicace Luton ;-) )
Pour info, seule l'auth radius va faire sa centaine de km aller-retour, les paquets suivants ne suivent que VOTRE ligne ADSL, avec le débit qui va bien.
Debug
- /usr/local/sbin/radiusd -X
Il faut surabuser de cette commande ! Elle est extrêmement explicite et verbeuse. IL est déconseillé de poser une question sur la liste freeradius-users@lists.freeradius.org sans donner la sortie de cette commande
- Attention, dans ce mode , les logs ne sont pas envoyés sur le fichier de logs (/var/log/radius/radius.log, par défaut)
- Une fois lancée la commande précédente, essayez :
radtest testuser password 127.0.0.1 1812 testing123
- Si la réponse est une suite de
Sending Access-Request of id 194 to 127.0.0.1 port 1812 User-Name = "testuser" User-Password = "password" NAS-IP-Address = 127.0.0.1 NAS-Port = 1812 . . . radclient: no response from server for ID 194 socket 5
Alors radius ne tourne pas
- Si la réponse est
Sending Access-Request of id 194 to 127.0.0.1 port 1812 User-Name = "testuser" User-Password = "password" NAS-IP-Address = 127.0.0.1 NAS-Port = 1812 rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=44, length=20
Alors radius tourne ! C'est un bon début
- Si la réponse est
Sending Access-Request of id 194 to 127.0.0.1 port 1812 User-Name = "testuser" User-Password = "password" NAS-IP-Address = 127.0.0.1 NAS-Port = 1812 rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=89, length=20
Alors radius tourne et votre user a le droit de se connecter.. Regardez : Access-Accept !
Vous êtes sur la bonne voie.
- Si jamais ça ne marche toujours pas; une dernière solution :
Vous collez les logs de radiusd -X dans le formulaire et une colorisation syntaxique avec analyse des logs vous fournit pas mal de réponses.
Soucis rencontrés
- Le message d'erreur qui m'a le cassé les pieds ...
WARNING: You set Proxy-To-Realm = LOCAL, but the realm does not exist! Cancelling invalid proxy request. WARNING: Please update your configuration, and remove 'Auth-Type = Local' WARNING: Use the PAP or CHAP modules instead.
WARNING: You set Proxy-To-Realm = LOCAL, but the realm does not exist! Cancelling invalid proxy request.
J'ai essayé d'ajouter
DEFAULT EAP-Type == PEAP, Proxy-To-Realm := LOCAL
ou
bart Auth-Type := MS-CHAP, Cleartext-Password == "pass"
à users
Sans trop de succès... D'où une réinstall (de Freeradius, pas de l'OS...) très rapide.
Surveillance
Si vous jouez avec radius, il va vite devenir critique...On le surveille ??
Nagios est donc évidemment l'outil adhoc.
Dans /etc/nagios3/objects/service.cfg
######### Radius #####
define service{
use generic-service
hostgroup_name radius_servers
service_description Radius
check_command check_radius!USER!PASS
}
et dans /etc/nagios-plugins/config/radius.cfg
# 'check_radius' command definition
define command{
command_name check_radius command_line /usr/lib/nagios/plugins/check_radius -F /etc/radiusclient/radiusclient.conf -H '$HOSTADDRESS$' -P 1812 -u '$ARG1$' -p '$ARG2$' }
Ne fonctionne pas ...encore

