LDAP (POSIX attibutes) password expiry

Fajar A. Nugraha list at fajar.net
Wed Feb 29 00:12:02 CET 2012


On Wed, Feb 29, 2012 at 6:11 AM, Fajar A. Nugraha <list at fajar.net> wrote:
> On Wed, Feb 29, 2012 at 4:16 AM,  <up at 3.am> wrote:
>> Hi:
>>
>> We've been running various versions of FreeRadius for years, currently 2.1.10 in
>> this application.  A while ago, we switched from PAM (unix) auth to LDAP auth.
>> Everything worked fine after the switch...POSIX attributes for group membership
>> correctly allocated the right ippools, etc.
>>
>> However, we just noticed that password expiry isn't working.  I suspect this is
>> because we are still using all the original POSIX attributes and none of them look
>> like good for mapping to the ones supplied by FreeRADIUS.  I see:
>>
>> checkItem       Expiration                      radiusExpiration
>>
>> Our LDAP attributes use the following POSIX attributes to determine expiry:
>>
>> shadowMax: 90
>> shadowLastChange: 15215
>>
>> With the first being the maximum age of the password and the second being the
>> number of days since the Epoch.  I will post the obligatory debug output below
>> (with sensitive or irrelevant stuff snipped out) for a successful authentication
>> for an expired password that shouldn't have succeeded.  If anybody has an idea how
>> to fix this with the minimal of messing around with our LDAP config itself, I'd
>> greatly appreciate it...or, if that's unrealistic, what should be done.  TIA!
>
> IIRC the Expiration attribute requires the format of "01 Jan 2011
> 01:00:00" (or something like that, other format might work, test it
> first). From the two LDAP attributes, you should be able to process
> them and present it as a new attribute.
>
> I see no easy way to do that without additional module though. You
> COULD use something like this on ldap.attrmap:
>
> checkItem       Tmp-Integer-0                      shadowMax
> checkItem       Tmp-Integer-1                      shadowLastChange
>
> ... then convert it to expiration with rlm_perl/rlm_sql/whatever. If
> you already have a mysql instance (e.g. for accounting), you could
> probably use it to do the processing. Something like this (see
> http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html):
>
> update control {
>  Expiration := "%{sql: SELECT FROM_UNIXTIME( ( %{Tmp-Integer-0} +
> %{Tmp-Integer-1} ) * 86400, '%d %b %Y %H:%i%s' )}"
> }


Sorry. Should be something like

update control {
  Expiration := "%{sql: SELECT FROM_UNIXTIME( ( %{control:Tmp-Integer-0} +
 %{control:Tmp-Integer-1} ) * 86400, '%d %b %Y %H:%i%s' )}"
}

-- 
Fajar




More information about the Freeradius-Users mailing list