Vous êtes sur la page 1sur 116

freeRADIUS

Serveur RADIUS libre, performant et modulaire


mais pas vraiment simple

Aurlien Geron, Wirst, 7 janvier 2011

mercredi 19 janvier 2011

Plan

mercredi 19 janvier 2011

Plusieurs protocoles : RADIUS, EAP... Un serveur sous GPLv2 Un systme de conguration puissant Une multitude de modules Comment crire un module ?

Source image: http://crshare.com/abstract-backgrounds-vector-clipart/

Organisation

La conguration se trouve dans les chiers situs dans /etc/freeradius et ses sous-rpertoires Pour cette prsentation, on distinguera plusieurs parties dans la conguration :

La conguration du dictionnaire RADIUS La conguration de base du serveur La conguration des politiques de gestion des requtes La conguration des modules La conguration du roaming

mercredi 19 janvier 2011

Organisation

La conguration se trouve dans les chiers situs dans /etc/freeradius et ses sous-rpertoires Pour cette prsentation, on distinguera plusieurs parties dans la conguration :

La conguration du dictionnaire RADIUS La conguration de base du serveur La conguration des politiques de gestion des requtes La conguration des modules La conguration du roaming

mercredi 19 janvier 2011

Dictionnaire RADIUS

Rappel : le nom et le type des attributs ne transitent pas dans les paquets RADIUS, seulement leur numro et leur valeur Il serait pnible de congurer le serveur freeRADIUS en faisant rfrence aux attributs au travers de leur numro Cest pour cela que freeRADIUS utilise un dictionnaire qui permet dassocier un nom et un type chaque attribut

mercredi 19 janvier 2011

Dictionnaire RADIUS
Le chier /etc/freeradius/dictionary est le point dentre de la dnition du dictionnaire RADIUS utilis dans la conguration du serveur freeRADIUS Il ne contient par dfaut quune seule ligne (hormis les commentaires), pour inclure le dictionnaire standard :
$INCLUDE /usr/share/freeradius/dictionary

Ce chier inclut lui-mme de nombreux autres dictionnaires :


$INCLUDE $INCLUDE $INCLUDE ... $INCLUDE $INCLUDE ... dictionary.rfc2865 dictionary.rfc2866 dictionary.rfc2867 dictionary.cisco.bbsm dictionary.clavister

Pour rajouter des dnitions dattributs personnaliss, il faut modier /etc/freeradius/dictionary, et jamais les dictionnaires /usr/share/freeradius/dictionary.*

mercredi 19 janvier 2011

Dictionnaire RADIUS
Voici pour exemple le dbut du dictionnaire qui contient les attributs de la RFC 2865 :
# -*- text -*# # Attributes and values defined in RFC 2865. # http://www.ietf.org/rfc/rfc2865.txt # ATTRIBUTE User-Name 1 string ATTRIBUTE User-Password 2 string ATTRIBUTE CHAP-Password 3 octets ATTRIBUTE NAS-IP-Address 4 ipaddr ATTRIBUTE NAS-Port 5 integer ATTRIBUTE Service-Type 6 integer ATTRIBUTE Framed-Protocol 7 integer ATTRIBUTE Framed-IP-Address 8 ipaddr ATTRIBUTE Framed-IP-Netmask 9 ipaddr ATTRIBUTE Framed-Routing 10 integer ATTRIBUTE Filter-Id 11 string ATTRIBUTE Framed-MTU 12 integer ATTRIBUTE Framed-Compression 13 integer ATTRIBUTE Login-IP-Host 14 ipaddr ATTRIBUTE Login-Service 15 integer ATTRIBUTE Login-TCP-Port 16 integer # Attribute 17 is undefined ATTRIBUTE Reply-Message 18 string ATTRIBUTE Callback-Number 19 string ...

encrypt=1

Type de chiffrement

mercredi 19 janvier 2011

Dictionnaire RADIUS

Pour certains attributs, les valeurs possibles sont elles-mmes numrotes, et ce qui transite dans un paquet RADIUS est ce numro (et non une chane de caractres). L encore, pour viter de faire rfrence aux valeurs possibles avec leur numro dans la conguration, le dictionnaire permet dtablir la correspondance numro nom Par exemple, dictionary.rfc2865 prvoit les valeurs suivantes pour lattribut Framed-Compression (attribut numro 13) :
... # Framed Compression Types VALUE Framed-Compression VALUE Framed-Compression VALUE Framed-Compression VALUE Framed-Compression ...
mercredi 19 janvier 2011

None Van-Jacobson-TCP-IP IPX-Header-Compression Stac-LZS

0 1 2 3

Dictionnaire RADIUS

Enn, dans le cas des attributs propritaires (cest dire Vendor-Specific), le nom de la socit nest pas transmis, mais plutt son numro dlivr par lorganisme IANA Le dictionnaire permet l aussi dtablir la correspondance entre le numro et le nom de la socit Voici par exemple quoi ressemble le dictionnaire de Cisco (dictionary.cisco), dont le numro IANA est le 9 :
VENDOR Cisco 9 Cisco string string Session-End-Callback Invalid-Protocol 102 120 BEGIN-VENDOR

ATTRIBUTE Cisco-AVPair 1 ATTRIBUTE Cisco-NAS-Port 2 ... VALUE Cisco-Disconnect-Cause VALUE Cisco-Disconnect-Cause END-VENDOR
mercredi 19 janvier 2011

Cisco

Organisation

La conguration se trouve dans les chiers situs dans /etc/freeradius et ses sous-rpertoires Pour cette prsentation, on distinguera plusieurs parties dans la conguration :

La conguration du dictionnaire RADIUS La conguration de base du serveur La conguration des politiques de gestion des requtes La conguration des modules La conguration du roaming

mercredi 19 janvier 2011

Syntaxe de la cong
Le chier /etc/freeradius/radiusd.conf est le point dentre de tout le reste de la conguration de freeRADIUS Sa syntaxe est assez simple, il est juste compos :

de dnitions de variables (ex : prefix = /usr) de noms de modules (ex : ldap), seuls sur une ligne et de sections (ex : authenticate { ... }) qui peuvent elles-mmes contenir tout ce qui prcde, ainsi que des sous-sections (de faon rcursive) ...plus les commentaires qui peuvent apparatre nimporte o : # exemple de commentaire

mercredi 19 janvier 2011

$INCLUDE

On peut inclure un chier tout point de la conguration avec la directive $INCLUDE On peut aussi inclure un rpertoire : seront inclus tous les chiers de ce rpertoire dont le nom ne contient que des chiffres, des lettres, des points et des souligns ( _ ) Cest ainsi que la conguration de freeRADIUS est parpille dans une multitude de chiers, avec notamment tous les chiers des rpertoires /etc/freeradius/modules et /etc/freeradius/sites-enabled, ainsi quun certain nombre des chiers situs dans /etc/freeradius Cette organisation est bien plus claire que dans la version 1

mercredi 19 janvier 2011

Les variables
Les valeurs des variables peuvent tre prcises avec ou sans guillemets (simples ou doubles) :
exec_prefix = /usr exec_prefix = '/usr' exec_prefix = "/usr" # quivalent # encore quivalent

La dnition doit tenir sur une ligne, ou bien on doit terminer la ligne par un antislash :
nom = "mon nom est vrai\ ment long" # nom = "mon nom est vraiment long"

La valeur dune variable peut tre utilise plus loin dans la dnition dune autre variable avec la syntaxe ${var} :
sbindir = ${exec_prefix}/sbin

Cette valuation a lieu uniquement au moment du lancement de freeRADIUS (donc il ny a pas de cot lexcution)

mercredi 19 janvier 2011

Les sections

La syntaxe est la suivante :


nom_de_la_section { # retour la ligne obligatoire ici ... } # obligatoirement seul sur une ligne, hormis les espaces

Dans certains cas prdnis que nous verrons plus loin, un deuxime nom peut (ou doit) suivre le premier, par exemple :
... authenticate { ... Auth-Type CHAP { ... } ... } ...

mercredi 19 janvier 2011

radiusd.conf
Voici le dbut du contenu par dfaut de radiusd.conf :
Chemin des rpertoires et chiers principaux (gnralement ne pas changer)

prefix = /usr exec_prefix = /usr sysconfdir = /etc localstatedir = /var sbindir = ${exec_prefix}/sbin logdir = /var/log/freeradius raddbdir = /etc/freeradius radacctdir = ${logdir}/radacct name = freeradius confdir = ${raddbdir} run_dir = ${localstatedir}/run/${name} db_dir = ${raddbdir} libdir = /usr/lib/freeradius pidfile = ${run_dir}/${name}.pid #chroot = /path/to/chroot/directory user = freerad group = freerad max_request_time = 30 cleanup_delay = 5 max_requests = 1024 #...

Utilisateur et groupe Un*x sous lequel le serveur tournera (gnralement ne pas changer) Quelques paramtres de performances que lon peut rgler selon la charge du serveur (voir radiusd.conf pour plus de dtails)

mercredi 19 janvier 2011

Sections listen
Par dfaut, freeRADIUS coute sur toutes les IP du serveur (sil en a plusieurs), et sur les ports RADIUS par dfaut (cest dire 1812 pour le service dauthentication, et 1813 pour le service daccounting) On peut changer ceci dans les sections listen de
radiusd.conf
auth = 10.1.2.3 0 # port standard pour lauthentification (cest dire 1812) = 10.1.2.3 2001 # port non standard pour laccounting acct

#... listen { type = ipaddr port = } listen { ipaddr port = type = } #...

On peut aussi rajouter des sections listen si on le souhaite

mercredi 19 janvier 2011

Sections listen

Options possibles pour une section listen :


listen { type = auth ipaddr = * # ipv6addr = :: port = 0 # interface = eth0 # clients = per_socket_clients # virtual_server = ma_policy } # # # # # # # # Type du service offert Pour lIPv4 (ici on coute sur toutes les IP) Pour lIPv6 (idem, coute sur toutes les IP) Utiliser le port par dfaut du service On peut prciser linterface dcoute On peut limiter lcoute certains NAS On peut traiter les paquets selon une politique particulire via un serveur virtuel donn

# # # # # # # #

Les types de services possibles sont les suivants :


auth acct proxy detail status coa Service dauthentification (naccepte que les paquets dauthentif.) Service daccounting Permet de prciser lIP et le port source utiliss lorsque le serveur sert de proxy vers un autre serveur RADIUS Utilis pour synchroniser des serveurs RADIUS redondants. Cette fonctionnalit remplace lancien dmon radrelay de la version 1. Ecoute les paquets Status-Server qui sont envoys par loutil radadmin Pour les requtes CoA-Request et Disconnect-Request (cf. plus loin)

mercredi 19 janvier 2011

Sections listen

Voir sites-available/copy-acct-to-home-server pour un exemple dutilisation du type detail Voir sites-available/status pour un exemple dutilisation du type status Voir sites-available/originate-coa pour un exemple dutilisation du type coa

mercredi 19 janvier 2011

# ...

radiusd.conf (suite)
= yes = yes

hostname_lookups = no allow_core_dumps = no regular_expressions extended_expressions

Activer ou dsactiver le reverse DNS (pour logs), les core dumps et les expressions rgulires (cf. plus loin) Pour contrer quelques attaques connues

security { max_attributes = 200 reject_delay = 1 status_server = no } thread pool { start_servers = 5 max_servers = 32 min_spare_servers = 3 max_spare_servers = 10 max_requests_per_server = 0 } log { destination = files file = ${logdir}/radius.log syslog_facility = daemon stripped_names = no auth = no auth_badpass = no auth_goodpass = no

Gestion des threads

Gestion des logs

} # ...

mercredi 19 janvier 2011

radiusd.conf (suite et n)
#... checkrad = ${sbindir}/checkrad proxy_requests = yes $INCLUDE proxy.conf $INCLUDE clients.conf modules { $INCLUDE $INCLUDE # $INCLUDE # $INCLUDE # $INCLUDE } ${confdir}/modules/ eap.conf sql.conf sql/mysql/counter.conf sqlippool.conf

Outil qui peut interroger un NAS pour vrier si un utilisateur est connect ou non Conguration du roaming Conguration des NAS

Conguration des modules

instantiate { exec expr # daily expiration logintime } $INCLUDE policy.conf $INCLUDE sites-enabled/

Forcer linstanciation des modules (cf. plus loin)

Dnition des politiques de traitement des requtes

mercredi 19 janvier 2011

Cong de tous les NAS qui se connecteront ce serveur


Pour pouvoir faire des tests depuis le serveur lui-mme. Le shortname est utilis pour faire rfrence ce NAS dans le reste de la conguration. Cest par dfaut le nom prcis en dbut de section. Ladresse IP du NAS, ou tout un sousrseau contenant un ou plusieurs NAS Un excellent secret est indispensable Par dfaut no. Il vaut mieux le passer yes si le NAS le permet. Utilis par loutil checkrad pour dterminer comment interroger le NAS Pour que les requtes de ce NAS soient traites dune faon particulire cf. plus loin

clients.conf

client localhost { ipaddr = 127.0.0.1 secret = testing123 } client salle-de-reunion.wifi.wifirst.fr { shortname = wifi_sdr ipaddr = 10.1.9.4 # ipv6addr = :: # netmask = 32 secret = "hEin/geo9c$be3Eet.ugh3le0eH" require_message_authenticator = yes nastype = cisco # virtual_server = politique_stricte # coa_server = coa }
mercredi 19 janvier 2011

Organisation

La conguration se trouve dans les chiers situs dans /etc/freeradius et ses sous-rpertoires Pour cette prsentation, on distinguera plusieurs parties dans la conguration :

La conguration du dictionnaire RADIUS La conguration de base du serveur La conguration des politiques de gestion des requtes La conguration des modules La conguration du roaming

mercredi 19 janvier 2011

Traitement des requtes


Liste dattributs Requte
Ce qui suit est lgrement simpli, on dtaillera aprs

NAS
Access-Accept

?
Rponse Liste dattributs

ou
Access-Reject
mercredi 19 janvier 2011

Recherche du NAS
Recherche du NAS par IP

Un NAS est toujours recherch par lIP source du paquet RADIUS Si le NAS nest pas trouv, le paquet est ignor La conguration de tous les NAS est charge entirement au dmarrage de freeRADIUS, et est statique par la suite Pour rajouter ou modier un NAS, il faut redmarrer freeRADIUS

mercredi 19 janvier 2011

Listes internes dattributs


Recherche du NAS par IP
+
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=NT\alain

control

reply

...

Analyse (parsing)

Remarques :

Les attributs de contrle sont parfois appels des cong items Il y a dautres listes : proxy-request, proxyresponse, outer.request, outer.reply, coa, etc.

mercredi 19 janvier 2011

Phase dautorisation
Recherche NAS par IP
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=NT\alain

control

reply

...

Analyse (parsing)

Autorisation
authorize { preprocess files pap }
mercredi 19 janvier 2011

Liste de modules

/etc/freeradius/sites-enabled/default

Module preprocess
Recherche NAS par IP
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=alain

control

reply

...

Analyse (parsing)

Autorisation
authorize { preprocess files pap }
mercredi 19 janvier 2011

Ce module corrige certains attributs bizarres (ex: domaine NT retir)

authorize

preprocess

Il gre aussi les hints et les (cf. plus loin)


huntgroups

Module files
Recherche NAS par IP
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=alain

control

reply
Filter-ID=web_seul ...

Cleartext-Password=abc Reply-Message=Hi alain!

...

Analyse (parsing)

+
Ce module applique les rgles du chier users pour ajouter ou modier des attributs
authorize

Autorisation
authorize { preprocess files pap }
mercredi 19 janvier 2011

les

Un instant !
Les modules files et preprocess sont essentiels... arrtons-nous un instant pour les regarder de plus prs

mercredi 19 janvier 2011


Tabulation

Fichier users
Le module files consulte le chier users dans le rpertoire /etc/freeradius pour rajouter ou modier des attributs dans les listes control et reply de freeRADIUS Ce chier est compos dune suite de rgles, chaque rgle ayant le format suivant :
login condition1, condition2, ..., operation_control1, operation_control2,... operation_reply1, operation_reply2, ...

une opration par ligne

Sur une mme ligne

Exemple :
alain Huntgroup-Name == "switch7_ports_1_a_12", Cleartext-Password := "abc" Reply-Message = "Hi alain!", Filter-ID = "web_seul"

Ne pas oublier les virgules

mercredi 19 janvier 2011

Parcours du chier users

Le chier est parcouru dans lordre, jusqu trouver une rgle dont le login corresponde lidentiant de lutilisateur (indiqu par lattribut User-Name) et dont les conditions soient toutes satisfaites (sinon freeRADIUS passe la rgle suivante) Ds quune rgle satisfaisante est trouve, ses oprations sont excutes pour rajouter ou modier des attributs dans la liste interne control et dans la liste reply, puis le module sarrte l Note : dans la documentation de freeRADIUS, les conditions et les oprations sur les attributs de la liste control sont regroupes sous lappellation check items

mercredi 19 janvier 2011

Format des conditions



Chaque condition sapplique un attribut de la liste request (ou de la liste control si lattribut nest pas trouv dans la liste request) Les conditions sont exprimes selon la syntaxe
attribut oprateur valeur
== != > >= < <= =~ !~ =* !*
mercredi 19 janvier 2011

Les oprateurs autoriss sont les suivants :


gal diffrent de strictement suprieur (uniquement pour les attributs entiers) suprieur ou gal (attributs entiers) strictement infrieur (attributs entiers) infrieur ou gal (attributs entiers) correspond lexpression rgulire (attributs chanes de caractres) ne correspond pas lexpression rgulire (attributs chanes de caractres) est prsent (la valeur est ignore) nest pas prsent (la valeur est ignore)

Format des oprations



= := +=

Pour rajouter ou modier un attribut dans la liste control ou la liste reply, la syntaxe est encore :
attribut oprateur valeur

Les oprateurs autoriss sont les suivants :


ajoute lattribut avec la valeur indique, ou ne fait rien sil existe dj ajoute lattribut avec la valeur indique, ou crase sa valeur sil existe dj ajoute lattribut avec la valeur indique, mme sil existe dj

Attention : on se mlange souvent entre =, := et == Il faut bien comprendre que les oprations (=, := et +=) ne sont excutes que si le login correspond et si les conditions (==, >=...) sont toutes remplies

mercredi 19 janvier 2011

Lattribut Fall-Through
Par dfaut, ds que le module files a trouv une rgle satisfaisante, il applique les oprations de cette rgle puis sarrte Si lon souhaite quil continue parcourir les rgles, il suft de rajouter Fall-Through=Yes la n de la rgle, cest dire la n des oprations sur les attributs reply (cet attribut nest pas rajout dans la liste dattributs reply) Exemple :
alain Cleartext-Password := "abc" Reply-Message = "Hi alain!", Fall-Through = Yes alain Huntgroup-Name == "switch7_ports_1_a_12" Filter-ID = "web_seul" alain Huntgroup-Name == "switch7_ports_13_a_24" Filter-ID = "voip_seule"

Dans tous les cas le mot de passe est abc et le message de bienvenue Hi alain!

Condition sur le lieu et le port de connexion (cf. plus loin)

Identiant du ltrage que le NAS devra appliquer


mercredi 19 janvier 2011

Le login DEFAULT
Si lon crit DEFAULT la place du login, alors la rgle est applique pour tous les utilisateurs, pourvu que toutes les conditions soient remplies Exemple:
DEFAULT

Ceci sera dynamiquement substitu par la valeur de lattribut User-Name Tout le monde aura donc un message personnalis avec son propre identiant Pour ceux qui se connectent sur les ports 1 12 du switch 7, laccs sera limit au Web Et sur les ports 13 24 laccs sera limit la voix sur IP

Reply-Message = "Hi %{User-Name}!", Fall-Through = Yes

DEFAULT Huntgroup-Name == "switch7_ports_1_a_12" Filter-ID = "web_seul", Fall-Through = Yes DEFAULT Huntgroup-Name == "switch7_ports_13_a_24" Filter-ID = "voip_seule", Fall-Through = Yes alain Cleartext-Password := "abc"

pierre Cleartext-Password := "def" jean Cleartext-Password := "ghi"

DEFAULT Auth-Type := Reject Reply-Message = "Non! Login inconnu."


mercredi 19 janvier 2011

Si on arrive ici, cest que lutilisateur est inconnu : on le rejette donc, en crasant le message dni plus haut

Substitutions dynamiques

La syntaxe %{attribut} sera substitue (on parle de translation, not xlat) par la valeur de lattribut en question

Exemple : "abc%{User-Name}def" sera substitu par "abcjoedef" pour lutilisateur joe

A ne pas confondre avec la syntaxe ${variable} que lon a vue prcdemment, et qui nest utilise quau dmarrage On peut aussi utiliser : "%{%{attribut}:-pardefaut}" qui est substitue par la valeur de lattribut, ou par la chane "pardefaut" si lattribut nest pas dni On peut imbriquer ces substitutions, par exemple :
Sera substitu par la valeur de Stripped-User-Name, ou sil nest pas dni, par la valeur de User-Name, ou sil nest pas dni par inconnu

"%{%{Stripped-User-Name}:-%{%{User-Name}:-inconnu}}"

mercredi 19 janvier 2011

Substitutions dynamiques

Certains modules offrent une fonction de substitution que lon peut utiliser avec la syntaxe %{nom_du_module:parametres} Cest le cas notamment des modules sql, ldap, expr, exec et perl. Exemples :

%{sql:select credit from credits where login='%{User-Name}'} %{ldap:ldap:///dc=company,dc=com?uid?sub?uid=%u} %{expr:2*%{Session-Timeout}+10} %{exec:/usr/bin/mon_prog %{User-Name} %{Session-Timeout}} Fonction perl personnalisable %{perl:%{User-Name} %{Session-Timeout}}

Les paramtres peuvent eux-mmes contenir des substitutions : chaque module se charge de ces substitutions en les chappant si ncessaires. Par exemple, si le User-Name est joe's, alors le module sql substitue %{User-Name} par joe=27s (encodage MIME) avant dexcuter la requte SQL.

mercredi 19 janvier 2011

Les huntgroups

Un huntgroup est un ensemble de lieux et/ou de ports de connexion (le module preprocess doit tre activ pour pouvoir les utiliser) On peut ensuite ltrer sur Huntgroup-Name == "..." pour appliquer des rgles diffrentes selon les huntgroups Ils sont dnis dans le chier /etc/freeradius/huntgroups Exemple de conguration:
NAS-IP-Address == 10.4.3.2, NAS-Port-Id == 1-12

switch7_ports_1_a_12

switch7_ports_13_a_24 NAS-IP-Address == 10.4.3.2, NAS-Port-Id == 13-24 switchs_1_a_3 NAS-IP-Address == 10.4.3.2 switchs_1_a_3 NAS-IP-Address == 10.4.3.3 switchs_1_a_3 NAS-IP-Address == 10.4.3.4 ports_voip NAS-IP-Address == 10.4.3.2, NAS-Port-Id == 13-24 ports_voip NAS-IP-Address == 10.4.3.3, NAS-Port-Id == 1,3-7,9 ports_voip NAS-IP-Address == 10.4.3.4, NAS-Port-Id == 1,10-15
mercredi 19 janvier 2011

Un huntgroup peut tre compos de plusieurs NAS Et mme de plusieurs ensembles de ports sur plusieurs NAS diffrents

Les hints
Le module preprocess permet galement de dnir des hints (indices) : il sagit de prxes ou sufxes que lutilisateur peut rajouter son identiant pour indiquer le service souhait Ils sont dnis dans le chier /etc/freeradius/hints selon un format identique celui du chier /etc/freeradius/users Exemple de conguration:
DEFAULT Suffix == ".ppp", Strip-User-Name = Yes Hint = "PPP", Service-Type = Framed-User, Framed-Protocol = PPP

Le User-Name sera modi dans la requte pour supprimer le sufxe

Dans cet exemple, si le User-Name de lutilisateur se termine par ".ppp" alors les attributs Hint, Service-Type et FramedProtocol sont rajouts la liste interne request Attention : contrairement au chier users, le chier hints modie la requte !

mercredi 19 janvier 2011

On reprend...
Nous en tions au traitement dune requte par le module files dans la section authorize

mercredi 19 janvier 2011

Module files
Recherche NAS par IP
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=alain

control

reply
Filter-ID=web_seul ...

Cleartext-Password=abc Reply-Message=Hi alain!

...

Analyse (parsing)

+
Ce module applique les rgles du chier users pour ajouter ou modier des attributs
authorize

Autorisation
authorize { preprocess files pap }
mercredi 19 janvier 2011

les

Rejet dun utilisateur


Recherche NAS par IP
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=alain

control

reply
Reply-Message=Non!

...

Analyse (parsing)
Si un module renvoie (reject), alors freeRADIUS sarrte l et renvoie un
Access-Reject

Autorisation
authorize { preprocess files pap }
mercredi 19 janvier 2011

authorize

les

Module pap
Recherche NAS par IP
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=alain

control
Auth-Type=pap

reply
Filter-ID=2 ...

Cleartext-Password=abc Reply-Message=Hi alain!

...

Analyse (parsing)

+
Ce module ajoute Auth-Type=pap si lattribut User-Password est prsent...

Autorisation
authorize { preprocess files pap }
mercredi 19 janvier 2011

authorize

pap

...sauf si
Auth-Type est

dj x

Sous-section Autz-Type

Dans la section authorize, des sous-sections au format Autz-Type XXX peuvent tre dnies La section authorize est dabord excute sans ces sous-sections Si lattribut Autz-Type est dni lissue de la section authorize, et sil ny a pas eu de rejet, alors la soussection correspondante est excute seule Cela permet de choisir dynamiquement une politique particulire dautorisation
Autz-Type = Authorization Type Auth-Type = Authentication Type
mercredi 19 janvier 2011

Authentication
Recherche NAS + analyse
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=alain

control
Auth-Type=pap

reply
Filter-ID=2 ...

Cleartext-Password=abc Reply-Message=Hi alain!

...

Autorisation

Authentication
authenticate { Auth-Type PAP { pap } }
mercredi 19 janvier 2011

Si lattribut Auth-Type est dni et quune sous-section correspondant sa valeur existe, alors elle est excute seule, sinon le contenu de la section authenticate (sans les sous-sections) est excut dans lordre.

/etc/freeradius/sites-enabled/default

Module pap (encore)


Recherche NAS + analyse
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=alain

control
Auth-Type=pap

reply
Filter-ID=2 ...

Cleartext-Password=abc Reply-Message=Hi alain!

...

Autorisation

Dchiffrement de User-Password et Vrication du mot de passe

Authentication
authenticate { authenticate Auth-Type PAP { pap } }
mercredi 19 janvier 2011

pap

Rponse !
Recherche NAS + analyse
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=alain

control
Auth-Type=pap

reply
Filter-ID=2 ...

Cleartext-Password=abc Reply-Message=Hi alain!

...

Autorisation

Si tous les modules interrogs ont dit ok, alors Accept-Accept, sinon
Accept-Reject

Authentication

Idem, mais gnralement un seul module est excut

mercredi 19 janvier 2011

Info dauthentication

Selon la mthode dauthentication choisie, une information diffrente est envoye au serveur par le NAS, par exemple :


mercredi 19 janvier 2011

PAP : mot de passe chiffr avec le secret RADIUS CHAP : hash MD5 du mot de passe + d + ID-CHAP EAP/MD5 : idem TTLS/PAP : mot de passe chiffr dans un tunnel TLS PEAP/MS-CHAP-v2 : hash de hash NT dans un tunnel TLS EAP/TLS : certicat TLS du client ...

Vrication du mot de passe

Si on renseigne le mot de passe de chaque utilisateur en clair dans le chier users (avec Cleartext-Password:="a3d$G4") alors freeRADIUS est en mesure de vrier le mot de passe de lutilisateur :

pour PAP et TTLS/PAP : le mot de passe transmis est dchiffr et simplement compar au mot de passe du chier users pour CHAP et EAP/MD5 : freeRADIUS calcule le hash MD5 du mot de passe du chier users + le d et lID-CHAP reus, et il compare le rsultat au hash MD5 transmis pour PEAP/MS-CHAP-v2 : freeRADIUS applique lalgorithme MSCHAP-v2 pour calculer le hash adquat partir du mot de passe du chier MD5 et des informations reues dans la requte RADIUS (d MS-CHAP-v2), et il compare le rsultat au hash reu

mercredi 19 janvier 2011

Mot de passe en clair ?


Par souci de scurit, il est fortement dconseill de stocker les mots de passe des utilisateurs en clair

mercredi 19 janvier 2011

Stockage du mot de passe


Dans le chier users, on peut stocker un hash du mot de passe plutt que le mot de passe lui-mme :
Crypt-Password : hash crypt Unix MD5-Password : hash MD5 SMD5-Password : hash MD5 avec sel SHA-Password : hash SHA1 SSHA-Password : hash SHA1 avec sel NT-Password : hash Windows NT LM-Password : hash Windows Lan Manager

mercredi 19 janvier 2011

Incompatibilit des hash

Malheureusement, un hash est par dnition une fonction irrversible, cest dire quon ne peut pas deviner le mot de passe si lon ne connat que le hash ( moins dessayer tous les mots de passe possibles) Du coup, si lon stocke par exemple le hash SHA1 du mot de passe des utilisateurs, alors on ne pourra pas utiliser la mthode dauthentication CHAP car freeRADIUS ne pourra pas savoir si le hash SHA1 du chier users et le hash MD5 transmis ont t calculs partir du mme mot de passe Dailleurs, puisque le hash MD5 transmis avec la mthode CHAP nest pas un hash du mot de passe seul (mais un hash du mot de passe plus un d et un identiant CHAP), on ne peut pas utiliser la mthode CHAP en stockant un hash MD5 du mot de passe !

mercredi 19 janvier 2011

Tableau de compatibilit

Le tableau suivant indique, pour chaque mthode dauthentication, les formats de stockage compatibles :
Stockage Clair Crypt MD5 SHA1 SMD5 SSHA1 Mthode
PAP CHAP EAP/MD5 TTLS/PAP PEAP/MS-CHAP-v2
mercredi 19 janvier 2011

NT

LM

Oui Oui Oui Oui Oui Oui Oui Oui Oui Non Non Non Non Non Non Non Oui Non Non Non Non Non Non Non Oui Oui Oui Oui Oui Oui Oui Oui Oui Non Non Non Non Non Oui Oui

Mthodes sres ?
Si un pirate a accs aux changes entre le NAS et le serveur RADIUS, alors non seulement il a accs aux informations non chiffres des paquets RADIUS, mais il peut aller plus loin, selon la mthode utilise :

La mthode PAP est la moins sre de toutes, car elle est vulnrable une attaque de dictionnaire hors-ligne et elle est galement vulnrable une attaque de redite

Attaque de dictionnaire hors ligne : un pirate saisit un mot de passe


quelconque, et capte lchange RADIUS qui en rsulte, puis hors connexion, il essaie des millions de secrets RADIUS jusqu trouver celui qui produit le mme mot de passe chiffr. Il connait alors le secret RADIUS et peu dchiffrer tous les mots de passe suivants. russi et le rpte ultrieurement. Il parvient se connecter avec lidentit dun autre utilisateur (sans connatre son mot de passe).

Attaque de redite (replay) : le pirate capte un change RADIUS

mercredi 19 janvier 2011

Mthodes sres ?

La mthode CHAP est galement vulnrable aux attaques de redite et aux attaques de dictionnaire hors ligne. Toutefois, lorsque le pirate est parvenu trouver le secret RADIUS, il ne peut que dchiffrer les mots de passe des utilisateurs qui sauthentient avec la mthode PAP (ainsi que les autres attributs chiffrs avec le secret RADIUS). La mthode EAP/MD5 a les mmes vulnrabilits que la mthode CHAP. Les mthodes qui reposent sur un tunnel TLS sont invulnrables la fois aux attaques de dictionnaire hors ligne et aux attaques de redite : elles sont donc beaucoup plus sres. Leur seul inconvnient est quelles exigent que lutilisateur vrie le certicat du serveur... et tous les utilisateurs ne le font pas.

Utilisez de prfrence une mthode PEAP ou TTLS


mercredi 19 janvier 2011

EAP/TLS, EAP/SIM, EAP/GTC

La mthode EAP/TLS ne transmet aucun mot de passe : lors de lauthentication, lutilisateur vrie le certicat du serveur, et le serveur vrie le certicat de lutilisateur

Cette mthode est invulnrable aux attaques de dictionnaire hors-

ligne et mme en-ligne (car aucun mot de passe nest chang) et est invulnrable aux attaques de redite. Cest donc une mthode encore plus sre que les mthodes PEAP et TTLS... installer un certicat TLS sur le poste de chaque utilisateur

...mais elle est pnible mettre en oeuvre car il faut au pralable


On aura un niveau de scurit encore suprieure avec une carte puce, car lutilisateur possde alors la fois un objet physique et un secret (le code PIN) : on parle dauthentication deux facteurs (2FA). Cela suppose une infrastructure matrielle et logicielle plus complexe, donc cest rserv gnralement aux oprateurs et grandes entreprises. La mthode EAP utilise est soit EAP/SIM (oprateurs mobiles) soit EAP/GTC (pour les autres cartes de scurit)

mercredi 19 janvier 2011

Tableau de compatibilit

Rvisons donc le tableau de compatibilit, pour plus de scurit :


Stockage Clair Crypt MD5 SHA1 SMD5 SSHA1 Mthode
NT LM

CHAP EAP/MD5 TTLS/PAP PEAP/MS-CHAP-v2


mercredi 19 janvier 2011

Oui Non Non Non peu Non sres Non Non Non Mthodes Oui Non Non Non Non Non Non Non Oui Oui Oui Oui Oui Oui Oui Oui Oui Non Non Non Non Non Oui Oui

Stockage peu sr

PAP

Oui Oui Oui Oui Oui Oui Oui Oui

Rponses des modules


Jusqu prsent, nous avons considr quun module renvoyait soit succs soit chec, et quen cas dchec, le traitement de la requte sarrtait immdiatement. En ralit, chaque module peut renvoyer lun des codes suivants :

Code
noop ok updated fail reject invalid handled
mercredi 19 janvier 2011

Signication
Module non applicable (il na donc rien fait) Utilisateur accept Utilisateur accept et listes dattributs mises jour Le module a chou (ex: problme daccs la BD) Utilisateur rejet Utilisateur rejet car sa conguration est incorrecte Le module a gr la requte tout seul

Que faire ?
Continuer Continuer Continuer Continuer Stop + Rejeter Stop + Rejeter Stop + Rejeter Stop + Rejeter Stop + Rien

notfound Lutilisateur na pas t trouv

userlock Utilisateur rejet car son compte a t bloqu

Priorit des rsultats

Que faire, par exemple, si dans la section authorize un module a rpondu noop, puis le suivant a rpondu notfound et le dernier a rpondu noop ? La logique veut que le rsultat de la section authorize soit notfound (et freeRADIUS doit donc rejeter lutilisateur). Si lun des modules avait rpondu ok, il aurait fallu que le rsultat de la section soit lui-mme ok (et freeRADIUS aurait alors d poursuivre le traitement de la requte via la section authenticate) On voit donc que, si aucun module na renvoy un chec immdiat, il faut tablir une chelle de priorit entre les rsultats obtenus pour dterminer le rsultat de la section elle-mme Par dfaut, lchelle de priorit est la suivante : updated > ok > notfound > noop

mercredi 19 janvier 2011

Priorit des rponses


Le tableau suivant indique le niveau de priorit par dfaut des rponses possibles des modules (la priorit return indique que la section sarrte immdiatement avec le code en question) :

Code
noop ok updated fail reject invalid handled
mercredi 19 janvier 2011

Signication
Module non applicable (il na donc rien fait) Utilisateur accept Utilisateur accept et listes dattributs mises jour Le module a chou (ex. problme rseau) Utilisateur rejet Utilisateur rejet car sa conguration est incorrecte Le module a gr la requte tout seul

Priorit
1 2 3 4 return return return return return

notfound Lutilisateur na pas t trouv

userlock Utilisateur rejet car son compte a t bloqu

Modier les priorits



Dans certains cas, les rgles de priorit par dfaut ne sont pas satisfaisantes Par exemple, on peut souhaiter arrter immdiatement le traitement dune section si un module rpond ok Pour cela, il suft daccoler une section au nom du module, avec les rgles de priorit que lon souhaite modier, par exemple :
authorize { preprocess sql ldap } authorize { preprocess sql { ok = return updated = return } ldap }

Dans cet exemple, si le module sql rpond ok (ou updated), alors la section authorize sarrte immdiatement et rpond elle-mme ok (ou updated) : le module ldap nest pas interrog

mercredi 19 janvier 2011

Regrouper des modules



On peut regrouper plusieurs modules dans une section group Les modules de cette section sont appels les uns aprs les autres, chacun renvoie un code, et le plus prioritaire dentre eux devient le code de retour du groupe (le traitement de la section group sinterrompt si un code a pour priorit return) Ceci peut tre utile pour mettre en place un fail-over entre plusieurs modules (bascule automatique vers un ou plusieurs module de secours en cas dchec dun module), par exemple :
authorize { preprocess group { sql_principal { fail = 1 default = return } sql_de_secours } ldap }

authorize { preprocess sql_principal ldap }

On ne fait appel au serveur SQL de secours que si le serveur principal est injoignable

mercredi 19 janvier 2011

Priorits du groupe

On peut galement modier les rgles de priorit de la rponse du groupe lui-mme Par exemple, imaginons que nous ne souhaitions pas interroger le serveur LDAP si lun des serveurs SQL a rpondu ok (ou updated) :
authorize { preprocess group { sql_principal { fail = 1 default = return } sql_de_secours ok = return updated = return } ldap }

authorize { preprocess sql_principal { ok = return updated = return } ldap }

mercredi 19 janvier 2011

Pour le fail-over, on utilise gnralement une section redundant plutt quune section group Cest la mme chose, sauf que les rgles de priorit par dfaut dans une section redundant sont fail = 1 et default = return
authorize { preprocess group { sql_principal { fail = 1 default = return } sql_de_secours1 { fail = 1 default = return } sql_de_secours2 ok = return updated = return authorize { preprocess redundant { sql_principal sql_de_secours1 sql_de_secours2 fail = return ok = return updated = return

Sections redundant

}
mercredi 19 janvier 2011

} ldap

} ldap

Rpartion de charge

Pour rpartir la charge entre plusieurs modules (par exemple trois bases de donnes), on peut utiliser une section load-balance :
authorize { preprocess load-balance { sql1 sql2 sql3 } }

Lun des modules est choisi au hasard et excut, et son rsultat devient le rsultat de la section load-balance elle-mme (mme si le module choue avec le code fail) Si lon souhaite basculer vers lun des autres modules en cas de fail, alors on peut utiliser une section redundant-load-balance :

La section nchoue que si tous ses modules chouent


mercredi 19 janvier 2011

Le langage unlang

Avant la version 2 de freeRADIUS, si lon souhaitait exprimer une condition dans la conguration des politiques de gestion des requtes, on navait gnralement pas dautre choix que dcrire un module Dsormais, si lon souhaite exprimer des conditions assez simples, on peut le faire laide dexpressions de type if, else, elsif, etc., par exemple :
authorize { preprocess if (User-Name == "joe") { ldap1 } elsif (User-Name == "jack") { ldap2 } else { sql } }
mercredi 19 janvier 2011

Dans cet exemple, si lutilisateur est joe, alors on fait appel au module ldap1, sinon si cest jack, alors on utilise le module ldap2, et sinon on utilise le module sql (pour tous les autres utilisateurs, donc)

Note: une section load-balance ou redundant-load-balance ne doit pas contenir de section else ou elseif. Une section redundant ne doit pas contenir de section if, else ou elseif.

Le langage unlang

Le langage unlang nest pas un langage complet, et na pas vocation le devenir (do son nom, que lon peut traduire par non langage) : il ne sert qu exprimer des rgles simples (pour appliquer une logique complexe, il faut crire un module, cf. plus loin) La condition dun bloc if peut tre :
(Session-Timeout >= 3600)

Exemple:

(attribut oprateur valeur) (valeur) (code_retour)

Vrai si la valeur est non vide et non nulle, ex:(Idle-Timeout) ou encore ("%{Idle-Timeout}") Vrai si cest le code retour du dernier module appel, ex: (fail)

Comme avec le langage C, on peut utiliser !a pour non a, a && b pour a et b, et enn a || b pour a ou b On peut imbriquer les conditions, par exemple (a && !(b || c))

mercredi 19 janvier 2011

Le langage unlang

On peut galement utiliser linstruction switch / case, avec le mme sens que dans le langage C, par exemple :
authorize { preprocess Cette chane de caractres peut switch "%{User-Name}" { contenir des substitutions dynamiques... case "joe" { ldap1 } case "jack" { ...mais pas les valeurs des sections case ldap2 } case { Cette section est la section par dfaut sql } } }

Cet exemple aura le mme comportement que celui que nous avons vu prcdemment avec les instructions if, elsif et else

mercredi 19 janvier 2011

Le langage unlang

Par dfaut, les attributs sont recherchs dans la liste request On peut indiquer une autre liste dattributs avec la syntaxe : %{liste:attribut} par exemple %{control:Auth-Type} Outre les listes request, control et reply, que nous avons vues, on a aussi :

proxy-request et proxy-reply qui contiennent

respectivement les attributs envoys un Home-Server, et reu en rponse, lorsque le serveur freeRADIUS sert de Proxy-Server
outer.request, outer.reply, outer.control, outer.proxy-request, et outer.proxy-reply qui

donnent accs aux diffrentes liste dattributs de la requte externe depuis lintrieur dun tunnel PEAP ou TTLS

mercredi 19 janvier 2011

Le langage unlang
Il existe encore dautres options de substitution:

%{#chaine} : longueur de la chane %{attribut[n]} : (n+1)me attribut de ce type %{attribut[#]} : nombre dattributs de ce type %{attribut[*]} : tous les attributs de ce type spars %{0} : la chane identie par la dernire expression rgulire (avec =~ ou !~) %{1}, %{2}, ..., %{8} : les groupes identis par la dernire

par un retour chariot (\n) et regroups en une seule chane

lexpression rgulire

Cependant, sil on a besoin de cette complexit, il faut se poser la question de dvelopper plutt un nouveau module (en python, en perl ou en C, comme nous le verrons plus loin)

mercredi 19 janvier 2011

Le langage unlang
On peut enn dnir une section update, qui permet simplement de mettre jour une liste dattributs, par exemple :
update reply { Reply-Message := "Bonjour %{User-Name}" Session-Timeout <= 3600 Filter-Id !* ALL }

Toutes les listes peuvent tre modies (request, control...) Les oprateurs =, := et += ont le mme sens que prcdemment, et lon peut galement utiliser les oprateurs suivants :
-= : supprime tous les attributs de ce type qui ont la valeur indique == : supprime tous les attributs de ce type, sauf ceux qui ont la valeur indique !* : supprime tous les attributs de ce type (quelle que soit la valeur indique) <= : remplace les valeurs suprieures par la valeur indique (attributs entiers uniquement) >= : remplace les valeurs infrieures par la valeur indique (attributs entiers uniquement) Pour <= et >= lattribut est rajout avec la valeur indique sil nexiste pas

mercredi 19 janvier 2011

Le module always rpond toujours le mme rsultat, et ce rsultat est congurable.Voici la conguration par dfaut de ce module :
always fail { rcode = fail } always reject { rcode = reject } always noop { rcode = noop } always handled { rcode = handled } always updated { rcode = updated } always notfound { rcode = notfound } always ok { rcode = ok simulcount = 0 mpp = no }

Module always

Voici un exemple dutilisation de la variante reject du module


always

authorize { preprocess if (User-Name=="mechant") { reject } ... }

mercredi 19 janvier 2011

policy.conf

Si lon pense utiliser un morceau de code unlang plusieurs endroits dans la conguration, alors il est bon de dnir une section avec le code en question dans la section policy qui se trouve dans le chier /etc/freeradius/policy.conf, par exemple :
policy { ajout_message_accueil { update reply { Reply-Message := "Bonjour %{User-Name}" } } }

Cette fonction peut ensuite tre utilise dans la conguration :


authorize { preprocess ajout_message_accueil ... }

mercredi 19 janvier 2011

Module policy

Il existe un module policy qui offre une fonctionnalit un peu similaire, mais plus limite ATTENTION : ce module na rien voir avec le chier policy.conf et ce que nous venons de voir Il est maintenant conseill dutiliser de prfrence policy.conf, et dignorer compltement le module policy Note: le module policy repose sur un chier de paramtrage que lon peut galement ignorer : /etc/freeradius/policy.txt

mercredi 19 janvier 2011

Politique par dfaut



La politique (policy) de traitement des paquets utilise par dfaut est dnie dans
/etc/freeradius/sites-enabled/default

Cest un lien symbolique vers le chier

/etc/freeradius/sites-available/default

Ce chier contient les sections de modules dcrits prcdemment : authorize et authenticate, ainsi que plusieurs autres sections similaires...

mercredi 19 janvier 2011

Autres sections de modules


Il y a plusieurs autres points dentres pour les modules, selon le mme principe que pour authorize et authenticate :

session : si lattribut Simultaneous-Use a t

rajout la liste de contrle (par exemple par le module files pendant la phase dautorisation), alors les modules lists ici vont sassurer que le nombre maximum de sessions simultanes prcis par cet attribut nest pas atteint, et rejeter lutilisateur si cest le cas

mercredi 19 janvier 2011

post-auth : actions lancer aprs lauthentication

Autres sections de modules



Si un paquet est rejet tout moment de la phase dautorisation ou dauthentication, alors la sous-section Post-Auth-Type REJECT de la section post-auth est excute Ceci est souvent utilis pour ajouter des attributs dans le paquet de rponse Access-Reject

par exemple ajouter lattribut Reply-Message pour


renvoyer un message derreur au NAS (quil pourra par exemple afcher lutilisateur)

mercredi 19 janvier 2011

Autres sections de modules


Deux sections de modules sont appeles lors du traitement dune requte de type Accounting-Request :

preacct : liste de modules appels avant laccounting accounting : liste de modules qui grent laccounting

mercredi 19 janvier 2011

Autres sections de modules


Et enn deux sections de modules sont appeles par le serveur freeRADIUS avant et aprs le proxying dun paquet vers un Home-Server, en cas de roaming :

pre-proxy : modules appels avant le proxying dun paquet post-proxy : modules appels lorsque la rponse arrive

mercredi 19 janvier 2011

Serveurs virtuels
Toutes les sections de policy que nous avons vues peuvent galement tre dnies lintrieur dune section server nom_du_serveur :
server politique-ldap { authorize { preprocess ldap } authenticate { Auth-Type LDAP { ldap } } ... }

On appelle cela un serveur virtuel


mercredi 19 janvier 2011

Serveurs virtuels

On peut ainsi dnir plusieurs serveurs virtuels et congurer pour chacun une politique de traitement des paquets diffrente On congure gnralement chaque serveur virtuel dans un chier part dans le rpertoire sites-available... ...et on cre un lien symbolique vers chacun des chiers (que lon veut activer) dans le rpertoire sites-enabled

mercredi 19 janvier 2011

Serveurs virtuels
Une fois les serveurs virtuels dnis, on peut congurer freeRADIUS pour quil slectionne dynamiquement tel ou tel serveur virtuel (autrement dit telle ou telle politique de gestion des paquets), en fonction de :

ladresse IP et le port auxquels le paquet a t envoy : dans la section listen correspondante, ajouter
virtual-server=nom_du_serveur_virtuel

le NAS do provient la requte, en procdant de la mme faon dans la section client adquate le Home-Server vers lequel un paquet est redirig, en cas de roaming, toujours de la mme faon dans la conguration du Home Server (utile pour dnir des sections pre-proxy et post-proxy spciques chaque partenaire de roaming)

mercredi 19 janvier 2011

Organisation

La conguration se trouve dans les chiers situs dans /etc/freeradius et ses sous-rpertoires Pour cette prsentation, on distinguera plusieurs parties dans la conguration :

La conguration du dictionnaire RADIUS La conguration de base du serveur La conguration des politiques de gestion des requtes La conguration des modules La conguration du roaming

mercredi 19 janvier 2011

Conguration des modules



Sauf exception (eap.conf, sql.conf...), la conguration des modules se trouve dans les chiers du rpertoire
/etc/freeradius/modules

La conguration dun module a le format suivant :

nom_du_module { un_param = 23 autre_param = "blabla" ... }

OU

nom_du_module autre_nom { un_param = 23 autre_param = "blabla" ... }

Si lon prcise un autre nom, alors cest cet autre nom qui doit tre utilis dans le reste de la conguration

mercredi 19 janvier 2011

Conguration des modules

Exemple de la conguration du module files :


files { # The default key attribute to use for matches. The content # of this attribute is used to match the "name" of the # entry. #key = "%{Stripped-User-Name:-%{User-Name}}" usersfile = ${confdir}/users acctusersfile = ${confdir}/acct_users preproxy_usersfile = ${confdir}/preproxy_users # If you want to use the old Cistron 'users' file # with FreeRADIUS, you should change the next line # to 'compat = cistron'. You can the copy your 'users' # file from Cistron. compat = no /etc/freeradius/modules/files
mercredi 19 janvier 2011

Conguration des modules

Exemple de la conguration du module realm :


realm suffix { format = suffix delimiter = "@" } realm realmpercent { format = suffix delimiter = "%" } /etc/freeradius/modules/realm

mercredi 19 janvier 2011

On peut alors utiliser ces deux variantes du modules realm dans le reste de la conguration en employant les noms suffix et realmpercent

Conguration des modules



La conguration de certains modules peut utiliser des sous-sections pour regrouper des paramtres relis entre eux Par exemple la sous-section tls dans le module ldap :
ldap { server = "ldap.example.com" identity = "cn=admin,dc=example,dc=com" ... tls { start_tls = no cacertfile = /path/to/cacert.pem ... } ... } /etc/freeradius/modules/ldap
mercredi 19 janvier 2011

Conguration de EAP

Cest le cas aussi de la conguration de lEAP :


eap { default_eap_type = md5 timer_expire = 60 ... Certains sous-modules nont pas de conguration, mais md5 { si on souhaite les utiliser, il faut les mentionner } ... tls { La conguration de lEAP/TLS est certdir = ${confdir}/certs ncessaire pour le PEAP et le TTLS cadir = ${confdir}/certs ... } Si ce paramtre est dni, alors ... peap { les requtes EAP internes au default_eap_type = mschapv2 tunnel PEAP seront traites par copy_request_to_tunnel = yes le serveur virtuel indiqu ici, use_tunneled_reply = no sinon, ce sera le serveur virtuel # proxy_tunneled_request_as_eap = yes virtual_server = "inner-tunnel" qui a trait la requte externe } mschapv2 { } Lun des rares modules dont la conguration } nest pas dans le rpertoire modules

/etc/freeradius/eap.conf

mercredi 19 janvier 2011

Instanciation des modules


Lorsque freeRADIUS dmarre, il analyse les chiers de conguration et trouve la liste de tous les modules susceptibles dtre utiliss

Curieusement, il ignore les modules utiliss uniquement dans des substitutions (ex: %{expr:2+3})

Une fois la liste tablie, il cre une instance de chacun des modules, et appelle leur fonction dinitialisation Pour prciser lordre dinstanciation ou instantier des modules supplmentaires (notamment les modules utiliss uniquement dans des substitutions), il suft de les lister dans la section instantiate du chier radiusd.conf :
instantiate { exec expr sql }

mercredi 19 janvier 2011

Instanciation des modules


Voici un exemple pour lequel la section instantiate est indispensable :

Dans sa fonction dinstanciation, le module sql


charge la liste des NAS dans la table nas de la base de donnes (ils viennent se rajouter aux NAS lists dans le chier clients.conf)

Si lon souhaite utiliser la base de donnes

uniquement pour grer la liste des NAS, alors il faudra rajouter le module sql dans la section instantiate, car il ne sera pas utilis ailleurs

mercredi 19 janvier 2011

Modules virtuels
Si on dnit une section dote dun nom dans la section instantiate, alors cest la dnition dun module virtuel, par exemple :
instantiate { ... redundant redundant_sql { sql1 sql2 sql3 } }

On peut utiliser ce module virtuel nimporte o, comme un module normal :


authorize { preprocess redundant_sql }

Cest une fonctionnalit redondante car on peut dj faire la mme chose avec policy.conf, comme on la vu

mercredi 19 janvier 2011

Change of Authorization (CoA)



Rien ntait prvu lorigine dans le protocole RADIUS pour demander au NAS de dconnecter un utilisateur ou de changer ses droits daccs au cours de sa session Dans la RFC 3576, deux nouveaux types de requtes RADIUS ont t dnies cet effet : type disconnect pour dconnecter un utilisateur, et type coa pour changer ses droits daccs (quand on parle de CoA au sens large, on parle implicitement de ces deux types) Attention : dans ce cas, cest le NAS qui joue le rle du serveur RADIUS, et nimporte qui peut jouer le rle du client, pourvu quil ait un secret RADIUS partag avec le NAS Voici par exemple comment demander au NAS qui se trouve ladresse 10.2.3.4, port 1812, de dconnecter lutilisateur alain :
echo "User-Name=alain" | radclient 10.2.3.4:1812 disconnect "s9$G...s!df"

On peut fournir une paire Attribut=Valeur par ligne


mercredi 19 janvier 2011

IP

port

type

secret

CoA depuis freeRADIUS

Bien que les requtes CoA puissent tre envoyes par nimporte qui, il est parfois utile que freeRADIUS en envoie lui-mme, par exemple :

Si on veut dconnecter un utilisateur dun premier NAS au moment o il se connecte un second NAS Si on dcouvre, au moment dune requte daccounting de type Interim-Update, que les droits de lutilisateur ont chang Si on veut envoyer une requte freeRADIUS pour quil cherche lui-mme le NAS auquel est connect un utilisateur et lui envoie lui-mme la requte CoA

Note : pour linstant, freeRADIUS ne sait pas recevoir de requte de type CoA, et ne sait pas non plus rediriger des requtes de type CoA depuis un Home-Server vers un NAS

mercredi 19 janvier 2011

CoA depuis freeRADIUS



Le CoA est encore peu support dans les NAS Sa conguration dans freeRADIUS est jeune et risque de changer dans les prochaines versions Pour en savoir plus, lire :
/etc/freeradius/sites-available/originate-coa

mercredi 19 janvier 2011

Organisation

La conguration se trouve dans les chiers situs dans /etc/freeradius et ses sous-rpertoires Pour cette prsentation, on distinguera plusieurs parties dans la conguration :

La conguration du dictionnaire RADIUS La conguration de base du serveur La conguration des politiques de gestion des requtes La conguration des modules La conguration du roaming

mercredi 19 janvier 2011

Exemple de roaming

Rappel : en cas de roaming, le serveur freeRADIUS redirige certaines requtes vers un (ou plusieurs) Home-Servers Pour savoir quelles requtes rediriger et vers quel Home-Server les envoyer, on utilise en gnral le User-Name de lutilisateur On peut, par exemple, congurer freeRADIUS pour quil redirige les requtes dont le User-Name est joe%machin.com vers le serveur RADIUS situ ladresse rad1.machin-telecoms.net. Dans notre exemple, on redirigera les requtes vers un serveur secondaire si le premier est indisponible

mercredi 19 janvier 2011

Identier le realm

La premire tape du roaming consiste identier les requtes qui devront tre rediriges vers un HomeServer Pour cela, le serveur freeRADIUS cherche lattribut interne Realm dans la liste control la n de la phase dautorisation Si cet attribut est renseign, alors le paquet est redirig vers le Home-Server (ou lun des Home-Servers) congur(s) pour le realm en question Gnralement on utilise le module realm pour xer lattribut Realm partir dun prxe ou dun sufxe de lattribut User-Name

mercredi 19 janvier 2011

Module realm

Comme on la vu plus haut, la conguration par dfaut du module realm dnit la variante realmpercent Dans notre exemple, il nous suft donc de rajouter realmpercent dans la section authorize pour que le realm soit identi partir du sufxe du User-Name, aprs le caractre % Lorsque le serveur recevra une requte de joe%machin.com, le module realmpercent rajoutera lattribut Realm dans la liste control avec pour valeur machin.com, pendant la phase dautorisation Ce module rajoutera galement lattribut Stripped-UserName dans la liste de control, avec pour valeur joe

mercredi 19 janvier 2011

proxy.conf

Le coeur de la cong du roaming est dans proxy.conf Ce chier est compos de plusieurs sections :

une section proxy server pour la conguration gnrale du roaming Une section home_server pour chaque Home-Server vers lequel on est susceptible de rediriger des requtes une ou plusieurs sections home_server_pool qui permettent de dnir des rgles de rpartition de charge entre des Home-Servers Une ou plusieurs sections realm pour indiquer quel home_server_pool utiliser pour chaque realm

mercredi 19 janvier 2011

Voici un exemple de conguration de proxy.conf :


proxy server { Seul paramtre prvu pour cette default_fallback = no section gnrale (cf. plus loin) } home_server rad1_machin_telecoms { type = auth ipaddr = 212.3.4.5 port = 1812 secret = testing123 require_message_authenticator = yes response_window = 20 zombie_period = 40 # revive_interval = 120 status_check = status-server check_interval = 30 num_answers_to_alive = 3 } home_server rad2_machin_telecoms type = auth Cong du Home-Server ... } ... # plus bas: config des home_server_pools et realms

proxy.conf

Cong du Home-Server primaire

secondaire

mercredi 19 janvier 2011

proxy.conf
proxy server { auth ou acct ou auth+acct default_fallback = no } home_server rad1_machin_telecoms { Il vaut mieux renseigner une IP plutt quun type = auth ipaddr = 212.3.4.5 nom de domaine, car si la rsolution DNS port = 1812 choue, freeRADIUS ne dmarre pas secret = testing123 require_message_authenticator = yes response_window = 20 zombie_period = 40 # revive_interval = 120 status_check = status-server check_interval = 30 num_answers_to_alive = 3

Ladresse IP et le port UDP vers lequel rediriger les requtes, et le secret partag avec ce Home-Server (pour le Home-Server, le Proxy-Server nest quun NAS normal)

Ce Home-Server sattend-il un attribut Message-Authenticator dans chaque requte ? Si oui, freeRADIUS le rajoute.

} de rediriger des requtes vers des home_server rad2_machin_telecoms serveurs qui ne rpondent plus type = auth ... } ... # plus bas: config des home_server_pools et realms
mercredi 19 janvier 2011

Ces paramtres permettent dviter

proxy.conf
proxy server { default_fallback = no } home_server rad1_machin_telecoms { type = auth ipaddr = 212.3.4.5 Si ce Home-Server ne rpond pas pendant 20s, alors il port = 1812 devient un zombie (interrog uniquement sil ny a plus de secret = testing123 require_message_authenticator = yes vivant). Aprs 40s, il est considr comme Home-Server response_window = 20 zombie_period = 40 # revive_interval = 120 status_check = status-server check_interval = 30 num_answers_to_alive = 3

vraiment mort (plus interrog du tout). Si lon active revive_interval=120, alors il ressuscitera aprs 2 min... ...mais il est prfrable dinterroger rgulirement le Home-Server en envoyant des requtes de statut : ici, on teste ce Home-Server toutes les 30s, et il faut 3 succs pour le ressusciter

} home_server rad2_machin_telecoms type auth Le = Home-Server doit lui-mme tre congur pour accepter les requtes de statut, bien ...sr. Si cest un serveur freeRADIUS, on doit crer (dans sa cong) une section listen } avec le type status, puis activer status_server=yes dans la section security, et enn ... # plus bas: config des home_server_pools et realms

crer un serveur virtuel ddi (voir lexemple fourni avec freeRADIUS)

mercredi 19 janvier 2011

templates.conf
Les paramtres des Home-Servers sont souvent trs proches Pour viter les rptitions, on peut donc dnir des modles (templates en anglais) de conguration :
home_server rad1-pas-cher { $template home_server ipaddr = 212.3.4.5 secret = "FRc0...7FL3b8" } home_server rad2-pas-cher { $template home_server ipaddr = 212.3.4.6 secret = "GDCd...Ml$N3z" } home_server rad1-machin { template = modele-machin ipaddr = 212.3.4.7 } home_server rad2-machin { template = modele-machin ipaddr = 212.3.4.8 } templates { home_server { response_window = 20 zombie_period = 40 revive_interval = 120 } home_server modele-machin { type = auth port = 1812 secret = "ApQj4...3g2sD" response_window = 20 } }

/etc/freeradius/templates.conf

/etc/freeradius/proxy.conf
mercredi 19 janvier 2011

templates.conf

Les modles peuvent tre utiliss dans dautres endroits de la conguration, pourvu que ce soit dans des sections situes la racine (cest dire pas dans des sous-sections) Cela peut tre utile aussi, par exemple, pour la dnition des NAS dans clients.conf Pour les sous-sections, on peut parvenir quelque chose de similaire, mais moins pratique, avec linstruction $INCLUDE

mercredi 19 janvier 2011

Voici la suite (et n) du chier proxy.conf :


On congure ici un pool compos des deux HomeServers dnis plus haut

proxy.conf

... home_server_pool machin_telecoms_pool { type = fail-over virtual_server = pre_post_proxy_pour_machin home_server = rad1_machin_telecoms home_server = rad2_machin_telecoms } realm machin.com { auth_pool = machin_telecoms_pool nostrip }

Tous les Home-Servers dun pool doivent tre du mme type (auth ou acct ou auth+acct)

Et ici on indique que le realm machin.com repose sur ce pool

soit on prcise auth_pool (Home-Servers de type auth)


et/ou acct_pool (Home-Servers de type acct) soit on prcise pool (Home-Servers de type auth+acct) soit on ne prcise aucun pool, auquel cas le realm est gr localement (pas de redirection)

mercredi 19 janvier 2011

Voici la suite (et n) du chier proxy.conf :

proxy.conf

Ce pool est de type fail-over, cest dire que le premier Home-Server est utilis en priorit, sauf sil ne rpond plus auquel cas on utilise le Home-Server suivant
... home_server_pool machin_telecoms_pool { type = fail-over virtual_server = pre_post_proxy_pour_machin home_server = rad1_machin_telecoms home_server = rad2_machin_telecoms } realm machin.com { auth_pool = machin_telecoms_pool nostrip }

On peut indiquer un serveur virtuel dont les sections pre-proxy et post-proxy seront excutes avant et aprs la redirection de la requte vers le Home-Server

Par dfaut, si un attribut Stripped-User-Name est prsent dans la liste control, alors sa valeur est utilise pour dnir lattribut User-Name de la requte redirige vers le Home-Server. Par exemple, le Home-Server recevra une requte pour joe, et non pour joe%machin.com. Loption nostrip permet dindiquer que lon souhaite conserver le User-Name complet (ce qui peut tre utile si le Home-Server doit lui-mme relayer encore la requte).
mercredi 19 janvier 2011

Autres types de pools


Dans notre exemple, nous utilisons un pool de type fail-over, mais il existe dautres types :

load-balance : chaque requte est envoye alatoirement vers lun

des Home-Servers (avec une prfrence pour les Home-Servers qui rpondent bien aux requtes)

Attention : les mthodes dauthentication EAP ne fonctionneront sans doute pas, car elles requirent plusieurs changes vers un mme serveur

client-balance : galement alatoire, mais pour un NAS donn, on

utilise toujours le mme Home-Server (tant quil est vivant)


keyed-balance : alatoire mais on conserve le mme Home-Server pour une mme valeur de lattribut interne Load-Balance-Key

mercredi 19 janvier 2011

Un module doit donc au pralable rajouter cet attribut dans la liste control, par exemple en copiant la valeur de lattribut User-Name

Realm NULL et LOCAL



Si lon dnit un realm NULL, alors il est utilis pour toutes les requtes qui nont pas de realm On dnit souvent un realm LOCAL sans pool (donc trait localement) : on peut alors forcer lutilisation de ce realm en ajoutant lattribut Proxy-To-Realm dans la liste control, avec pour valeur LOCAL Par exemple, on ne souhaite gnralement pas rediriger le contenu dun tunnel PEAP ou TTLS vers un autre serveur (pour des raisons de scurit). Pour cela, on peut crire ce qui suit dans la conguration du serveur virtuel inner-tunnel :
update control { Proxy-To-Realm := LOCAL }

mercredi 19 janvier 2011

Home-Server virtuel

Si on omet tous les paramtres dune section home_server et qu la place on renseigne le paramtre virtual-server, alors les requtes adresses ce Home-Server virtuel seront traites localement par le serveur virtuel choisi Exemple :
home_server virtuel_pour_machin { virtual_server = server_virtuel_machin }

Ceci est utile par exemple pour excuter certaines tches lorsque tous les Home-Servers dun pool ont chou :
home_server_pool machin_telecoms_pool { type = fail-over home_server = rad1_machin_telecoms home_server = rad2_machin_telecoms home_server = virtuel_pour_machin }

Puisque le pool est de type fail-over, on essaie dabord rad1, et sil choue on essaie rad2, et sinon on appelle le serveur virtuel

mercredi 19 janvier 2011

Home-Server de secours

Dans la conguration dun home_server_pool, on peut dnir un Home-Server de repli (fallback en anglais), utilis lorsque tous les HomeServers du pool sont morts (on choisit souvent un serveur virtuel) :
home_server_pool machin_telecoms_pool { type = load-balance home_server = rad1_machin_telecoms home_server = rad2_machin_telecoms fallback = virtuel_pour_machin }

Dans cet exemple, la charge est rpartie entre les serveurs rad1 et rad2. Si les deux sont morts, alors le serveur virtuel_pour_machin est utilis.

Si aucun serveur de fallback nest dni, et si le paramtre default_fallback = yes dans la section proxy server, alors le realm DEFAULT est utilis quand tous les Home-Servers dun realm sont morts

On le congure souvent avec un simple pool contenant un seul serveur virtuel dont le rle
est simplement dhistoriser lchec.
mercredi 19 janvier 2011

Filtrer les attributs



Dans un contexte de roaming, il faut souvent sassurer que les attributs renvoys par le Home-Server sont acceptables, et les supprimer dans le cas contraire Cest lobjectif du module attr_filter dont voici un extrait de la conguration par dfaut :
attr_filter attr_filter.post-proxy { attrsfile = ${confdir}/attrs } ...

/etc/freeradius/modules/attr_filter

On peut alors activer attr_filter.post-proxy dans la section post-proxy : quand freeRADIUS recevra la rponse dun Home-Server, il appliquera les rgles de ltrage dnies dans le chier /etc/freeradius/attrs Ce chier indique, pour chaque realm, quels attributs sont acceptables et avec quelles valeurs : les autres seront supprims

mercredi 19 janvier 2011

Le chier attrs

Le chier attrs est compos dune suite de rgles, un peu comme pour le chier users, mais avec une logique diffrente, par exemple :
Les oprateurs des conditions sont identiques ceux des conditions du chier users avec en plus loprateur := (qui rajoute lattribut ou le remplace sil existe dj)
machin.com Reply-Message =* ANY, Session-Timeout <= 86400, Idle-Timeout <= 600, Tabulation Acct-Interim-Interval >= 300, obligatoire Acct-Interim-Interval <= 3600 ...

/etc/freeradius/attrs

Une rgle commence par le nom dun realm, suivi la ligne dune liste de conditions sur des attributs (une condition par ligne) Le module attr_filter commence par chercher la rgle correspondant au Realm du paquet, puis il supprime tous les attributs qui ne sont pas lists dans la rgle, ainsi que tous les attributs pour lesquels aucune condition nest satisfaite

mercredi 19 janvier 2011

On peut dnir une rgle DEFAULT (et une seulement) : elle est utilise si aucun realm ne correspond On peut galement rajouter Fall-Through = Yes la n dune rgle pour indiquer que lon souhaite galement appliquer les conditions de la rgle DEFAULT
pas-cher-telecoms Filter-Id := "service-restreint", Fall-Through = Yes DEFAULT Login-TCP-Port <= 65536, Framed-MTU >= 576, Filter-ID =* ANY, Reply-Message =* ANY, Proxy-State =* ANY, EAP-Message =* ANY, Service-Type == Framed-User, Service-Type == Login-User, ... Message-Authenticator =* ANY, State =* ANY, Session-Timeout <= 28800, Idle-Timeout <= 600, Port-Limit <= 2

Le chier attrs

Dans cet exemple, pour toutes les rponses des Home-Servers du realm pas-cher-telecoms, on rajoute lattribut Filter-Id avec la valeur indique (si cet attribut est dj prsent, on remplace sa valeur), puis on applique le ltrage dattributs par dfaut

On peut indiquer plusieurs valeurs autorises pour un attribut

/etc/freeradius/attrs
mercredi 19 janvier 2011

Filtrer les attributs


Le module attr_filter peut galement, selon le mme principe, tre utilis pour ltrer les attributs dans dautres contextes :

avant la redirection dune requte vers un Home-Server (voir le chier attrs.pre-proxy) ou mme hors du contexte du roaming : par exemple, on peut ltrer les attributs utilisateur par utilisateur (plutt que realm par realm) en ajoutant le paramtre key = %{User-Name} dans la conguration du module attr_filter

dans le chier de rgles de ltrage correspondant, on

prcisera alors le nom dun utilisateur au dbut dune rgle plutt que le nom dun realm

mercredi 19 janvier 2011

Ouf ! Vous savez tout sur la conguration de freeRADIUS !


Maintenant il reste tudier quelques modules souvent utiles et voir comment en crer de nouveaux

mercredi 19 janvier 2011

Questions ?

mercredi 19 janvier 2011