LDAP+SASL

Michael Peek peek at tiem.utk.edu
Fri Feb 20 22:39:13 UTC 2009


Norberto Bensa wrote:
> I just spotted a bug in what I said :-)
>
> Your second and forth rules will never match. It's pretty obvious now.
> Take a careful look at your 1st and 2nd rules, and then to your 3rd
> and 4th rule and you'll understand why.
>   

I commented out rule 2 and 4.  This is what I have now:

authz-regexp
  uid=([^,]*),cn=[^,]*,cn=[^,]*,cn=auth
  cn=$1,ou=People,dc=nimbios,dc=org
#authz-regexp
# uid=([^,]*),cn=[^,]*,cn=[^,]*,cn=auth
# cn=$1,dc=nimbios,dc=org
authz-regexp
  uid=([^,]*),cn=[^,]*,cn=auth
  cn=$1,ou=People,dc=nimbios,dc=org
#authz-regexp
# uid=([^,]*),cn=[^,]*,cn=auth
# cn=$1,dc=nimbios,dc=org

So the only one that should match is the one in ou=People.

> This is uid=admin at castor,cn=CRAM-MD5,cn=auth and then -from your
> rules- cn=admin at castor,ou=People,dc=nimbios,dc=org
>
> If you have no admin at castor in ou=People, it will not work. Also, if
> you store your secrets as SSHA (or some other hashed procedure)
> CRAM-MD5, DIGEST-MD5 will not work either.
>
> Now (from your logs), your Mac seems to try again with
> uid=admin,cn=CRAM-MD5,cn=auth (cn=admin,ou=People,dc=nimbios,dc=org)
> but your userPassword for that entry is hashed with SSHA. You need to
> change it to CLEARTEXT if you want CRAM/DIGEST.
>   


My current LDAP entry:

4 cn=admin,ou=People,dc=nimbios,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
description: LDAP administrator
userPassword: {CLEARTEXT}...<stuff>...
cn: admin


> Once you fix these problems, repeat your ldapsearch like this:
>
>   $ ldapsearch -U admin -Y CRAM-MD5 -W
>   

Output from linux host:
--------------------------------------------
# ldapsearch -H ldap://castor.nimbios.org -U admin -Y CRAM-MD5 -W
Enter LDAP Password:
SASL/CRAM-MD5 authentication started
SASL username: admin
SASL SSF: 0
# extended LDIF
#
# LDAPv3
# base <dc=nimbios,dc=org> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# nimbios.org
dn: dc=nimbios,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: nimbios.org
dc: nimbios

# admin, nimbios.org
dn: cn=admin,dc=nimbios,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
description: LDAP administrator
cn: admin
userPassword:: <GOBBLEDYGOOK>

# People, nimbios.org
dn: ou=People,dc=nimbios,dc=org
objectClass: organizationalUnit
ou: People

# Groups, nimbios.org
dn: ou=Groups,dc=nimbios,dc=org
objectClass: organizationalUnit
ou: Groups

# admin, People, nimbios.org
dn: cn=admin,ou=People,dc=nimbios,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
description: LDAP administrator
userPassword:: <GOBBELDYGOOK>
cn: admin

# search result
search: 3
result: 0 Success

# numResponses: 6
# numEntries: 5
--------------------------------------------

I noticed that the passwords are strings of nonsense characters 
/without/ a preceeding {HASH-MEHOD} string.  They are not the 
{CLEARTEXT} entries that I entered with my editor.  I reloaded and 
double-checked, and cn=admin,ou=People,dc=nimbios,dc=org has a 
{CLEARTEXT} password according to my editor.

Syslog from ldapsearch on linux:
--------------------------------------------
Feb 20 17:31:05 castor slapd[32116]: slap_listener_activate(9): 
Feb 20 17:31:05 castor slapd[32116]: >>> slap_listener(ldap:///)
Feb 20 17:31:05 castor slapd[32116]: conn=3 fd=15 ACCEPT from 
IP=xx.xx.xx.xx:57053 (IP=0.0.0.0:389)
Feb 20 17:31:05 castor slapd[32116]: connection_get(15): got connid=3
Feb 20 17:31:05 castor slapd[32116]: connection_read(15): checking for 
input on id=3
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=0 do_bind
Feb 20 17:31:05 castor slapd[32116]: >>> dnPrettyNormal: <>
Feb 20 17:31:05 castor slapd[32116]: <<< dnPrettyNormal: <>, <>
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=0 BIND dn="" method=163
Feb 20 17:31:05 castor slapd[32116]: do_bind: dn () SASL mech CRAM-MD5
Feb 20 17:31:05 castor slapd[32116]: send_ldap_sasl: err=14 len=40
Feb 20 17:31:05 castor slapd[32116]: send_ldap_response: msgid=1 tag=97 
err=14
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=0 RESULT tag=97 err=14 
text=SASL(0): successful result: 
Feb 20 17:31:05 castor slapd[32116]: <== slap_sasl_bind: rc=14
Feb 20 17:31:05 castor slapd[32116]: connection_get(15): got connid=3
Feb 20 17:31:05 castor slapd[32116]: connection_read(15): checking for 
input on id=3
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=1 do_bind
Feb 20 17:31:05 castor slapd[32116]: >>> dnPrettyNormal: <>
Feb 20 17:31:05 castor slapd[32116]: <<< dnPrettyNormal: <>, <>
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=1 BIND dn="" method=163
Feb 20 17:31:05 castor slapd[32116]: do_bind: dn () SASL mech CRAM-MD5
Feb 20 17:31:05 castor slapd[32116]: slap_sasl_getdn: u:id converted to 
uid=admin,cn=CRAM-MD5,cn=auth
Feb 20 17:31:05 castor slapd[32116]: >>> dnNormalize: 
<uid=admin,cn=CRAM-MD5,cn=auth>
Feb 20 17:31:05 castor slapd[32116]: <<< dnNormalize: 
<uid=admin,cn=cram-md5,cn=auth>
Feb 20 17:31:05 castor slapd[32116]: ==>slap_sasl2dn: converting SASL 
name uid=admin,cn=cram-md5,cn=auth to a DN
Feb 20 17:31:05 castor slapd[32116]: slap_parseURI: parsing 
cn=admin,ou=People,dc=nimbios,dc=org
Feb 20 17:31:05 castor slapd[32116]: >>> dnNormalize: 
<cn=admin,ou=People,dc=nimbios,dc=org>
Feb 20 17:31:05 castor slapd[32116]: <<< dnNormalize: 
<cn=admin,ou=people,dc=nimbios,dc=org>
Feb 20 17:31:05 castor slapd[32116]: <==slap_sasl2dn: Converted SASL 
name to cn=admin,ou=people,dc=nimbios,dc=org
Feb 20 17:31:05 castor slapd[32116]: slap_sasl_getdn: dn:id converted to 
cn=admin,ou=people,dc=nimbios,dc=org
Feb 20 17:31:05 castor slapd[32116]: => hdb_search
Feb 20 17:31:05 castor slapd[32116]: 
bdb_dn2entry("cn=admin,ou=people,dc=nimbios,dc=org")
Feb 20 17:31:05 castor slapd[32116]: slap_ap_lookup: 
str2ad(cmusaslsecretCRAM-MD5): attribute type undefined
Feb 20 17:31:05 castor slapd[32116]: send_ldap_result: conn=3 op=1 p=3
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=1 BIND authcid="admin" 
authzid="admin"
Feb 20 17:31:05 castor slapd[32116]: SASL Authorize [conn=3]:  proxy 
authorization allowed authzDN=""
Feb 20 17:31:05 castor slapd[32116]: send_ldap_sasl: err=0 len=-1
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=1 BIND 
dn="cn=admin,ou=people,dc=nimbios,dc=org" mech=CRAM-MD5 sasl_ssf=0 ssf=0
Feb 20 17:31:05 castor slapd[32116]: do_bind: SASL/CRAM-MD5 bind: 
dn="cn=admin,ou=people,dc=nimbios,dc=org" sasl_ssf=0
Feb 20 17:31:05 castor slapd[32116]: send_ldap_response: msgid=2 tag=97 
err=0
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=1 RESULT tag=97 err=0 text=
Feb 20 17:31:05 castor slapd[32116]: <== slap_sasl_bind: rc=0
Feb 20 17:31:05 castor slapd[32116]: connection_get(15): got connid=3
Feb 20 17:31:05 castor slapd[32116]: connection_read(15): checking for 
input on id=3
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=2 do_search
Feb 20 17:31:05 castor slapd[32116]: >>> dnPrettyNormal: 
<dc=nimbios,dc=org>
Feb 20 17:31:05 castor slapd[32116]: <<< dnPrettyNormal: 
<dc=nimbios,dc=org>, <dc=nimbios,dc=org>
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=2 SRCH 
base="dc=nimbios,dc=org" scope=2 deref=0 filter="(objectClass=*)"
Feb 20 17:31:05 castor slapd[32116]: ==> limits_get: conn=3 op=2 
dn="cn=admin,ou=people,dc=nimbios,dc=org"
Feb 20 17:31:05 castor slapd[32116]: => hdb_search
Feb 20 17:31:05 castor slapd[32116]: bdb_dn2entry("dc=nimbios,dc=org")
Feb 20 17:31:05 castor slapd[32116]: search_candidates: 
base="dc=nimbios,dc=org" (0x00000001) scope=2
Feb 20 17:31:05 castor slapd[32116]: => hdb_dn2idl("dc=nimbios,dc=org")
Feb 20 17:31:05 castor slapd[32116]: => bdb_presence_candidates 
(objectClass)
Feb 20 17:31:05 castor slapd[32116]: bdb_search_candidates: id=-1 
first=1 last=6
Feb 20 17:31:05 castor slapd[32116]: => send_search_entry: conn 3 
dn="dc=nimbios,dc=org"
Feb 20 17:31:05 castor slapd[32116]: <= send_search_entry: conn 3 exit.
Feb 20 17:31:05 castor slapd[32116]: => send_search_entry: conn 3 
dn="cn=admin,dc=nimbios,dc=org"
Feb 20 17:31:05 castor slapd[32116]: <= send_search_entry: conn 3 exit.
Feb 20 17:31:05 castor slapd[32116]: => send_search_entry: conn 3 
dn="ou=People,dc=nimbios,dc=org"
Feb 20 17:31:05 castor slapd[32116]: <= send_search_entry: conn 3 exit.
Feb 20 17:31:05 castor slapd[32116]: => send_search_entry: conn 3 
dn="ou=Groups,dc=nimbios,dc=org"
Feb 20 17:31:05 castor slapd[32116]: <= send_search_entry: conn 3 exit.
Feb 20 17:31:05 castor slapd[32116]: => send_search_entry: conn 3 
dn="cn=admin,ou=People,dc=nimbios,dc=org"
Feb 20 17:31:05 castor slapd[32116]: <= send_search_entry: conn 3 exit.
Feb 20 17:31:05 castor slapd[32116]: send_ldap_result: conn=3 op=2 p=3
Feb 20 17:31:05 castor slapd[32116]: send_ldap_response: msgid=3 tag=101 
err=0
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=2 SEARCH RESULT tag=101 
err=0 nentries=5 text=
Feb 20 17:31:05 castor slapd[32116]: connection_get(15): got connid=3
Feb 20 17:31:05 castor slapd[32116]: connection_read(15): checking for 
input on id=3
Feb 20 17:31:05 castor slapd[32116]: ber_get_next on fd 15 failed 
errno=0 (Success)
Feb 20 17:31:05 castor slapd[32116]: connection_closing: readying conn=3 
sd=15 for close
Feb 20 17:31:05 castor slapd[32116]: connection_close: deferring conn=3 
sd=15
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=3 do_unbind
Feb 20 17:31:05 castor slapd[32116]: conn=3 op=3 UNBIND
Feb 20 17:31:05 castor slapd[32116]: connection_resched: attempting 
closing conn=3 sd=15
Feb 20 17:31:05 castor slapd[32116]: connection_close: deferring conn=3 
sd=15
Feb 20 17:31:05 castor slapd[32116]: connection_resched: attempting 
closing conn=3 sd=15
Feb 20 17:31:05 castor slapd[32116]: connection_close: conn=3 sd=15
Feb 20 17:31:05 castor slapd[32116]: conn=3 fd=15 closed
--------------------------------------------

Ouptut from Mac host:
--------------------------------------------
$ ldapsearch -H ldap://castor.nimbios.org -U admin -Y CRAM-MD5 -W
Enter LDAP Password:
SASL/CRAM-MD5 authentication started
ldap_sasl_interactive_bind_s: Invalid credentials (49)
    additional info: SASL(-13): user not found: no secret in database
--------------------------------------------

Syslog from ldapsearch on Mac:
--------------------------------------------
Feb 20 17:31:39 castor slapd[32116]: slap_listener_activate(9): 
Feb 20 17:31:39 castor slapd[32116]: >>> slap_listener(ldap:///)
Feb 20 17:31:39 castor slapd[32116]: conn=4 fd=15 ACCEPT from 
IP=xx.xx.xx.xx:50557 (IP=0.0.0.0:389)
Feb 20 17:31:39 castor slapd[32116]: connection_get(15): got connid=4
Feb 20 17:31:39 castor slapd[32116]: connection_read(15): checking for 
input on id=4
Feb 20 17:31:39 castor slapd[32116]: conn=4 op=0 do_bind
Feb 20 17:31:39 castor slapd[32116]: >>> dnPrettyNormal: <>
Feb 20 17:31:39 castor slapd[32116]: <<< dnPrettyNormal: <>, <>
Feb 20 17:31:39 castor slapd[32116]: conn=4 op=0 BIND dn="" method=163
Feb 20 17:31:39 castor slapd[32116]: do_bind: dn () SASL mech CRAM-MD5
Feb 20 17:31:39 castor slapd[32116]: send_ldap_sasl: err=14 len=39
Feb 20 17:31:39 castor slapd[32116]: send_ldap_response: msgid=1 tag=97 
err=14
Feb 20 17:31:39 castor slapd[32116]: conn=4 op=0 RESULT tag=97 err=14 
text=SASL(0): successful result: 
Feb 20 17:31:39 castor slapd[32116]: <== slap_sasl_bind: rc=14
Feb 20 17:31:39 castor slapd[32116]: connection_get(15): got connid=4
Feb 20 17:31:39 castor slapd[32116]: connection_read(15): checking for 
input on id=4
Feb 20 17:31:39 castor slapd[32116]: conn=4 op=1 do_bind
Feb 20 17:31:39 castor slapd[32116]: >>> dnPrettyNormal: <>
Feb 20 17:31:39 castor slapd[32116]: <<< dnPrettyNormal: <>, <>
Feb 20 17:31:39 castor slapd[32116]: conn=4 op=1 BIND dn="" method=163
Feb 20 17:31:39 castor slapd[32116]: do_bind: dn () SASL mech CRAM-MD5
Feb 20 17:31:39 castor slapd[32116]: slap_sasl_getdn: u:id converted to 
uid=admin,cn=CRAM-MD5,cn=auth
Feb 20 17:31:39 castor slapd[32116]: >>> dnNormalize: 
<uid=admin,cn=CRAM-MD5,cn=auth>
Feb 20 17:31:39 castor slapd[32116]: <<< dnNormalize: 
<uid=admin,cn=cram-md5,cn=auth>
Feb 20 17:31:39 castor slapd[32116]: ==>slap_sasl2dn: converting SASL 
name uid=admin,cn=cram-md5,cn=auth to a DN
Feb 20 17:31:39 castor slapd[32116]: slap_parseURI: parsing 
cn=admin,ou=People,dc=nimbios,dc=org
Feb 20 17:31:39 castor slapd[32116]: >>> dnNormalize: 
<cn=admin,ou=People,dc=nimbios,dc=org>
Feb 20 17:31:39 castor slapd[32116]: <<< dnNormalize: 
<cn=admin,ou=people,dc=nimbios,dc=org>
Feb 20 17:31:39 castor slapd[32116]: <==slap_sasl2dn: Converted SASL 
name to cn=admin,ou=people,dc=nimbios,dc=org
Feb 20 17:31:39 castor slapd[32116]: slap_sasl_getdn: dn:id converted to 
cn=admin,ou=people,dc=nimbios,dc=org
Feb 20 17:31:39 castor slapd[32116]: => hdb_search
Feb 20 17:31:39 castor slapd[32116]: 
bdb_dn2entry("cn=admin,ou=people,dc=nimbios,dc=org")
Feb 20 17:31:39 castor slapd[32116]: => 
hdb_dn2id("cn=admin,ou=people,dc=nimbios,dc=org")
Feb 20 17:31:39 castor slapd[32116]: <= hdb_dn2id: get failed: 
DB_NOTFOUND: No matching key/data pair found (-30990)
Feb 20 17:31:39 castor slapd[32116]: send_ldap_result: conn=4 op=1 p=3
Feb 20 17:31:39 castor slapd[32116]: SASL [conn=4] Failure: no secret in 
database
Feb 20 17:31:39 castor slapd[32116]: send_ldap_result: conn=4 op=1 p=3
Feb 20 17:31:39 castor slapd[32116]: send_ldap_response: msgid=2 tag=97 
err=49
Feb 20 17:31:39 castor slapd[32116]: conn=4 op=1 RESULT tag=97 err=49 
text=SASL(-13): user not found: no secret in database
Feb 20 17:31:39 castor slapd[32116]: <== slap_sasl_bind: rc=49
Feb 20 17:31:39 castor slapd[32116]: connection_get(15): got connid=4
Feb 20 17:31:39 castor slapd[32116]: connection_read(15): checking for 
input on id=4
Feb 20 17:31:39 castor slapd[32116]: ber_get_next on fd 15 failed 
errno=0 (Success)
Feb 20 17:31:39 castor slapd[32116]: connection_closing: readying conn=4 
sd=15 for close
Feb 20 17:31:39 castor slapd[32116]: connection_close: deferring conn=4 
sd=15
Feb 20 17:31:39 castor slapd[32116]: connection_resched: attempting 
closing conn=4 sd=15
Feb 20 17:31:39 castor slapd[32116]: connection_close: conn=4 sd=15
Feb 20 17:31:39 castor slapd[32116]: conn=4 fd=15 closed (connection lost)
--------------------------------------------

I look at the syslog output and my eyes cross...  I'm going to study it 
further.

Correct me if I'm wrong, but ou=People and ou=people are the same, 
right?  There is no case sensitivity, correct?

Michael




More information about the ubuntu-users mailing list