正常情况下,登录一个 Ldap 用户,可以看到整个树形结构。但在一些情形下,我们希望如 dc=ali,dc=example,dc=com 仅能够被 “ali” 这个节点下的用户看到,而“dc=ali” 这个节点下的用户又仅能访问本节点下的信息,而无法看到如 dc=huawei 节点下的信息。即使 dc=baidu, dc=ali, dc=huawei 之间具有隔离性,各个公司仅能访问自己公司的节点下的 subtree, 而其他公司无法访问或是被访问。
因此要使用 Ldap 中的 ACL 进行控制,在此给出该情形的 ACL 示例。
# acl.ldif 内容
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: to attrs=userPassword
by dn="cn=admin,dc=example,dc=com" write
by anonymous auth
by self write
by * none
olcAccess: to dn.regex="^cn=system_user,ou=system_user"
by dn="cn=admin,dc=example,dc=com" write
by * read
olcAccess: to dn.regex="dc=([^,]+),dc=example,dc=com$"
by dn.regex="cn=system_user,ou=system_user,dc=$1,dc=example,dc=com" write
by dn.regex="dc=$1,dc=example,dc=com$" read
by * none
olcAccess: to *
by dn="cn=admin,dc=example,dc=com" write
by anonymous auth
by self write
by * read
acl.ldif 内容解读:
内容中第一个 olcAccess 设置的密码规则;
第二个 olcAccess 设置的各个公司下的 cn=system_user,ou=system_user…不可更改 ,仅超管可改;
第三个 olcAccess 设置的各个公司用户隔离,仅看到本公司下的节点;
第四个 olcAccess 设置的所有属性的可见性,匿名用户隔离;
# 最后通过 ldapmodify 指令讲 acl 控制加载到 ldap 配置中
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f acl.ldif