[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#8380) Feature request: make a plugin like smbk5pwd for the HA1 and HA1b hashes used in DIGEST and HMAC

On 06/03/16 23:02, Howard Chu wrote:
> Daniel Pocock wrote:
>> On 06/03/16 20:49, Howard Chu wrote:
>>> Daniel Pocock wrote:
>>>> On 06/03/16 20:00, Howard Chu wrote:
>>>>> daniel@pocock.pro wrote:
>>>>>> Full_Name: Daniel Pocock
>>>>>> Version:
>>>>>> OS: Debian
>>>>>> URL: ftp://ftp.openldap.org/incoming/
>>>>>> Submission from: (NULL) (2001:1620:b22::2042)
>>>>>> There are a few protocols that use a HA1[1] password hash, such as
>>>>>> HTTP
>>>>>> DIGEST[1], SIP DIGEST[2] and TURN[3] (which uses HMAC rather than
>>>>>> DIGEST)
>>>>>> Is there a standard LDAP attribute name for storing a HA1 value or
>>>>>> should it be stored in a regular userPassword attribute as
>>>>>> described in
>>>>>> the manual[4]?
>>>>> The ITS is not for usage questions. You already asked this and were
>>>>> answered on the discussion mailing list.
>>>>> http://www.openldap.org/lists/openldap-technical/201507/msg00073.html
>>>>> There is nothing here that requires any OpenLDAP development activity.
>>>>> It's all already handled by the SASL Digest mechanism, as I already
>>>>> noted in the above email.
>>>>> Closing this ITS.
>>>> I didn't open this feature request to ask for somebody to implement it,
>>>> I'm simply trying to track a number of items that I'm working on
>>>> myself.
>>>>    Normally I open a bug/feature request in anything I work on in case
>>>> somebody else wants to work on the same thing, it helps avoid
>>>> duplication.
>>>> The email thread doesn't fully resolve the issue, it does appear to
>>>> require some plugin to be created for the server side, especially if
>>>> the
>>>> LDAP server doesn't keep plain text passwords.  Given the fairly
>>>> generic
>>>> nature of the DIGEST algorithm, I also felt that when implemented, this
>>>> code should be contributed to the OpenLDAP repository and not hosted
>>>> elsewhere.
>>> Take the hint: RTF SASL Digest code. All the code you're asking for has
>>> already been implemented in Cyrus SASL and is of zero concern to
>>> OpenLDAP.
>>> The most important skill of a programmer is being able to *read* - not
>>> being able to write. Any fool can spew code.
>> I'm not sure if you've seen my reply to the list, it looks like it got
>> stuck in moderation
>> I understand your point about DIGEST and that may well work for HTTP and
>> SIP.  TURN, however, uses HMAC-SHA1 and that involves sending a copy of
>> the entire message body to the authentication server for use in the
>> algorithm:
>> https://tools.ietf.org/html/rfc5766#page-51
> You continue to fail to read.
> Pasting this again
> http://www.openldap.org/lists/openldap-technical/201507/msg00073.html
> The required parameters cannot be passed in a Simple Bind request. The
> only way to be able to pass what you want and have the server
> authenticate it is to use a SASL mechanism. For TURN you may need to
> define your own SASL mechanism.
> None of this has anything to do with OpenLDAP.

I fully agree with that - the HMAC-SHA1 message verification for TURN,
like the DIGEST-MD5 code, would be in Cyrus SASL or in the TURN server
(LDAP client).

The OpenLDAP manual, s15.2.3 about DIGEST-MD5 explains "it needs access
to the plaintext password".  The DIGEST-MD5 code that uses the password
is here:
and it takes the plaintext password and transforms it into a HA1 string.

Notice that:

     HA1 = MD5(user:realm:password)

This is a repetitive calculation that does not involve the nonce, salt
or any other transient value.  HA1 is always the same value for any
given user/realm/password permutation.  Therefore, OpenLDAP could store
HA1 values instead of plaintext values.

In fact, Apache already does the same thing with a flat file maintained
by the htdigest utility:

$ htdigest -c /tmp/test.ha1 example.org daniel

instead of storing plaintext values in a file.

The HA1 values, not being salted, are still sensitive but some sites may
prefer to store the HA1 values instead of plaintext values.

So section 15.2.3 could actually be changed: "it needs access to the
plaintext password or a password that has already been hashed in HA1"

An alternative is that the TURN server process could bind to the LDAP
server and then query the HA1 attribute for any user or the HA1 values
could be periodically extract into a flat file similar to that created
by the htdigest utility.

I agree that people who have plaintext passwords don't need to store any
HA1 attribute, but if somebody does not have plaintext passwords and
does not want to have plaintext passwords, it appears that the HA1
hashing needs to be done in OpenLDAP on password changes.

This would also appear to require a change to the Cyrus code so that it
can accept either the plaintext or HA1 from the LDAP entry and the slapd
auxprop plugin would need to be able to return either attribute.

>> CRAM-MD5 from SASL does HMAC but it does not appear to transfer entire
>> message bodies in the manner required for TURN.
>> DIGEST-MD5 and HMAC-SHA1 both use a HA1 value (or a cleartext password)
>> as the lowest common denominator but otherwise they are not the same.
>>> Your mention of smbk5pwd is totally off base as well. The reason the
>>> smbk5pwd module was needed was because Samba 3 and the Kerberos5 KDC
>>> both stored their secrets in separate and incompatible formats but
>>> everyone wanted central coordinated administration for these separate
>>> attributes. If you're writing something from scratch there is no reason
>>> to use your own separate and incompatible attribute, and thus there is
>>> no reason to require any special synchronization or coordination.
>> The reason I mentioned that is because it was the closest thing I could
>> find to the concept of storing multiple password hashes, but I'm not
>> locked in to that strategy.  If there are cleartext passwords in LDAP
>> then they can be used for all of these algorithms.  If the administrator
>> does not want to store cleartext values, however, then the salted
>> password strings used for UNIX logins are not interchangeable with HA1
>> hashed values, in that case, isn't it necessary to store and synchronize
>> multiple values, hashed with each algorithm?
> Once again you're back to software usage questions which is not what the
> ITS is for.