Beruflich Dokumente
Kultur Dokumente
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 ?
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
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
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
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
Pour rajouter des dnitions dattributs personnaliss, il faut modier /etc/freeradius/dictionary, et jamais les dictionnaires /usr/share/freeradius/dictionary.*
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
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
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
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
$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
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)
Les sections
Dans certains cas prdnis que nous verrons plus loin, un deuxime nom peut (ou doit) suivre le premier, par exemple :
... authenticate { ... Auth-Type CHAP { ... } ... } ...
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)
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 = } #...
Sections listen
# # # # # # # #
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
# ...
radiusd.conf (suite)
= yes = yes
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
} # ...
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
instantiate { exec expr # daily expiration logintime } $INCLUDE policy.conf $INCLUDE sites-enabled/
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
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
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.
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
authorize
preprocess
Module files
Recherche NAS par IP
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=alain
control
reply
Filter-ID=web_seul ...
...
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
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, ...
Exemple :
alain Huntgroup-Name == "switch7_ports_1_a_12", Cleartext-Password := "abc" Reply-Message = "Hi alain!", Filter-ID = "web_seul"
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
Pour rajouter ou modier un attribut dans la liste control ou la liste reply, la syntaxe est encore :
attribut oprateur valeur
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
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!
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
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"
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
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}}"
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.
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
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 !
On reprend...
Nous en tions au traitement dune requte par le module files dans la section authorize
Module files
Recherche NAS par IP
request
Msg-Authenticator=... User-Password=G!5#%d User-Name=alain
control
reply
Filter-ID=web_seul ...
...
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
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 ...
...
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 ...
...
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
control
Auth-Type=pap
reply
Filter-ID=2 ...
...
Autorisation
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 ...
...
Autorisation
Si tous les modules interrogs ont dit ok, alors Accept-Accept, sinon
Accept-Reject
Authentication
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 ...
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
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
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 !
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
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.
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
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
Tableau de compatibilit
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
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
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
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
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
On ne fait appel au serveur SQL de secours que si le serveur principal est injoignable
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 }
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 :
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:
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))
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
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 :
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
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
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)
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
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
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}" } } }
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
/etc/freeradius/sites-available/default
Ce chier contient les sections de modules dcrits prcdemment : authorize et authenticate, ainsi que plusieurs autres sections similaires...
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
preacct : liste de modules appels avant laccounting accounting : liste de modules qui grent laccounting
pre-proxy : modules appels avant le proxying dun paquet post-proxy : modules appels lorsque la rponse arrive
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 } } ... }
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
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)
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
OU
Si lon prcise un autre nom, alors cest cet autre nom qui doit tre utilis dans le reste de la conguration
On peut alors utiliser ces deux variantes du modules realm dans le reste de la conguration en employant les noms suffix et realmpercent
Conguration de EAP
/etc/freeradius/eap.conf
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 }
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
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 } }
Cest une fonctionnalit redondante car on peut dj faire la mme chose avec policy.conf, comme on la vu
IP
port
type
secret
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
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
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
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
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
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
proxy.conf
secondaire
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
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
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
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)
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
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
Un module doit donc au pralable rajouter cet attribut dans la liste control, par exemple en copiant la valeur de lattribut User-Name
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
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
/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
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
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
/etc/freeradius/attrs
mercredi 19 janvier 2011
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
prcisera alors le nom dun utilisateur au dbut dune rgle plutt que le nom dun realm
Questions ?