Question regarding multivalued attributes in control list.

Arran Cudbard-Bell a.cudbardb at freeradius.org
Fri Sep 2 16:41:31 CEST 2011


On 2 Sep 2011, at 16:25, Olivier Beytrison wrote:

> Thanks Arran for those answers,
> 
>> No your check will not iterate over every instance of a value.
>> 
>> In order to do that you'll need to use FreeRADIUS 3.x and use the foreach unlang construct or perl.
> 
> hmm, FreeRADIUS 3.x? Is it suitable for production environnement ? Or
> i'll simply fall back to rlm_perl. But not on a friday evening, it will
> wait till monday!

Tentative yes :) 

It'll only get truly production ready if people test it and report the bugs. But yes, it's good enough to build configs on, and good enough to test. 

If you do a git-clone then you can establish basic version control with something like:

#!/bin/bash
cd /usr/local/src/freeradius
git pull
make clean
hash=`git log -n 1 --pretty=format:%h`
./configure --prefix="/usr/local/freeradius-$hash" --enable-developer
make
make install
rm /usr/local/freeradius
ln -s "/usr/local/freeradius-$hash" /usr/local/freeradius

Once you find a commit that does all you want, stick with it until there's an official 3.x release and then upgrade. For certain fixes you'll be able to use git cherry-pick to pull in individual commits. 

-Arran


> 
> 
>> -Arran
>> 
>> On 2 Sep 2011, at 15:47, Olivier Beytrison wrote:
>> 
>>> Hello,
>>> 
>>> I'm trying since two week to do some multi-valued attribute checking on
>>> my radius infrastructure.
>>> 
>>> I've been looking to checkval, using the "users" file and such but with
>>> no luck.
>>> 
>>> I'm running two FR 2.1.10 on ubuntu for the eduroam project. The local
>>> authentication is made against an Novell eDirectory ldap server.
>>> 
>>> I'm fetching a multi-valued attribute from the ldap into the control
>>> list, and based on its content, I set the correct
>>> Airespace-Interface-Name value.
>>> 
>>> At the beginning I was using unlang to match the value, and it works
>>> perfectly since 90% of the people only have one attribute. But some
>>> people have multiple attributes.
>>> 
>>> So far, that's what I've been using :
>>> 
>>> In virtual server, at the end of authorize {}
>>> 
>>>         if (NAS-IP-Address =~ /160\.98\.156\..*/) {
>>>                 $INCLUDE ${confdir}/secure-hefr.policy
>>> 
>>>         }
>>> 
>>> secure-hefr.policy content :
>>> 
>>> 
>>> if ( control:HESSO-MEMBER-KEY =~ /RORG-MASO.*RCA$/ ) {
>>>       update reply {
>>>               Airespace-Interface-Name := "wifi_eia-etu"
>>>       }
>>> }
>>> elsif ( control:HESSO-MEMBER-KEY =~ /RORG-HEFR-EIFR.*RSM$/ ) {
>>>       update reply {
>>>               Airespace-Interface-Name := "wifi_eia-col"
>>>       }
>>> }
>>> elsif {
>>> }
>>> [ ... ]
>>> 
>>> Some debug from a user who is multi-valued :
>>> 
>>> server eduroam-inner-tunnel-peap {
>>> # Executing section authorize from file
>>> /etc/freeradius/sites-enabled/eduroam-inner-tunnel-peap
>>> +- entering group authorize {...}
>>> ++[mschap] returns noop
>>> [suffix] Looking up realm "hefr.ch" for User-Name = "didier.perroud at hefr.ch"
>>> [suffix] Found realm "hefr.ch"
>>> [suffix] Adding Realm = "hefr.ch"
>>> [suffix] Authentication realm is LOCAL.
>>> ++[suffix] returns ok
>>> ++[control] returns ok
>>> [eap] EAP packet type response id 11 length 6
>>> [eap] No EAP Start, assuming it's an on-going EAP conversation
>>> ++[eap] returns updated
>>> [auth_log]      expand:
>>> /var/log/freeradius/radacct/%{Client-IP-Address}/auth-detail-%Y%m%d ->
>>> /var/log/freeradius/radacct/160.98.156.6/auth-detail-20110902
>>> [auth_log]
>>> /var/log/freeradius/radacct/%{Client-IP-Address}/auth-detail-%Y%m%d
>>> expands to /var/log/freeradius/radacct/160.98.156.6/auth-detail-20110902
>>> [auth_log]      expand: %t -> Fri Sep  2 15:45:08 2011
>>> ++[auth_log] returns ok
>>> [linelog]       expand: %{Packet-Type} -> Access-Request
>>> [linelog]       expand: %{%{Packet-Type}:-format} -> Access-Request
>>> [linelog]       expand: /var/log/freeradius/linelog ->
>>> /var/log/freeradius/linelog
>>> [linelog]       expand: Requested access: %{User-Name} -> Requested
>>> access: didier.perroud at hefr.ch
>>> ++[linelog] returns ok
>>> ++? if (User-Name =~ /(.*)@.*hefr.ch$/)
>>> ? Evaluating (User-Name =~ /(.*)@.*hefr.ch$/) -> TRUE
>>> ++? if (User-Name =~ /(.*)@.*hefr.ch$/) -> TRUE
>>> ++- entering if (User-Name =~ /(.*)@.*hefr.ch$/) {...}
>>>       expand: %{1} -> didier.perroud
>>> +++[request] returns ok
>>> ++- if (User-Name =~ /(.*)@.*hefr.ch$/) returns ok
>>> ++[files] returns noop
>>> [ldap] performing user authorization for didier.perroud
>>> [ldap]  expand: (uid=%{Stripped-User-Name}) -> (uid=didier.perroud)
>>> [ldap]  expand: ou=courant,ou=people,o=hefr -> ou=courant,ou=people,o=hefr
>>> [ldap] ldap_get_conn: Checking Id: 0
>>> [ldap] ldap_get_conn: Got Id: 0
>>> [ldap] performing search in ou=courant,ou=people,o=hefr, with filter
>>> (uid=didier.perroud)
>>> [ldap] Added the eDirectory password ******* in check items as
>>> Cleartext-Password
>>> [ldap] No default NMAS login sequence
>>> [ldap] looking for check items in directory...
>>> [ldap] hessoRoleMemberKey -> HESSO-MEMBER-KEY ==
>>> "RORG-HEFR-EIFR-TICO-TLCO-$-RSM"
>>> [ldap] hessoRoleMemberKey -> HESSO-MEMBER-KEY == "RORG-MASO-$-RCA"
>>> [ldap] hessoRoleMemberKey -> HESSO-MEMBER-KEY ==
>>> "RACA-TICO-MSEI-MTIC-$-RCA"
>>> [ldap] looking for reply items in directory...
>>> [ldap] hessoRoleMemberKey -> Class =
>>> 0x524f52472d484546522d454946522d5449434f2d544c434f2d242d52534d
>>> [ldap] hessoRoleMemberKey -> Class = 0x524f52472d4d41534f2d242d524341
>>> [ldap] hessoRoleMemberKey -> Class =
>>> 0x524143412d5449434f2d4d5345492d4d5449432d242d524341
>>> [ldap] user didier.perroud authorized to use remote access
>>> [ldap] ldap_release_conn: Release Id: 0
>>> ++[ldap] returns ok
>>> [pap] WARNING: Auth-Type already set.  Not setting to PAP
>>> ++[pap] returns noop
>>> ++? if (NAS-IP-Address =~ /160\.98\.156\..*/)
>>> ? Evaluating (NAS-IP-Address =~ /160\.98\.156\..*/) -> TRUE
>>> ++? if (NAS-IP-Address =~ /160\.98\.156\..*/) -> TRUE
>>> ++- entering if (NAS-IP-Address =~ /160\.98\.156\..*/) {...}
>>> +++? if (control:HESSO-MEMBER-KEY =~ /RORG-HEFR-EIFR-INTR-INFO-.-RSM/ )
>>> ? Evaluating (control:HESSO-MEMBER-KEY =~
>>> /RORG-HEFR-EIFR-INTR-INFO-.-RSM/) -> FALSE
>>> +++? if (control:HESSO-MEMBER-KEY =~ /RORG-HEFR-EIFR-INTR-INFO-.-RSM/ )
>>> -> FALSE
>>> +++? elsif (control:HESSO-MEMBER-KEY =~ /RORG-MASO.*RCA$/ )
>>> ? Evaluating (control:HESSO-MEMBER-KEY =~ /RORG-MASO.*RCA$/) -> FALSE
>>> +++? elsif (control:HESSO-MEMBER-KEY =~ /RORG-MASO.*RCA$/ ) -> FALSE
>>> +++? elsif (control:HESSO-MEMBER-KEY =~ /RORG-HEFR-EIFR.*RSM$/ )
>>> ? Evaluating (control:HESSO-MEMBER-KEY =~ /RORG-HEFR-EIFR.*RSM$/) -> TRUE
>>> +++? elsif (control:HESSO-MEMBER-KEY =~ /RORG-HEFR-EIFR.*RSM$/ ) -> TRUE
>>> +++- entering elsif (control:HESSO-MEMBER-KEY =~ /RORG-HEFR-EIFR.*RSM$/
>>> ) {...}
>>> 
>>> We can see that it didn't match control:HESSO-MEMBER-KEY =~
>>> /RORG-MASO.*RCA$/ while it has the correct value in the control list.
>>> 
>>> How can I match this multi-valued attribute ?
>>> 
>>> Regards,
>>> Olivier B.
>>> 
>>> -- 
>>> 
>>> Olivier Beytrison
>>> Network & Security Engineer, HES-SO Fribourg
>>> -
>>> List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
>>> 
>> 
>> Arran Cudbard-Bell
>> a.cudbardb at freeradius.org
>> 
>> RADIUS - Half the complexity of Diameter
>> 
>> 
>> -
>> List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
>> 
>> 
> 
> -- 
> 
> Olivier Beytrison
> Network & Security Engineer, HES-SO Fribourg
> -
> List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
> 

Arran Cudbard-Bell
a.cudbardb at freeradius.org

RADIUS - Half the complexity of Diameter





More information about the Freeradius-Users mailing list