OpenLDAP:用ACL控制访问权限 | 您所在的位置:网站首页 › openldap管理 › OpenLDAP:用ACL控制访问权限 |
用ACL控制授权 我们在LDAP中创建目录树后,最感兴趣的就是如何控制用户在目录树中的权限(读写)。谁在什么条件下有记录权限,我们有权限看到哪些信息。ACL(Access Control List)访问控制列表就是解决用户权限问题的。 我们要把ACL写在哪里? ACL写在OpenLDAP的服务端全局配置文件slapd.conf中,如下这段即为其指令: # access to dn.base="" by * read # access to dn.base="cn=Subschema" by * read # access to * # by self write # by users read # by anonymous auth也可以写在一个单独的文件中,如access.conf,然后在全局配置文件slapd.conf中 调用,在配置文件中引入这个文件即可,如下: include /etc/openldap/access.confinclude后面的路径为该文件的放置地址。 ACL语法基础 怎么看懂ACL指令? 首先看下ACL访问指令的格式: ################################################ access to [resources] by [who] [type of access granted] [control] by [who] [type of access granted] [control] # More 'by' clauses, if necessary.... ################################################指令中包含1个to语句,多个by语句。 这个指令的大体意思是,通过access to约束我们访问的范围(resources), 通过by设定哪个用户(who)获取对这个约束范围有什么权限(type of access granted), 并控制(control)这个by语句完成后是否继续执行下一个by语句或者下一个ACL指令。 如果对ACL指令很熟悉的话,可以不必继续往下看,因为以下为详细的指令基础介绍。 现在对ACL指令分解成两大部分进行详细说明,一个是access to指令, 一个是 by指令。 先看看access to吧。 以上内容意思是, dn.base: 约束这个特定DN的访问。他和dn.exact和dn.baselevel是相同的意思。 dn.one: 约束这个特定的DN第一级子树的访问。dn.onelevel是同义词。 dn.children: 这个和dn.subtree类似,都是对其以下的子树访问权的约束。不同点在于, 这个的约束是不包含自己本身DN。而subtree包含了本身的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” 匹配记录2、3、4、5 规则 dn.children=”ou=users,dc=mydomain,dc=org” 匹配记录3、4、5,因为记录0、1和2都是以DN直接命名的,故不匹配 指定被授权的用户范围的方法大致有以下几种: 所有的访问者,包括匿名的用户 anonymous 非认证的匿名用户 users 认证的用户 self 目标记录的用户自身 dn[.]= 在指定目录内匹配正则表达式的用户 dn.= 指定DN内的用户例如: by dn.subtree=“ou=users,dc=domain,dc=org”="^samba*" 被授予的权限access 当选取好ACL作用的目标记录并选取好用户范围后,就该给这些用户授予他们应该得到的权限了。大致的权限(由低到高)有以下几类: none 无权限,即拒绝访问 auth 访问bind(认证)设置的权限;前提是需要用户提交一个DN形式的用户名并能通过认证 compare 比较属性的权限;(例如:对照查看某用户的telephoneNumber值是不是158 8888 8888),但并不具有搜索的权限 search 利用过虑条件进行搜索的权限,但这并不一定具有可读取搜索结果的权限 read 读取搜索结果的权限 write 更改记录属性值的权限 可以在slapd.conf文件中通过defaultaccess指定默认的权限级别,如: defaultaccess search 2.4 采取什么样的匹配控制动作control 在进行记录的匹配时,如果有多条规则存在,那么在第一次匹配产生后是否还进行后续的匹配或采取其它的动作将取决于此项的设置;控制方式共有以下三种: stop 这个是默认值,这表示在一次匹配产生后将不再进行下一个匹配,所有后续的匹配将会停止。 continue 无论匹配是否已经发生,继续进行直到所有的规则全部进行完匹配检查 break 一个匹配发生后,跳出当前的子句进行后一个子句的检查 对于dn的约束条件还可以利用模糊约束,如下: access to dn.regex=“uid=[^,]+,ou=Users,dc=example,dc=com” by * none dn.regex是用来做匹配(match)用的。 这个指令将约束所有uid=(任何值),ou=Users,dc=example,dc=com的DN,其中的任何值是用 [^,]+ 这个符号组合来表示的,他可以代表任何至少有1个字符,且字符当中没有逗号(,)的值。 更明确点说,意思就是在ou=Users,dc=example,dc=com这个DN下的所有以uid为属性的一级子树都属于这个约束的范围。 通过约束attrs访问对于DN的约束大多用在对某个层级的约束,而用attrs的话,就可以跨层级(或者说跨越父类树),通过属性来约束访问的范围。 access to attrs=homePhone by * none 这个例子意思是,任何人都没有权限访问属性为homePhone的信息。 在attrs后面的值可以多个,如 access to attrs=homePhone,homePostalAddress 如果想约束某个对象类(Object class)的所有属性,我们或许可以有这样的形式: access to attrs = title, registeredAddress, destinationIndicator,…… 但这个方法太耗时,也难以阅读,显得笨重,以下给出一个好的方法: access to attrs=@organizationalPerson by * none 用@的方法必须谨慎,这段指令不仅仅约束了organizationalPerson里的属性,也约束 了person对象类的属性。为什么?因为organizationalPerson对象类是person的子类, 因此,所有person中的属性就当然也是organizationalPerson的属性了。 如果想做除了organizationalPerson的其他对象类的约束,可以用!来表示: access to attrs=!organizationalPerson 也可以加入属性的值,具体约束某个值: access to attrs=givenName val="Matt" 这个指令也可以用模糊约束的方法,如下:access to attrs=givenName val.regex=“M.*” 最后给个一般情况下用到的利用属性约束的例子: access to attrs=member val.children=“ou=Users,dc=example,dc=com” by * none 通过Filters访问Filters提供一种支持条目记录匹配的方法,如下: access to filter="(objectClass=simpleSecurityObject)" by * none这表示我们可以约束所有记录中包含对象类为simpleSecurityObject的信息。 与编程语言类似, ACL指令也有类似与或的条件判断,如下: access to filter="(|(|(givenName=Matt)(givenName=Barbara))(sn=Kant))" by * none这段代码过滤出givenName为Matt或者Barbara,或者surname为Kant的信息。 Access to [resources] resources可以有多种形式,如DN,attrs, Filters. 以下即详细说明。 通过约束DN进行访问如下所示, access to dn=“uid=matt,ou=Users,dc=example,dc=com” by * none 这个指令是指访问uid=matt,ou=Users,dc=example,dc=com这个DN,即把访问的 范围约束在这个DN中。 by * none是指对于任何人的访问都是拒绝的。 总体的意思就是,任何人都没有权限访问uid=matt,ou=Users,dc=example,dc=com这个DN,当然,服务器管理员是可以访问的,不然它无法维护这个OpenLDAP中的用户信息。 再来看一个, access to dn.subtree="ou=Users,dc=example,dc=com" by * none 在这个例子中,我们用了dn.subtree。在我们的目录信息树中,在ou=Users子树下可能有多个用户。举例来说,DN为uid=matt,ou=Users,dc=example,dc=com就是ou=Users, dc=example,dc=com的子树,当要试图访问他时,这个ACL指令就起了作用。 总体的意思是,任何人都没有权限访问ou=Users,dc=example,dc=com以及其子树的信息。####################################################################### |
CopyRight 2018-2019 实验室设备网 版权所有 |