[Freeipa-devel] [PATCH 0034] Deny LDAP binds for user accounts with expired principal

Martin Kosek mkosek at redhat.com
Mon Apr 8 13:55:44 UTC 2013


On 04/01/2013 09:52 PM, Rob Crittenden wrote:
> Tomas Babej wrote:
>> On 02/12/2013 06:23 PM, Simo Sorce wrote:
>>> On Tue, 2013-02-12 at 18:03 +0100, Tomas Babej wrote:
>>>> On 02/12/2013 05:50 PM, Tomas Babej wrote:
>>>>> Hi,
>>>>>
>>>>> This patch adds a check for krbprincipalexpiration attribute to
>>>>> pre_bind operation
>>>>> in ipa-pwd-extop dirsrv plugin. If the principal is expired, auth is
>>>>> denied and LDAP_INVALID_CREDENTIALS along with the error message is
>>>>> sent back to the client. Since krbprincipalexpiration attribute is
>>>> not
>>>>> mandatory, if there is no value set, the check is passed.
>>>>>
>>>>> https://fedorahosted.org/freeipa/ticket/3305
>>>
>>> Comments inline.
>>>> @@ -1166,6 +1173,29 @@ static int ipapwd_pre_bind(Slapi_PBlock *pb)
>>>>           goto done;
>>>>       }
>>>> +    /* check the krbPrincipalExpiration attribute is present */
>>>> +    ret = slapi_entry_attr_find(entry, "krbPrincipalExpiration",
>>>> &attr);
>>>> +    if (!ret) {
>>> ret is not a boolean so probably better ti use (ret != 0)
>>>
>>>> +        /* if it is, check whether the principal has not expired */
>>>> +
>>>> +        principal_expire = slapi_entry_attr_get_charptr(entry,
>>>> +                               "krbprincipalexpiration");
>>>> +        memset(&expire_tm, 0, sizeof (expire_tm));
>>>> +
>>>> +        if (strptime(principal_expire, "%Y%m%d%H%M%SZ", &expire_tm)){
>>> style issue missing space between ) and {
>>>
>>>> +            expire_time = mktime(&expire_tm);
>>>> +            /* this might have overflown on 32-bit system */
>>> This comment does not help to point out what you want to put in
>>> evidence.
>>> if there is an overflow what is the consequence ? Or does it mean the
>>> next condition is taking that into account ?
>> Yeah, this was rather ill-worded. Replaced by a rather verbose
>> comment that hopefully clears things out.
>>>
>>>> +            if (current_time > expire_time && expire_time > 0){
>>> style issue missing space between ) and {
>>>
>>>> +                LOG_FATAL("kerberos principal has expired in user
>>>> entry: %s\n",
>>>> +                          dn);
>>> I think a better phrasing would be: "The kerberos principal on %s is
>>> expired\n"
>>>
>>>> +                errMesg = "Kerberos principal has expired.";
>>> s/has/is/
>>>
>>> The rest looks good to me.
>>>
>>> Simo.
>> Styling issues fixed and updated patch attached :)
> 
> Small nit, the expiration error should probably use 'in' not 'on'.
> 
> I'm not sure LDAP_INVALID_CREDENTIALS is the right return code. This implies
> that the password is wrong. I think that LDAP_UNWILLING_TO_PERFORM is probably
> more correct here. It is what we return on other policy failures.
> 
> rob
> 

Additional findings:

1) Lets not try to get current_time every time, but only when its needed (i.e.
krbPrincipalExpiration is set) - AFAIK, it is not so cheap operation:

+    /* get current time*/
+    current_time = time(NULL);

2) Why using slapi_entry_attr_get_charptr and thus let 389-ds find the
attribute again when we already have a pointer for the attribute? Would
slapi_attr_first_value following slapi_entry_attr_find be faster approach?

+    ret = slapi_entry_attr_find(entry, "krbPrincipalExpiration", &attr);
+    if (ret != 0) {
+        /* if it is, check whether the principal has not expired */
+
+        principal_expire = slapi_entry_attr_get_charptr(entry,
+                               "krbprincipalexpiration");

This way, we would not create a copy of this attribute value - we do not need a
copy, we just do check against it.


3) Shouldn't we return -1 in the end when the auth fails? We do that in other
pre_callbacks. Otherwise we just return 0 (success):

+    if (auth_failed){
+        slapi_send_ldap_result(pb, LDAP_INVALID_CREDENTIALS, NULL, errMesg,
+                               0, NULL);
+    }
+
     return 0;

Martin




More information about the Freeipa-devel mailing list