作者:邓卫华 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 [email protected]
LDAP_BINDPW 123LDAP_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 neverLDAP_FULLNAME displayName
LDAP_CRYPTPW userPassword#----end
ok,如果配置文件这样写的话用authtest会得到一个如下提示:
#authtest �Cs 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 �Cs 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 '[email protected]', 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天的时间曾经一度想放弃了,结果天无绝人之路。