Applying the same rule to multiple values in an attribute/config value

Alex Perez-Mendez Alex.Perez-Mendez at jisc.ac.uk
Fri Feb 15 17:19:53 CET 2019


Hi Alan,

thank you for your help. We finally made it work nicely and we are happy 
to share it upstream.
It's shipped as policy.d/rfc7542 and a "bangpath" realm, and enabled by 
default for the ABFAB-specific server.

https://github.com/FreeRADIUS/freeradius-server/pull/2492

Do you think it would make it for 3.0.18?

Best regards,
Alejandro
>> Yep, this definitely worked.
>>
>>            [...]
>>            rfc7542_recipe
>>
>>            #  Standard RADIUS NAI routing
>>            if (!updated) {
>>                    suffix {
>>                            updated = 1
>>                            noop = reject
>>                    }
>>            }
>>            [...]
>>
>> The only thing we need to make sure about is making sure
>> "rfc7542_recipe" does not change the "updated" status when it does not
>> resolve a realm.
>> Otherwise, we would need to check for the presence of the Realm
>> attribute :(.
> If fact, that's happening. When "rfc7542_recipe" does not find a Trust
> Router realm, but resolves a local one (Ie. this is the home IDP for the
> End User), it does include a Realm attribute but does not change the
> "update" status. Should it? It is actually updating the Request by
> adding a Realm to it....
>
> On the proxy:
> idp3_1          | (18) bangpath: Checking for prefix before "!"
> idp3_1          | (18) bangpath: Looking up realm "test5.org" for
> User-Name = "test5.org!@test3.org"
> idp3_1          | (18) bangpath: Found realm "apc.org%test5.org"
> idp3_1          | (18) bangpath: Adding Realm = "apc.org%test5.org"
> idp3_1          | (18) bangpath: Proxying request from user
> test5.org!@test3.org to realm apc.org%test5.org
> idp3_1          | (18) bangpath: Preparing to proxy authentication
> request to realm "apc.org%test5.org"
> idp3_1          | (18)           [bangpath] = updated
> idp3_1          | (18)         } # if (!(&control:RFC7542-Realm-1 =~
> /^(test3.org)$/) &&         (&control:RFC7542-Realm-2 =~
> /^(test3.org)$/))  = updated
> idp3_1          | (18)         if ((&control:RFC7542-Realm-1 =~
> /^(test3.org)$/) &&         !(&control:RFC7542-Realm-2 =~
> /^(test3.org)$/)) {
> idp3_1          | (18)         if ((&control:RFC7542-Realm-1 =~
> /^(test3.org)$/) &&         !(&control:RFC7542-Realm-2 =~
> /^(test3.org)$/))  -> FALSE
> idp3_1          | (18)         update control {
> idp3_1          | (18)           RFC7542-Realm-1 !* ANY
> idp3_1          | (18)           RFC7542-Realm-2 !* ANY
> idp3_1          | (18)         } # update control = noop
> idp3_1          | (18)       } # if (&request:User-Name =~
> /([a-zA-Z0-9\.-]+)!([a-zA-Z0-9\.-]*)\@(.+)/)  = updated
> idp3_1          | (18)     } # policy rfc7542.authorize = updated
> idp3_1          | (18)     if (!updated) {
> idp3_1          | (18)     if (!updated)  -> FALSE
> idp3_1          | (18) eap: Request is supposed to be proxied to Realm
> apc.org%test5.org. Not doing EAP.
> idp3_1          | (18)     [eap] = noop
> idp3_1          | (18)     [expiration] = noop
> idp3_1          | (18)     [logintime] = noop
> idp3_1          | (18)   } # authorize = updated
>
> On the IDP:
> idp5_1          | (11) bangpath: Checking for prefix before "!"
> idp5_1          | (11) bangpath: Looking up realm "test5.org" for
> User-Name = "test5.org!@test3.org"
> idp5_1          | (11) bangpath: Found realm "test5.org"
> idp5_1          | (11) bangpath: Adding Stripped-User-Name = "@test3.org"
> idp5_1          | (11) bangpath: Adding Realm = "test5.org"
> idp5_1          | (11) bangpath: Authentication realm is LOCAL
> idp5_1          | (11)           [bangpath] = ok
> idp5_1          | (11)         } # if ((&control:RFC7542-Realm-1 =~
> /^(test5.org)$/) &&         !(&control:RFC7542-Realm-2 =~
> /^(test5.org)$/))  = ok
> idp5_1          | (11)         update control {
> idp5_1          | (11)           RFC7542-Realm-1 !* ANY
> idp5_1          | (11)           RFC7542-Realm-2 !* ANY
> idp5_1          | (11)         } # update control = noop
> idp5_1          | (11)       } # if (&request:User-Name =~
> /([a-zA-Z0-9\.-]+)!([a-zA-Z0-9\.-]*)\@(.+)/)  = ok
> idp5_1          | (11)     } # policy rfc7542.authorize = ok
> idp5_1          | (11)     if (!updated) {
> idp5_1          | (11)     if (!updated)  -> TRUE
> idp5_1          | (11)     if (!updated)  {
> idp5_1          | (11) suffix: Request already has destination realm
> set.  Ignoring
> idp5_1          | (11)       [suffix] = noop
> idp5_1          | (11)     } # if (!updated)  = reject
> idp5_1          | (11)   } # authorize = reject
>
> So I had to force the updated status when bangpath is executed. So,
> within rfc7542_recipe:
>
>                   [...]
>                   #  Format: not_local_realm!... at local_realm: Handle with
> bangpath
>                   if (!(&control:RFC7542-Realm-1 =~
> /^(${policy.rfc7542_realms})$/) && \
>                           (&control:RFC7542-Realm-2 =~
> /^(${policy.rfc7542_realms})$/)) {
>                           bangpath
>                           updated
>                   }
>                   [...]
>
> Best,
>> Thanks
>>
>>>      Alan DeKok.
>>>
>>>
>>> -
>>> List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html

-- 
Alejandro Perez-Mendez
Technical Specialist (AAA), Trust & Identity
M (+34) 619 333 219
Skype alejandro_perez_mendez
jisc.ac.uk

Jisc is a registered charity (number 1149740) and a company limited by guarantee which is registered in England under Company No. 5747339, VAT No. GB 197 0632 86. Jisc’s registered office is: One Castlepark, Tower Hill, Bristol, BS2 0JA. T 0203 697 5800.

Jisc Services Limited is a wholly owned Jisc subsidiary and a company limited by guarantee which is registered in England under company number 2881024, VAT number GB 197 0632 86. The registered office is: One Castle Park, Tower Hill, Bristol BS2 0JA. T 0203 697 5800.  



More information about the Freeradius-Users mailing list