OpenLDAP:用ACL控制访问权限

原文:http://blog.youkuaiyun.com/corpsin/article/details/5048402

ACL控制授权

我们在LDAP中创建目录树后,最感兴趣的就是如何控制用户在目录树中的权限(读写)。谁在什么条件下有记录权限,我们有权限看到哪些信息。ACLAccess 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.conf

include后面的路径为该文件的放置地址。

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....

################################################

指令中包含1to语句,多个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.exactdn.baselevel是相同的意思。

dn.one:约束这个特定的DN第一级子树的访问。dn.onelevel是同义词。

dn.children:这个和dn.subtree类似,都是对其以下的子树访问权的约束。不同点在于,

这个的约束是不包含自己本身DN。而subtree包含了本身的DN

#######################################################################

对于dn的约束条件还可以利用模糊约束,如下:

access to dn.regex="uid=[^,]+,ou=Users,dc=example,dc=com"

by * none

dn.regex是用来做匹配(match)用的。

这个指令将约束所有uid=(任何值),ou=Users,dc=example,dc=comDN,其中的任何值是用[^,]+这个符号组合来表示的,他可以代表任何至少有1个字符,且字符当中没有逗号(,)的值。

更明确点说,意思就是在ou=Users,dc=example,dc=com这个DN下的所有以uid为属性的一级子树都属于这个约束的范围。

2.通过约束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

1.通过Filters访问

Filters提供一种支持条目记录匹配的方法,如下:

access to filter="(objectClass=simpleSecurityObject)"

by * none

这表示我们可以约束所有记录中包含对象类为simpleSecurityObject的信息。

与编程语言类似, ACL指令也有类似与或的条件判断,如下:

access to

filter="(|(|(givenName=Matt)(givenName=Barbara))(sn=Kant))"

by * none

这段代码过滤出givenNameMatt或者Barbara,或者surnameKant的信息。

Access to [resources]

resources可以有多种形式,如DNattrs,Filters.

以下即详细说明。

1.通过约束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子树下可能有多个用户。举例来说,DNuid=matt,ou=Users,dc=example,dc=com就是ou=Users, dc=example,dc=com的子树,当要试图访问他时,这个ACL指令就起了作用。

总体的意思是,任何人都没有权限访问ou=Usersdc=example,dc=com以及其子树的信息。

#######################################################################

 此处插播1个知识点

dn.base:Restrict access to this particular DN. This is the default, and

dn.exactand dn.baselevel are synonyms of dn.base.

dn.one:Restrict access to any entries immediately below this DN.

dn.onelevelis a synonym.

dn.children:Restrict access to the children (subordinate) entries of this DN.

This is similar to subtree, except that the given DN itself is not restricted by the rule.  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值