作者:邓卫华   2009.11.28 23:56

在前面我写了一个由postfix+dovecot+windows ad (win2008)的用户帐户整合成功的文章,那么为什么我还写这个使用authlib来整合windows ad呢?其实造成我把精力改到authlib与ad整合的原因是因为我发现,这样的话就没有好用的Free的webmail软件来使用了。非常不方便。有小部份能测试成功,但是。。长得太丑了。。

   目前free的产品中我感觉extmail还是非常不错了。至少在界面与操作与非常不错。可是经过测试以后发现extmail如果使用LDAP的则无法连接到AD服务器上认证成功。后来发现extmail可以使用authlib的认证功能,正是基于些原因造成我转向authlib 的测试。

对于这次我的postfix+authlib+sasl2+windows 2008 ad + extmail 用户帐户整合的过程下次在写吧。

 

Case:在authlib中查询WINDOWS AD时,如果base_dn设置为根的DN值,则无论任何用户查询都不会成功。

Reslove:必须把所有的用户存放在某个OU下面,然后在base_dn中写这个OU的DN值;如:ldap_base_dn= ou=51ctoMailUser,dc=51cto,dc=com

需要你要使用层级OU构,您可以在51ctomailuser这个OU下面在建子OU来达到您的分层结构。

以下是我的分析解决过程:

言归正转,首先我们来看看我的authldap.rc文件的配置;

[root@mail authlib]# cat authldaprc |grep -v "^#"

LDAP_URI        ldap://10.0.3.3
LDAP_PROTOCOL_VERSION   3
LDAP_BASEDN             dc=test,dc=com
LDAP_BINDDN     vmail@test.com
LDAP_BINDPW     123

LDAP_AUTHBIND 1
LDAP_TIMEOUT            5
LDAP_MAIL               sAMAccountName
LDAP_FILTER     (objectClass=*)
LDAP_GLOB_UID           vmail
LDAP_GLOB_GID           501
LDAP_HOMEDIR    sAMAccountName
LDAP_MAILROOT        /data/vmail
LDAP_DEREF              never

LDAP_FULLNAME   displayName
LDAP_CRYPTPW            userPassword

#----end

ok,如果配置文件这样写的话用authtest会得到一个如下提示:

#authtest –s login test 123

Authentication FAILED: Input/output error

嗯,我就是在这里卡了很久。(这个时候我在本机安装了openldap进行测试发现一切正常).

后来一次我不小心把base_dn改了一下,突然就认证成功了。

改成如下设置:

(因为我在WINDOWS AD上建了一个叫mailuser的OU,并把所有的邮件用户都存放在这个OU里面)

LDAP_BASEDN             ou=mailuser,dc=test,dc=com

然后在authtest –s login test 123

[root@mail authlib]# authdaemond restart
[root@mail authlib]# !authtest
authtest -s login test "123"
Authentication succeeded.

     Authenticated: test  (uid 1000, gid 501)
    Home Directory: /data/vmail/test
           Maildir: (none)
             Quota: (none)
Encrypted Password: (none)
Cleartext Password: 123
           Options: (none)
[root@mail authlib]#

ok,看到了吗?认证成功了,而且POP3和POSTFIX和EXTMAIL全部都认证成功。

两个配置文件我们发现只有base_dn不同;一个是ldap_base_dn=dc=test,dc=com,可以认认证成功的是:ldap_base_dn=ou=mailuser,dc=test,dc=com,而我的用户test 也是在mailuser这个OU下面。

现在我们在来分析一下authdaemond的日志。

[root@mail authlib]# tail -n 15 /var/log/debug.log
Nov 28 19:50:05 mail authdaemond: received auth request, service=login, authtype=login
Nov 28 19:50:05 mail authdaemond: authldap: trying this module
Nov 28 19:50:05 mail authdaemond: selected ldap protocol version 3
Nov 28 19:50:05 mail authdaemond: binding to LDAP server as DN 'vmail@test.com', password '123'
Nov 28 19:50:05 mail authdaemond: using search filter: (&(objectClass=*)(sAMAccountName=test))
Nov 28 19:50:05 mail authdaemond: one entry returned, DN: CN=test,OU=mailuser,DC=test,DC=com
Nov 28 19:50:05 mail authdaemond: raw ldap entry returned:
Nov 28 19:50:05 mail authdaemond: | displayName: test
Nov 28 19:50:05 mail authdaemond: | sAMAccountName: test
Nov 28 19:50:05 mail authdaemond: authldaplib: sysusername=<null>, sysuserid=1000, sysgroupid=501, homedir=/data/vmail/test, address=test, fullname=test, maildir=<null>, quota=<null>, options=<null>
Nov 28 19:50:05 mail authdaemond: authldaplib: clearpasswd=<null>, passwd=<null>
Nov 28 19:50:05 mail authdaemond: rebinding with DN 'CN=test,OU=mailuser,DC=test,DC=com' to validate password
Nov 28 19:50:05 mail authdaemond: authentication bind successful
Nov 28 19:50:05 mail authdaemond: Authenticated: sysusername=<null>, sysuserid=1000, sysgroupid=501, homedir=/data/vmail/test, address=test, fullname=test, maildir=<null>, quota=<null>, options=<null>
Nov 28 19:50:05 mail authdaemond: Authenticated: clearpasswd=123, passwd=<null>

看到两个粗体字了吗?现在我们在AD服务器的mailuser这个OU下面在建一个testuser的OU并把TEST用户移动到这此OU下面:cn=test,ou=testusre,ou=mailuser,dc=test,dc=com

在次进行authtest测试,成功。

那么如果我们把test用户移动到与mailuser同级的OU呢?还可以成功吗?

[root@mail authlib]# authtest -s login g1 "789!"
Authentication FAILED: Operation not permitted
[root@mail authlib]#

日志:

[root@mail authlib]# tail -n 15 /var/log/debug.log
Nov 28 19:51:29 mail ntpd[21118]: sendto(61.129.66.79) (fd=-1): Bad file descriptor
Nov 28 19:51:30 mail authdaemond: received auth request, service=login, authtype=login
Nov 28 19:51:30 mail authdaemond: authldap: trying this module
Nov 28 19:51:30 mail authdaemond: using search filter: (&(objectClass=*)(sAMAccountName=g1))
Nov 28 19:51:30 mail authdaemond: number of entries returned: 0 (but we need exactly 1)
Nov 28 19:51:30 mail authdaemond: authldap: REJECT - try next module
Nov 28 19:51:30 mail authdaemond: FAIL, all modules rejected
Nov 28 19:51:38 mail ntpd[21118]: sendto(114.80.81.1) (fd=-1): Bad file descriptor
Nov 28 19:51:43 mail authdaemond: received auth request, service=login, authtype=login
Nov 28 19:51:43 mail authdaemond: authldap: trying this module
Nov 28 19:51:43 mail authdaemond: using search filter: (&(objectClass=*)(sAMAccountName=g1))
Nov 28 19:51:43 mail authdaemond: number of entries returned: 0 (but we need exactly 1)
Nov 28 19:51:43 mail authdaemond: authldap: REJECT - try next module
Nov 28 19:51:43 mail authdaemond: FAIL, all modules rejected
Nov 28 19:51:45 mail ntpd[21118]: sendto(210.34.128.32) (fd=-1): Bad file descriptor

 

看到没有,找不到g1用户。看到authlib的base_dn是不能直接写为dc=test,dc=com 这种格式的。应该还需要在DC下面在建一个OU,然后在这个OU中在建立子OU达到分层结构。别小看这个问题了,就这里花费了我3/4天的时间曾经一度想放弃了,结果天无绝人之路。