安装好了openldap以后,就是对它进行配置了,其中一项就是设置访问控制,限制普通用户只能修改/访问他们能修改/访问的项。这就是ACL须要作的事情。linux
一、能够将 include行放在/etc/openldap/slapd.conf 的顶部,指向一个单独的文件(例如, include /etc/openldap/slapd.access.conf)
二、或者能够将 ACL 直接添加到 slapd.conf。这彻底由您选择 ― Mandrake 一般使用 include 行;Red Hat 将 ACL 添加到配置文件。slapd.conf文件路径:/etc/openldap/slapd.conf正则表达式
access to what:
by who access control
其中,access to指示启用访问控制,上句大体能够理解为:
access to <对什么目标进行控制>[by <做用于哪些访问者> <授予什么样的访问权限><采起什么样的匹配控制动做>]+dom
这一域主要是实现对ACL应用对象的指定,对象能够是记录和属性。选择ACL目标记录的方法通常有两种:DN和filter,语法为:ssh
ui
what ::= * |
[dn[.basic-style]=regex | dn.scope-style=DN]
[filter=ldapfilter] [attrs=<attrlist>]
access to *
code
语法以下:server
to dn[.basic-style]=regex
对象
basic-style ::= regex | exact
to dn.scope-style=DN
scope-style ::= base | one | subtree | children
第一种方法是使用正则表达式(dn.regex)或精确匹配(dn.style)的方式来匹配符合条件的记录(这个好像不像想象的那么简单,实现起来颇为费脑筋),例如:it
access to dn="^.*,uid=([^,]+),ou=users,(.*)$"
test
第二种方法经过“区域”选择的方法进行目标记录的选取,对以指定的DN开始的目录树区域进行目标记录匹配。匹配区域的方式共有四种:
base 只匹配DN自己一条记录
one 匹配以给定DN为父目录的全部记录
subtree 匹配以给定DN为根目录的全部子树内的记录
children 匹配给定DN下的全部记录,但应该不包括以DN直接命名的那条记录(参见例子的解释)
例如:对于 0: dc=mydomain,dc=org
1: cn=root,dc=mydomain,dc=org
2: ou=users,dc=mydomain,dc=org
3: uid=samba,ou=users,dc=mydomain,dc=org
4: cn=Administator,uid=samba,ou=users,dc=mydomain,dc=org
5: uid=guest,ou=users,dc=mydomain,dc=org
规则 dn.base=”ou=users,dc=mydomain,dc=org” 只会匹配记录2
规则 dn.one=”ou=users,dc=mydomain,dc=org” 匹配记录3和记录5,记录4是记录3的子目录,故不算在内
规则 dn.subtree=”ou=users,dc=mydomain,dc=org” 匹配记录二、三、四、5
规则 dn.children=”ou=users,dc=mydomain,dc=org” 匹配记录三、四、5,由于记录0、1和2都是以DN直接命名的,故不匹配
经过filter指定过滤规则进行记录过虑,语法以下:
access to filter=ldap filter
其中filter指定的为search的过滤规则,这类同于linux系统中grep的匹配方式。如:
access to filter=(objectClass=sambaSamAccount)
也能够结合使用DN和filter进行记录的匹配,例如:
access to dn.subtree=”ou=users,dc=mydomain,dc=org” filter=(objectClass=posixAccount)
语法: attrs=attribute list
例如: access to attrs=uid,uidNumber,gidNumber
也能够结合使用DN和attrs进行记录的匹配,例如: access to dn.subtree="ou=users,dc=mydomain,dc=org" attrs=uid
指定被受权的用户范围的方法大体有如下几种: * 全部的访问者,包括匿名的用户
anonymous 非认证的匿名用户
users 认证的用户
self 目标记录的用户自身
dn[.<basic-style>]=<regex> 在指定目录内匹配正则表达式的用户
dn.<scope-style>=<DN> 指定DN内的用户
例如: by dn.subtree="ou=users,dc=domain,dc=org"="^samba*"
当选取好ACL做用的目标记录并选取好用户范围后,就该给这些用户授予他们应该获得的权限了。大体的权限(由低到高)有如下几类:
none 无权限,即拒绝访问
auth 访问bind(认证)设置的权限;前提是须要用户提交一个DN形式的用户名并能经过认证
compare 比较属性的权限;(例如:对照查看某用户的telephoneNumber值是否是158 8888 8888),但并不具备搜索的权限
search 利用过虑条件进行搜索的权限,但这并不必定具备可读取搜索结果的权限
read 读取搜索结果的权限
write 更改记录属性值的权限
能够在slapd.conf文件中经过defaultaccess指定默认的权限级别,如:
defaultaccess search
在进行记录的匹配时,若是有多条规则存在,那么在第一次匹配产生后是否还进行后续的匹配或采起其它的动做将取决于此项的设置;控制方式共有如下三种:
stop 这个是默认值,这表示在一次匹配产生后将再也不进行下一个匹配,全部后续的匹配将会中止。
continue 不管匹配是否已经发生,继续进行直到全部的规则所有进行完匹配检查
break 一个匹配发生后,跳出当前的子句进行后一个子句的检查
access to dn.chilren="ou=users,dc=mydomain,dc=org"
attrs=userPassword #指定“密码”属性
by self write #用户本身可更改
by * auth #全部访问者须要经过认证
by dn.children="ou=admins,dc=mydomain,dc=org" write #管理员组的用户可更改
access to dn.subtree="ou=SUDOers,dc=test,dc=com" #SUDOers的全部内容必须提供其余匿名可读,否则在linux上切换到该用户,不能使用sudo
#其余用户可读
by dn="cn=Manager,dc=test,dc=com" write
by * read
access to attrs="gidNumber,homeDirectory,loginShell,uidNumber,sshPublicKey"
by * read #对这些属性只能读,可是userPassword字段是可写的,容许用户自行修改密码,可是不能修改本身的gid,home目录等
access to *
by anonymous read #匿名访问可读
by self write #本身可写
by users read
前面这些配置须要放在 database config access to * by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by * none enable server status monitoring (cn=monitor) database monitor access to * by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.exact="cn=Manager,dc=test,dc=com" read by * none
的前面才能生效