1.1.1. 通用全局配置
1.1.1.1. access
指定访问控制项.
语法如下:
<access directive> ::= access to <what>
[by <who> <access> <control>]+
<what> ::= * |
[dn[.<basic-style>]=<regex> | dn.<scope-style>=<DN>]
[filter=<ldapfilter>] [attrs=<attrlist>]
<basic-style> ::= regex | exact
<scope-style> ::= base | one | subtree | children
<attrlist> ::= <attr> | <attr> , <attrlist>
<attr> ::= <attrname> | entry | children
<who> ::= * | [anonymous | users | self
| dn[.<basic-style>]=<regex> |
dn.<scope-style>=<DN>]
[dnattr=<attrname>]
[group[/<objectclass>[/<attrname>][.<basic-style>]]=<regex>]
[peername[.<basic-style>]=<regex>]
[sockname[.<basic-style>]=<regex>]
[domain[.<basic-style>]=<regex>]
[sockurl[.<basic-style>]=<regex>]
[set=<setspec>]
<access> ::= [self]{<level>|<priv>}
<level> ::= none | disclose | auth | compare | search | read |
{write | add | delete} | manage
<priv> ::= {=|+|-}{0|d|x|c|s|r|{w|a|z}|m}+
<control> ::= [stop | continue | break]
详解:
n 指定目标
现在我们看看目标,access 短语的<what>部分:
<what> ::= * | [dn[.<style>]=<dnspec>] [filter=<ldapfilter>] [attrs=<attrlist>]
目标分成三部分.第一部分定义了基础部分的条件,位于目录信息树(DIT)
或是匹配的条目分辨名. 第二部分定义了必须实现的条目的属性和作为 LDAP
过滤器定义的条件.第三部分定义了对访问整个条目(不存在的话)或仅仅是一
部分,access 短语是否生效.此匹配的分辨名可以是如下的 styles:
<style> ::= regex | base | one | subtree | children
缺省风格是 regix,意思是值应该解析成正则表达式,表示匹配的条目分辨名.
选择匹配的字符串的一部分,保留匹配的部分用在以后作替换是可能的.我们使
用闭括号完成此部分.以后我们会称第一个匹配的部分为$1,第二个匹配部分为
$2,依此类推.
多数 access 短语不需要完整的正则表达式,而用正则表达式写是令人讨厌
的.基于此原因,提供其他一些风格:base 是你的访问是对于提供的条目名有效
的,one 代表提供的条目的所有直接子条目,subtree 代表所选条目加上所有的子
条目,children 代表所有子条目但不包括所选条目自己.代替使用 dn=part,你可
以简单定义星号,这比等价于 dn.regex=.*.的形式更易于理解.
以上是 access 短语可以成为整个条目或一部分前的情况.后面的情况在我
们指明一个属性列表时出现,
<attrlist> ::= <attr> | <attr> , <attrlist>
<attr> ::= <attrname> | entry | children
你需要每一个对条目有效的操作的条目访问控制.特别的,你从条目中获取
值时需要 read 访问权限,如果你要代表此条目需要 auth 访问权限.显然,你不需
要 entry 访问权限以修改条目自身的值.
你需要 write访问权限,以实现对子条目增删或重命名,包括改变条目的上级,
你需要 write 访问权限修改老的和新的上级.
n 指定接受者
现在我们来指定接受者,即指定由谁来获得给定目标的访问权限.
<who> ::= [ * | anonymous | users | self | dn[.<style>]=<regex> ]
[dnattr=<attrname>]
[group[/<objectclass>[/<attrname>][.<style>]]=<regex>]
[peername[.<style>]=<regex>] [sockname[.<style>]=<regex>]
[domain[.<style>]=<regex>] [sockurl[.<style>]=<regex>]
[set=<setspec>]
这是一个复杂的定义,所以我们慢慢来检查.首先,我们有一个分辨名规范,我们已
经熟悉了使用通配符* 和 dn=.后者可以使用一个样式作为目标规范.
术语 users 代表用户同一些条目绑定的用户,术语 anonymous 代表没有绑定或空绑定.
术语 dnattr 允许赋予基于包含条目自身的数据的访问权限.匹配这个术语的
目标存储在具有给定的 attrname 属性的条目中.通常用来给定特殊的所有权限,
其标识存储在 attrname 中.
术语 group 选择那些列在目录中的其他一些条目的目标.group 条目对象类
必须是<objectclass>(缺省为:groupOfNames),必须从属性类型为<attrname>(缺
省:member)中取得目标对象列表.匹配风格 style 缺省为 regex.此时,<regex>中的值作一个变量替换,结果为目标对象的条目分辨名列表.如果 style是 exact,则不进行变量替换,给定的值就是接收的目标对象列表.
术语<peername>和<sockname>用来指明远端和本地的目录连接,语法上相
同,通常使用型如 IP=<ip-address>:<port>的字符串.我们可以使用这些术语用基
于客户 IP 地址的方式控制目录的访问.
术语<domain>用来从一些 DNS 域中选择连接的内容.如果<style>是 exact,指明<regex>被作为大小写敏感的文本字符串进行比较.如果<style>是 regex(缺省),将进行变量替换,并按正则匹配进行比较.
术语<sockurl>用来依照用来连接的特定监听器来选择内容.如果<style>是
exact,指明<regex>被作为大小写敏感的文本字符串进行比较.如果<style>是
regex(缺省),将进行变量替换,并按正则匹配进行比较.
组访问控制的例子
考虑一组名称,带"member"和"owner"属性.我们要"owner"能够管理组,"members"能自由地加入和退出,而且应用程序能读取"members"以完成工作.可能的解决是:
access to dn.exact="cn=My Group,ou=Groups,dc=example,dc=com"
attrs=member
by dnattr=owner write
by dnattr=member selfwrite
by dn.regex="cn=[^,]+,ou=Apps,dc=example,dc=com" read
by * none
n 权限和特权
<access> ::= [self]{<level>|<priv>}
<level> ::= none | auth | compare | search | read | write
<priv> ::= {=|+|-}{w|r|s|c|x}+
有两种方式定义访问权限.第一种方法是基于权限分级的概念,只在老的版本中使用.每一级访问级别被包含在下一级中.例如,读权限包含了查询权限. 访问级别的名称或多或少地描述自己的含义,只有 auth 是用来向目录绑定.
大部分情况下,访问等级正是你所需要的.无论如何,是存在某些不能用访问等级快速设置的访问策略的,比如有写权限但拒绝其他访问. 密码等认证信息经常是这样的:给拥有者写权限,给匿名者认证权限,拒绝其他访问.你不能通过访问等级做到这点.
你可以使用第二种方法,它基于离散的特权:每个特权独立地赋予或不赋予其他人.共有 5 种离散特权: w (写), r (读), s (查询), c (比较) 和 x (认证) ,以字母指明.
如果把你的特权列在=之前, 特权将被按给定的内容重新设置.也可以用加号(+)和减号(-)在你已有的特权上增减一种或多种特权.
但是,我们说,一旦匹配,对访问控制的分析就停止了.怎样增减特权呢?好的,我们说这是使用下面内容之前的缺省情况.
我要允许我的应用程序的用户创建1个用户组.然后,他们可以修改他们的组,等等…我想下面这行是正确的,其实不然.我想,当 1 个用户试图创建新组,他还不是拥有者,所以没有访问权.那么,是否有 1 种给新数据创建者的特殊访问权?你能帮我吗?
# 只要记住组的成员能够列出组的信息
access to dn=".*,dc=groups,dc=appli"
by dnattr=owner write
by group="cn=admin,dc=groups,dc=appli" write
by group="cn=designer,dc=groups,dc=appli" read
by dnattr=member read
n 控制在匹配之后做什么
在执行了<access>规范之后,该指定如何执行了.选项如下:
<control> ::= [ stop | continue | break ]
默认是 stop,意思是结束访问控制的执行,不管到目前为止,得到的访问权限为什么.
然而,如果用 continue 代替,将处理其他的<who> 子句.你也能停止本子句(the <who>)的执行,但继续读取其他的 access 子句,可以指定break 来完成此功能.如果你想要在找到匹配的目标之后,添加和删除特权,这一选项将会很有用.这个指令准许一个或多个请求者(由<who>指明)对一组条目和/或属性(由<what>指明)进行访问(由<access>指明).
比较常见的配置如下:
access to *
by anonymous read
by * write
1.1.1.2. allows
allows <特性>
允许某些特性.多个特性以空格分隔.缺省是 none.可选的特性如下:
特性 含义
bind_v2 LDAPv2 绑定
bind_anon_cred 密码为空的简单绑定
bind_anon_dn DN为空的简单绑定
1.1.1.3. argsfile
argsfile <文件名>
把启动目录服务器的命令行参数写入<文件名>指定的文件中.
1.1.1.4. attributetype
语法如下:
AttributeTypeDescription = LPAREN WSP
numericoid ; OID
[ SP "NAME" SP qdescrs ] ; 名称
[ SP "DESC" SP qdstring ] ; 描述
[ SP "SUP" SP oid ] ; 父类
[ SP "EQUALITY" SP oid ] ; 用于相等过滤的匹配规则
[ SP "ORDERING" SP oid ] ; 用于排序过滤的匹配规则
[ SP "SUBSTR" SP oid ] ; 用于子串过滤的匹配规则
[ SP "SYNTAX" SP noidlen ] ; 值的语法
[ SP "SINGLE-VALUE" ] ; 是否单值(缺省多值)
[ SP "NO-USER-MODIFICATION" ] ; 是否允许用户修改(缺省允许用户修改)
[ SP "USAGE" SP usage ] ; 用法,缺省 userApplications
extensions WSP RPAREN ; 扩展
定义属性类型.具体使用方法可以参见系统 schema 文件.我在这里只举一个简单的例子:
attributetype ( 0.9.2342.19200300.100.1.9 NAME 'host'
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
1.1.1.5. defaultaccess
defaultaccess { none | authc | compare | search | read | write }
指明当没有设置访问控制时,对请求者给予的缺省访问权限级别.任何给出的访问权限级别暗含着所有较低的级别.例如,读权限包含查询权限、比较权限和认证权限,但不包含写权限.
注意:因为 defaultaccess 比较隐晦,使用中容易造成安全漏洞,所以建议通过设
置访问控制来显式地指明访问权限.
缺省:
defaultaccess read




