6附ldap配置详细说明
ldap认证配置如下:
<Location/svn>
# 开启Subversion
DAV svn
# 包含所有版本库的路径
SVNParentPath /home/subversion/project
#Access file for Subversion Repository
AuthzSVNAccessFile /home/subersion/project/auth
# 使用基本的密码认证
AuthType Basic
# 弹出的对话框的库名
AuthName "Subversion repository"
# Authentication Provider is LDAP
AuthBasic Providerldap
# 绑定ldap认证用户(可以不要,则采用匿名用户,ldap默认是匿名查询)
AuthLDAPBindDN "CN=ldapadmin,OU=systemadmin,DC=example,DC=com,DC=cn"
# 绑定ldap认证用户的密码(上面用户如果没有设置,这一条则取消)
AuthLDAPBindPassword ins.key.ok00
# TheLDAP query URL
#Format: scheme://host:port/basedn?attribute?scope?filter
# TheURL below will search for all objects recursively below the basedn
# andvalidate against the sAMAccountName attribute
AuthLDAPURL "ldap://192.168.1.226:389/DC=example,DC=com,DC=cn?uid?sub?(objectClass=*)"
#Require authentication for this Location ,Requires that mod_authz_user beloaded and that # theAuthzLDAPAuthoritative off
Requirevalid-user
# LDAPAuthentication & Authorization is final; do not check other databases
#Prevent other authentication modules from authenticating the user if this onefails
AuthzLDAPAuthoritative off
</Location>
6.1注解在认证的过程中,httpd首先在LDAP目录中搜索客户端提供的用户名(通过AuthLDAPURL配置如何搜索),假如未找到,则认证失败;如果搜索到,则尝试使用客户端提供的用户名和密码来bind LDAP,如果bind成功则认证通过。
在我们的httpd.conf文件中,AuthLDAPBindDN和AuthLDAPBindPassword也是用来bind到LDAP服务的。考拉一开始对此迷惑了好久,不是说用httpd客户端提供的用户名和密码来bind LDAP的么,怎么这里又有个bind?httpd的官方文档对AuthLDAPBindDN是如此描述的:
An optional DN used to bind to the server whensearching for entries. If not provided, mod_authnz_ldapwill use an anonymous bind.
原来,刚才说到认证的第一步是对LDAP目录进行搜索。其实AuthLDAPBindDN和AuthLDAPBindPassword所对应的就是搜索这个操作的bind。如果没有配置这两兄弟的话,httpd会使用匿名bind来搜索目录。为了不让LDAP的密码以明文的形式出现在配置文件中,考拉强烈建议在httpd.conf中不要使用这两个配置项。考拉的LDAP服务可是允许匿名绑定的哦~(当然匿名bind只有读取的权限,不过对于search操作而言,足够了呀)。
#ldap://是LDAP通讯的方式;ldapserver:389是LDAP的服务器名或IP地址,389为LDAP协议的端口;ou是组织单元(如果下面还有ou的话,应该在此后面再加上ou=xxx,用逗号隔开);dc=后面跟域名,有多少点就有多少dc=xxx,也要用逗号隔开,再举个例子LDAP服务器名为shanghai.domain.com.cn,那shanghai应该是主机的实际名字,domain.com.cn才是真正的域名,参数应该是这样"ldap://shanghai.domain.com.cn:389/ou=developer,dc=domain,dc=com,dc=cn?sAMAccountName?sub?(objectClass=*)";sAMAccountName?sub?(objectClass=*)参数是指明所有验证的是windows域中独特的帐户形式sam
当basedn不写OU,仅仅写后面的DC时,需要将389端口修改成3268。
TheAuthzLDAPAuthoritative offdirective will letauthentication fall through to the next module only if the user cannot bematched to a DN in the query. Currently even though the user is expired, itseems that their account will still be returned as a result when the LDAP queryis performed.
I don't knowenough about the ActiveDirectory LDAP schema to give a definite answer here,but if you could add a filter to your AuthLDAPURL directivethat filters out expired accounts it should result in the username not matchingany DN in the query. This should result in the authentication falling throughto the next module.
或许需要:
# AuthLDAPGroupAttributeIsDN on
# Require ldap-group CN=ldapadmin,OU=systemadmin,DC=example,DC=com,DC=cn
# AuthLDAPGroupAttribute memberUid
- Require ldap-groupcn=SVNUsers,ou=Group,dc=xliu-home,dc=org:这条配置告诉httpd,客户端提供的用户,必须隶属于SVNUsers这个组,注意这里一定要使用DN。
- AuthLDAPGroupAttribute memberUid:它告诉httpd去读取LDAP中SVNUsers这个组记录的memberUid属性来和客户端提供的用户DN来比较。
- AuthLDAPGroupAttributeIsDN on:它告诉httpd,memberUid这个属性里保存的是隶属于该组的用户的DN,httpd就会根据客户端提供的用户名和密码来寻找匹配的用户记录DN,再用这条DN来匹配SVNUsers组的memberUid属性的值。考拉在这个配置项上吃了点苦头,因为它默认值是on,所以简单注解掉该条配置项是没有用的,必须显式地把它设置为off。如果我们设置成off,那么就可以将LDAP中SVNUsers的memberUid设置成yyd了,不过考拉认为还是用memberUid来存储DN比较和谐。