我需要为我的数据库添加一堆 ACL,但很难为其编写正确的 LDIF。不幸的是,ldapmodify
它的无用错误消息并没有多大帮助:
modifying entry "olcDatabase={1}mdb,cn=config"
ldap_modify: Other (e.g., implementation specific) error (80)
additional info: <olcAccess> handler exited with 1
我目前对我的 MDB 数据库进行了以下非常基本的配置(它是由 Debian 包配置器为该slapd
包创建的,版本 2.4.40):
# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=domain,dc=lan
olcAccess: {0}to attrs=userPassword,shadowLastChange
by self write
by anonymous auth
by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by * read
# ... and more
由于我将数据库设置为用作 SAMBA 的身份验证后端,因此数据库模式已更新为包含特定于 SAMBA 的类型和属性,现在我想相应地收紧数据库上的 ACL。
我想要实现的目标可以这样表述:
sambaLMPassword
和sambaNTPassword
SAMBA 特定的属性(在类的条目上可用)posixAccount
应该只能由其各自的所有者读取/修改(self
即)。- 已创建一个特殊用户,
dn=sambaAdmin,dc=domain,dc=lan
指定供 SAMBA 自身使用并smbldap-tools
管理数据库中 SAMBA 特定用户。应授予其对 DIT 中一组 SAMBA 特定 OU 的完全访问权限。
我希望我的 ACL 条目插入规则之间{0}
和{1}
当前配置中。
为了实现上面概述的目标,我准备了以下 LDIF 文件,并尝试使用该文件ldapmodify
,但出现了上面显示的错误。
# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {1}to dn.subtree="ou=Users,dc=domain,dc=lan"
attrs=sambaLMPassword,sambaNTPassword
by self write
by dn=sambaAdmin,dc=domain,dc=lan write
by anonymous auth
by * none
olcAccess: {2}to dn.subtree="ou=Computers,dc=domain,dc=lan"
attrs=sambaLMPassword,sambaNTPassword
by self write
by dn=sambaAdmin,dc=domain,dc=lan write
by anonymous auth
by * none
olcAccess: {3}to dn.subtree="ou=Users,dc=domain,dc=lan"
by dn=sambaAdmin,dc=domain,dc=lan write
olcAccess: {4}to dn.subtree="ou=Groups,dc=domain,dc=lan"
by dn=sambaAdmin,dc=domain,dc=lan write
olcAccess: {5}to dn.subtree="ou=Computers,dc=domain,dc=lan"
by dn=sambaAdmin,dc=domain,dc=lan write
olcAccess: {6}to dn.subtree="ou=Idmap,dc=domain,dc=lan"
by dn=sambaAdmin,dc=domain,dc=lan write
olcAccess: {7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan
by dn=sambaAdmin,dc=domain,dc=lan write
不幸的是,LDIF 通过了语法检查(ldapmodify -n -v <path/to/file.ldif
),但错误消息确实没有帮助。
无论如何,能否帮助我修复我的 LDIF 以便被接受slapd
?或者向我解释一种配置方法(或ldapmodify
可能?)以更详细地说明此错误的真正原因?
答案1
ldapmodify 欺骗了你,让你无法确认文件的有效性。如果你打开你创建的 LDIF 文件并运行
ldapmodify -v -n -f <path/to/file.ldif>
输出如下所示:
add olcAccess:
{1}to dn.subtree="ou=Users,dc=domain,dc=lan" attrs=sambaLMPassword,sambaNTPassword by self write by dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * none
{2}to dn.subtree="ou=Computers,dc=domain,dc=lan" attrs=sambaLMPassword,sambaNTPassword by self write by dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * noneolcAccess: {3}to dn.subtree="ou=Users,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {4}to dn.subtree="ou=Groups,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {5}to dn.subtree="ou=Computers,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {6}to dn.subtree="ou=Idmap,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan by dn=sambaAdmin,dc=domain,dc=lan write
!modifying entry "olcDatabase={1}mdb,cn=config"
注意到所有 ACL 都挤在一起了吗?这是因为每个条目之间没有“-”。出于某种原因,当您在试运行模式下使用“-n”开关运行 ldapmodify 时,它会传递此文件,但当您实际尝试实施它时会失败。您应该将 LDIF 文件更改为如下所示:
dn: olcDatabase={1}mdb,cn=config
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write
by anonymous auth
by * none
-
add: olcAccess
olcAccess: {1}to dn.subtree="ou=Users,dc=domain,dc=lan"
attrs=sambaLMPassword,sambaNTPassword by self write by
dn="cn=sambaAdmin,dc=domain,dc=lan" write by anonymous auth by * none
-
add: olcAccess
olcAccess: {2}to dn.subtree="ou=Computers,dc=domain,dc=lan"
attrs=sambaLMPassword,sambaNTPassword by self write by
dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * none
-
add: olcAccess
olcAccess: {3}to dn.subtree="ou=Users,dc=domain,dc=lan" by
dn=sambaAdmin,dc=domain,dc=lan write
-
add: olcAccess
olcAccess: {4}to dn.subtree="ou=Groups,dc=domain,dc=lan" by
dn=sambaAdmin,dc=domain,dc=lan write
-
add: olcAccess
olcAccess: {5}to dn.subtree="ou=Computers,dc=domain,dc=lan" by
dn=sambaAdmin,dc=domain,dc=lan write
-
add: olcAccess
olcAccess: {6}to dn.subtree="ou=Idmap,dc=domain,dc=lan" by
dn=sambaAdmin,dc=domain,dc=lan write
-
add: olcAccess
olcAccess: {7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan by
dn=sambaAdmin,dc=domain,dc=lan write
-
add: olcAccess
olcAccess: {8}to dn.base="" by * read
-
代码格式具有欺骗性,但您希望将每个 ACL 定义放在从第 0 列开始的单行上,您希望用“-”分隔每个条目,并且您希望确保 ACL 定义末尾没有空格,否则 ldapmodify 将加密字符串。
如果您使用 vi/vim 进行编辑,请使用 :set list 命令显示标点符号(如回车符)并将其删除,并确保行末没有任何空格。完成此操作后,
ldapmodify -v -n -f <path/to/file.ldif>
将如下所示:
add olcAccess:
{0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by * none
add olcAccess:
{1}to dn.subtree="ou=Users,dc=domain,dc=lan"
attrs=sambaLMPassword,sambaNTPassword by self write by
dn="cn=sambaAdmin,dc=domain,dc=lan" write by anonymous auth by * none
add olcAccess:
{2}to dn.subtree="ou=Computers,dc=domain,dc=lan"
attrs=sambaLMPassword,sambaNTPassword by self write by
dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * none
add olcAccess:
{3}to dn.subtree="ou=Users,dc=domain,dc=lan" by
dn=sambaAdmin,dc=domain,dc=lan write
add olcAccess:
{4}to dn.subtree="ou=Groups,dc=domain,dc=lan" by
dn=sambaAdmin,dc=domain,dc=lan write
add olcAccess:
{5}to dn.subtree="ou=Computers,dc=domain,dc=lan" by
dn=sambaAdmin,dc=domain,dc=lan write
add olcAccess:
{6}to dn.subtree="ou=Idmap,dc=domain,dc=lan" by
dn=sambaAdmin,dc=domain,dc=lan write
add olcAccess:
{7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan by
dn=sambaAdmin,dc=domain,dc=lan write
add olcAccess:
{8}to dn.base="" by * read
!modifying entry "olcDatabase={1}mdb,cn=config"
我注意到的另一个问题是您使用了“modify”关键字,如果您要向 LDAP 架构添加新条目或删除条目,则无需使用修改,修改仅在您修改现有条目时使用。我发现修改此类 ACL 组的最简单方法是在我的 LDAP 服务器上打开几个窗口,准备我的新 ACL,使用 -n 开关使用 ldapmodify 测试它们,然后在每个窗口中 su 到 root,删除现有 ACL,然后添加新 ACL。您可以使用如下所示的 LDIF 文件删除所有现有 ACL:
# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
delete: olcAccess
然后运行 ldapmodify
ldapmodify -Y EXTERNAL -H ldapi:/// -f <path/to/acl_delete_file.ldif>
删除它们。运行 ldapmodify 后运行
slapcat -n 0
验证 ACL 是否已被删除,然后运行
ldapmodify -Y EXTERNAL -H ldapi:/// -f <path/to/new_acl_file.ldif>
添加新的 ACL,然后运行
slapcat -n 0
再次验证它们是否已到位。
答案2
另一个更简单的答案是使用 ldapvi 命令来编辑 olcAccess 条目:
ldapvi -h ldapi:// -Y EXTERNAL -b cn=config
它会将所有 cn=config 转储到 VIM 中,让您随意编辑,然后在您保存并退出时为您找出 LDIF。我刚刚添加了另一个 olcAccess: 属性,对现有的属性重新编号,它就可以无缝运行。