本部分中的示例说明了一家虚构的 ISP 公司 Example.com 如何实现其访问控制策略。
此外,您也可以在随安装提供的示例 LDIF 文件 (install_path/ds6/ldif/Example.ldif) 中找到 ACI 示例。
所有示例都说明如何使用 LDIF 文件执行给定任务。下图以图形方式显示了 example.com 目录信息树。
Example.com 提供了 Web 托管服务和 Internet 访问。Example.com 的部分 Web 托管服务用于托管客户端公司的目录。Example.com 实际上托管并部分管理两家中型公司(Company333 和 Company999)的目录。此外,Example.com 还提供对大量单个订户的 Internet 访问。
Example.com 希望制定以下访问规则:
为 Example.com 员工授予对整个 Example.com 树的匿名读取、搜索和比较访问权限。请参见授予匿名访问权限。
为 Example.com 员工授予对个人信息的写入权限,如 homeTelephoneNumber 和 homeAddress。请参见授予对个人条目的写入访问权限。
为 Example.com 订户授予读取 dc=example,dc=com 条目(但不包括该条目下的任何条目)的权限,以获取公司联系信息。请参见授予对特定级别的访问权限。
为 Example.com 员工授予将任何角色(某些重要角色除外)添加到其条目的权限。请参见限制对重要角色的访问权限。
针对某个后缀为特定管理员授予与目录管理员相同的权限。请参见为角色授予对整个后缀的完全访问权限。
为 Example.com 人力资源组授予对 People 分支中条目的所有权限。请参见为组授予对后缀的完全访问权限。
为所有 Example.com 员工授予以下权限:在目录的 Social Committee 分支下创建组条目,以及删除某个员工所拥有的组条目。请参见授予添加和删除组条目的权限。
为所有 Example.com 员工授予将自身添加到目录 Social Committee 分支下的组条目的权限。请参见允许用户在组中添加或删除自身。
为 Company333 和 Company999 的目录管理者(角色)授予对其各自目录树分支的访问权限(在特定条件下)。这些条件包括 SSL 验证、时间和日期限制,以及指定的位置。请参见为组或角色授予条件访问权限。
为单个订户授予对其各自条目的访问权限。请参见授予对个人条目的写入访问权限。
拒绝单个订户对其自身条目中的帐单信息的访问权限。请参见拒绝访问。
为所有人授予对单个订户子树的匿名访问权限,明确要求不列出的订户除外。如果需要,此部分目录可以作为防火墙外的只读服务器,并且每天更新一次。请参见授予匿名访问权限和使用过滤设置目标。
大多数目录都配置为至少允许您匿名访问一个后缀,以进行读取、搜索或比较。如果要运行公司人员目录(如可供员工搜索的电话薄),则可能需要设置这些权限。Example.com 内部即为这种情况,如ACI "Anonymous Example.com"中所示。
作为 ISP,Example.com 还要创建允许所有人访问的公共电话薄,以提供其所有订户的联系信息。相关内容如ACI "Anonymous World"所述。
在 LDIF 中,要为 Example.com 员工授予对整个 Example.com 树的读取、搜索和比较权限,可编写以下语句:
aci: (targetattr !="userPassword")(version 3.0; acl "Anonymous example"; allow (read, search, compare) userdn= "ldap:///anyone") ;) |
本示例假定将 aci 添加到 dc=example,dc=com 条目中。请注意,userPassword 属性被排除在 ACI 范围之外。
请使用与密码属性保护示例中所用的相同语法来保护保密属性和不应显示的属性,即 (targetattr !="attribute-name ")。
在 LDIF 中,要为所有人授予对单个订户子树的读取和搜索访问权限,但不允许访问未列出订户的信息,可编写以下语句:
aci: (targetfilter= "(!(unlistedSubscriber=yes))") (targetattr="homePostalAddress || homePhone || mail") (version 3.0; acl "Anonymous World"; allow (read, search) userdn="ldap:///anyone";) |
此示例假定 ACI 已添加到 ou=subscribers,dc=example, dc=com 条目中。此示例还假定每个订户条目都具有 unlistedSubscriber 属性(设置为 yes 或 no)。目标定义将根据此属性的值过滤掉未列出的订户。有关过滤器定义的详细信息,请参阅使用过滤设置目标。
许多目录管理者都允许内部用户更改其自身条目中的部分(而非全部)属性。Example.com 的目录管理者允许用户更改自身的密码、家庭电话号码和家庭地址,但不允许更改其他内容。相关内容如ACI "Write Example.com"所述。
Example.com 还有一条策略,即,如果订户建立到目录的 SSL 连接,则允许订户在 Example.com 树中更新自身的个人信息。相关内容如ACI "Write Subscribers"所述。
通过设置此权限,还可以为用户授予删除属性值的权限。
在 LDIF 中,要为 Example.com 员工授予更新其家庭电话号码和家庭地址的权限,可编写以下语句:
aci: (targetattr="homePhone || homePostalAddress")(version 3.0; acl "Write Example.com"; allow (write) userdn="ldap:///self" ;) |
此示例假定 ACI 已添加到 ou=People,dc=example,dc=com 条目中。
通过设置此权限,还可以为用户授予删除属性值的权限。
在 LDIF 中,要为 Example.com 订户授予更新其家庭电话号码的权限,可编写以下语句:
aci: (targetattr="homePhone") (version 3.0; acl "Write Subscribers"; allow (write) userdn= "ldap://self" and authmethod="ssl";) |
此示例假定 aci 已添加到 ou=subscribers,dc=example, dc=com 条目中,并且用户必须使用 SSL 进行绑定。
请注意,Example.com 订户对其家庭地址没有写入访问权限,因为他们可能会删除该属性。家庭地址是 Example.com 寄发帐单时所需的重要业务信息。
可以通过设置 ACI 的范围来影响目录树中的不同级别,以便对您所允许的访问权限级别进行微调。可将目标 ACI 范围设置为以下任一选项:
条目自身
条目自身及其下一级的所有条目
条目自身及其下面的所有条目(不限制深度)
在 LDIF 中,要为 Example.com 订户授予读取 dc=example,dc=com 条目的权限(以获取公司联系信息),但不允许访问该条目下的任何条目,可编写以下语句:
aci: (targetscope="base") (targetattr="*")(version 3.0; acl "Read Example.com only"; allow (read,search,compare) userdn="ldap:///cn=*,ou=subscribers,dc=example,dc=com";) |
此示例假定 ACI 已添加到 dc=example, dc=com 条目中。
您可以在目录中使用角色定义,以标识对业务至关重要的功能,如网络和目录管理。
例如,您可以通过标识系统管理员的某个子集来创建超级管理员 (superAdmin) 角色,这些管理员于每周特定日期的特定时间在全球公司站点上可用。或者,您也可以创建急救员 (First Aid) 角色,其中包括特定站点中所有受过急救培训的工作人员。有关创建角色定义的信息,请参见管理角色。
当某个角色在重要的公司或业务功能方面可提供任何种类的用户特权时,应考虑限制对该角色的访问权限。例如,在 Example.com 中,员工可以向自身条目中添加除超级管理员 (superAdmin) 角色之外的任何角色,如以下示例所示。
在 LDIF 中,要为 Example.com 员工授予在自身条目中添加除超级管理员 (superAdmin) 之外的任何角色的权限,可编写以下语句:
aci: (targetattr="*") (targattrfilters="add=nsRoleDN: (nsRoleDN !="cn=superAdmin, dc=example, dc=com")") (version 3.0; acl "Roles"; allow (write) userdn= "ldap:///self" ;) |
此示例假定 ACI 已添加到 ou=People,dc=example, dc=com 条目中。
有时,针对某个后缀为特定用户授予与目录管理员相同的权限是非常有用的。在 Example.com 中,Kirsten Vaughan 是目录服务器管理员。她具有超级管理员 (superAdmin) 角色。此角色具有以下优点:
由于可以强制以自身标识进行绑定的管理员使用强验证(如 SSL),因此更加安全
由于只有少数人知道目录管理员密码,因此更加安全
可通过日志记录提高可追溯性
将 Kirsten Vaughan 添加到 cn=Administrators,cn=config 组还会为她授予与目录管理员相同的权限。
要使用户对整个服务器具有与目录管理员相同的权限,请执行创建具有超级用户权限的管理用户中的过程。
在 LDIF 中,要为管理员 Kirsten Vaughan 授予与目录管理员相同的权限,请使用以下语句:
aci: (targetattr="*") (version 3.0; acl "Full Access"; allow (all) groupdn= "ldap:///cn=SuperAdmin,dc=example,dc=com" and authmethod="ssl" ;) |
此示例假定 ACI 已添加到根条目 ""(无文本)中。
大多数目录都有用于标识特定公司功能的组。可以为组授予对部分或全部目录的访问权限。通过将访问权限应用于组,可以避免单独为每个成员设置访问权限。可以通过将用户添加到组来为这些用户授予访问权限。
例如,在创建目录服务器实例时,默认情况下将创建一个管理员组 cn=Administrators,cn=config,此组具有目录的完全访问权限。
在 Example.com 中,人力资源组对目录的 ou=People 分支具有完全访问权限,这样他们可以更新员工目录,如ACI "HR"中所示。
在 LDIF 中,要为人力资源组授予对目录员工分支的所有权限,请使用以下语句:
aci: (targetattr="*") (version 3.0; acl "HR"; allow (all) groupdn= "ldap:///cn=HRgroup,ou=Groups,dc=example,dc=com";) |
此示例假定 ACI 已添加到以下条目中:
ou=People,dc=example,dc=com |
某些组织允许员工在树中创建条目,以提高员工的工作效率,并鼓励员工为公司活力注入一己之力。例如,在 Example.com 中,Social Committee 由网球、游泳、滑雪和角色扮演等各种俱乐部组成。
任何 Example.com 员工都可以创建代表新俱乐部的组条目,如ACI "Create Group"中所示。
任何 Example.com 员工都可以成为其中某个组的成员,如允许用户在组中添加或删除自身中所示。
只有组的所有者才能修改或删除组条目,如ACI "Delete Group"中所示。
在 LDIF 中,要为 Example.com 员工授予在 ou=Social Committee 分支下创建组条目的权限,可编写以下语句:
aci: (targetattr="*") (targattrfilters="add=objectClass: (|(objectClass=groupOfNames)(objectClass=top))") (version 3.0; acl "Create Group"; allow (read,search,add) userdn= "ldap:///uid=*,ou=People,dc=example,dc=com") and dns="*.Example.com";) |
此示例假定 ACI 已添加到 ou=Social Committee,dc=example,dc=com 条目中。
此 ACI 不授予写入权限,这意味着条目创建者无法修改条目。
由于服务器在后台添加值 top,因此需要在 targattrfilters 关键字中指定 objectClass=top。
ACI 将客户机限制在 example.com 域中。
在 LDIF 中,要为 Example.com 员工授予相应权限,以修改或删除其所属组(在 ou=Social Committee 分支下)的组条目,可编写以下语句:
aci: (targetattr = "*") (targattrfilters="del=objectClass: (objectClass=groupOfNames)") (version 3.0; acl "Delete Group"; allow (write,delete) userattr="owner#GROUPDN";) |
此示例假定 aci 已添加到 ou=Social Committee,dc=example,dc=com 条目中。
请注意,使用 DSCC 创建此 ACI 不是有效方式,因为您必须使用手动编辑模式创建目标过滤器,并检查组的所有权。
许多目录都设置了允许用户在组中(如邮件列表)添加或删除自身的 ACI。
在 Example.com 中,员工可以将自身添加到 ou=Social Committee 子树下的任何组条目中,如ACI "Group Members"中所示。
在 LDIF 中,要为 Example.com 员工授予将自身添加到组的权限,可编写以下语句:
aci: (targettattr="member")(version 3.0; acl "Group Members"; allow (selfwrite) (userdn= "ldap:///uid=*,ou=People,dc=example,dc=com") ;) |
此示例假定 ACI 已添加到 ou=Social Committee, dc=example,dc=com 条目中。
在许多情况下,当您为组或角色授予对目录的访问特权时,必须确保入侵者无法模拟特权用户使用这些特权。因此,在许多情况下,为组或角色授予重要访问权限的访问控制规则通常与许多条件相关联。
例如,Example.com 为其每个托管公司(Company333 和 Company999)创建了一个目录管理者角色。Example.com 希望这两家公司能够管理各自的数据并实现各自的访问控制规则,同时又能确保数据不受侵犯。
因此,如果满足以下条件,Company333 和 Company999 将对其各自的目录树分支具有完全权限。
使用证书通过 SSL 对连接进行验证。
在星期一至星期四的 8:00 至 18:00 之间请求访问。
从每个公司的指定 IP 地址请求访问。
这些条件将在每个公司的某个 ACI(ACI "Company333" 和 ACI "Company999")中列出。由于两个 ACI 的内容相同,因此以下示例只使用 "Company333" ACI。
在 LDIF 中,要在满足上述条件的情况下为 Company333 授予对其目录分支的完全访问权限,可编写以下语句:
aci: (targetattr = "*") (version 3.0; acl "Company333"; allow (all) (roledn="ldap:///cn=DirectoryAdmin,ou=Company333, ou=corporate clients,dc=example,dc=com") and (authmethod="ssl") and (dayofweek="Mon,Tues,Wed,Thu") and (timeofday >= "0800" and timeofday <= "1800") and (ip="255.255.123.234"); ) |
此示例假定 ACI 已添加到 ou=Company333,ou=corporate clients,dc=example,dc=com 条目中。
如果您已经允许对后缀的大部分进行访问,则您可能希望在现有的 ACI 下拒绝对后缀的较小部分进行访问。
应尽可能避免拒绝访问,因为它可能会导致意外或复杂的访问控制行为。可以结合使用作用域、属性列表、目标过滤器等来限制访问权限。
此外,删除拒绝访问 ACI 不会删除权限,但会扩展其他 ACI 所设置的权限。
当目录服务器评估访问权限时,它将首先读取 deny 权限,然后再读取 allow 权限。
在后面的示例中,Example.com 希望所有订户都能读取自身条目下的帐单信息,如连接时间或帐户余额。Example.com 也明确希望拒绝对该信息的写入访问权限。读取访问权限将在ACI "Billing Info Read"中进行介绍。拒绝访问权限将在ACI "Billing Info Deny"中进行介绍。
在 LDIF 中,要为订户授予读取自身条目中的帐单信息的权限,可编写以下语句:
aci: (targetattr="connectionTime || accountBalance") (version 3.0; acl "Billing Info Read"; allow (search,read) userdn="ldap:///self";) |
此示例假定已在模式中创建了相关属性,并且 ACI 已添加到 ou=subscribers,dc=example,dc=com 条目中。
在 LDIF 中,要拒绝订户修改自身条目中的帐单信息的权限,可编写以下语句:
aci: (targetattr="connectionTime || accountBalance") (version 3.0; acl "Billing Info Deny"; deny (write) userdn="ldap:///self";) |
此示例假定已在模式中创建了相关属性,并且 ACI 已添加到 ou=subscribers,dc=example,dc=com 条目中。
代理授权方法是一种特殊形式的验证。通过代理授权,可为使用自身标识绑定到目录的用户授予其他用户的权限。
要将目录服务器配置为允许代理请求,必须执行以下操作:
为管理员授予与其他用户相同的代理权限。
为普通用户授予访问控制策略中所定义的一般访问权限。
您可以将代理权限授予除目录管理员之外的任何目录用户。此外,您无法将目录管理员的 DN 用作代理 DN。授予代理权限时应特别小心,因为授予此权限可将任何 DN(目录管理员 DN 除外)指定为代理 DN。如果目录服务器在同一操作中收到多个代理验证控制,则会向客户端应用程序返回错误,并且操作尝试将会失败。
对于 LDAP 数据,Example.com 希望绑定为 MoneyWizAcctSoftware 的客户端应用程序具有与帐户管理员相同的访问权限。
将应用以下参数:
客户端应用程序的绑定 DN 为 uid=MoneyWizAcctSoftware, ou=Applications,dc=example,dc=com。
客户端应用程序请求访问权限的目标子树为 ou=Accounting,dc=example,dc=com。
目录中存在对 ou=Accounting,dc=example,dc=com 子树具有访问权限的帐户管理员。
要使客户端应用程序获取对帐户子树的访问权限(通过使用与帐户管理员相同的访问权限),必须满足以下条件:
帐户管理员对 ou=Accounting,dc=example,dc=com 子树必须具有访问权限。例如,以下 ACI 为帐户管理员条目授予所有权限:
aci: (targetattr="*") (version 3.0; acl "allowAll-AcctAdmin"; allow (all) userdn="ldap:///uid=AcctAdministrator,ou=Administrators, dc=example,dc=com";) |
目录中必须存在为客户端应用程序授予代理权限的以下 ACI:
aci: (targetattr="*") (version 3.0; acl "allowproxy- accountingsoftware"; allow (proxy) userdn= "ldap:///uid=MoneyWizAcctSoftware,ou=Applications, dc=example,dc=com";) |
正确使用此 ACI 之后,MoneyWizAcctSoftware 客户端应用程序即可绑定到目录,然后发送需要代理 DN 访问权限的 LDAP 命令,如 ldapsearch 或 ldapmodify。
在此示例中,如果客户端要执行 ldapsearch 命令,则此命令将包括以下控制:
$ ldapsearch -D "uid=MoneyWizAcctSoftware,ou=Applications,dc=example,dc=com" -w - \ -Y "dn: uid=AcctAdministrator,ou=Administrators,dc=example,dc=com" ... |
如果客户端要执行 ldapmodify 命令,则此命令将包括以下控制:
$ ldapmodify -h hostname -p port \ -D "uid=MoneyWizAcctSoftware,ou=Applications,dc=example,dc=com" -w - \ -Y"dn: uid=AcctAdministrator,ou=Administrators,dc=example,dc=com" dn: uid=AcctAdministrator,ou=Administrators,dc=example,dc=com changetype: modify delete: userpassword - add: userpassword userpassword: admin1 |
请注意,客户端以自身标识进行绑定,但被授予代理条目的特权。客户端不需要代理条目的密码。
如果要设置允许访问目录中大量条目的访问控制,则可以使用过滤器设置目标。
在 LDIF 中,要通过过滤器允许人力资源部门的所有用户访问员工条目,可编写以下语句:
aci: (targetattr="*") (targetfilter=(objectClass=employee)) (version 3.0; acl "HR access to employees"; allow (all) groupdn= "ldap:///cn=HRgroup,ou=People,dc=example,dc=com";) |
此示例假定 ACI 已添加到 ou=People,dc=example,dc=com 条目中。
由于搜索过滤器不直接指出要管理访问权限的对象的名称,因此在允许或拒绝对象的访问权限时,请勿弄错对象。如果不慎允许或拒绝了错误对象的访问权限,则随着目录变得越来越复杂,风险将会越来越大。此外,使用过滤器时,您可能难以对目录中的访问控制问题进行故障排除。
需要在 LDIF ACI 语句中对包含逗号的 DN 进行特殊处理。在 ACI 语句的目标和绑定规则部分,必须使用单个反斜杠 (\) 来转义逗号。以下示例对此语法进行了说明:
dn: o=Example.com Bolivia\, S.A. objectClass: top objectClass: organization aci: (target="ldap:///o=Example.com Bolivia\,S.A.") (targetattr="*") (version 3.0; acl "aci 2"; allow (all) groupdn = "ldap:///cn=Directory Administrators, o=Example.com Bolivia\, S.A.";) |