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-CHAP côté authentification et PEAP côté protocole.
  • On ne veut pas avoir de certificat client à gérer, donc EAP-TLS.
  • On veut un algorithme de chiffrement robuste donc EAP-MD5 et assez ouvert dont la solidité ne repose pas exclusivement sur la solidité des mots de passe, donc LEAP.

Reste....tada ..

EAP-TTLS


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 :

[2]

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

Outils personnels