我需要为我的数据库添加一堆ACL,但是很难为其编写适当的LDIF。 不幸的是, ldapmodify对于无用的错误信息并不是很有帮助:
modifying entry "olcDatabase={1}mdb,cn=config" ldap_modify: Other (eg, implementation specific) error (80) additional info: <olcAccess> handler exited with 1
我目前对我的MDB数据库有一个非常基本的configuration(它是由Debian软件包configuration器为slapd软件包创build的版本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的身份validation后端,数据库模式已更新为包含特定于SAMBA的types和属性,现在我想相应地收紧数据库上的ACL。
我想要完成的事情可以这样说:
sambaLMPassword和sambaNTPassword特定于SAMBA的属性(在posixAccount类的条目上可用)应该只能由它们各自的所有者(即自己)读取/修改。 dn=sambaAdmin,dc=domain,dc=lan ,SAMBA本身和smbldap-tools使用该用户来pipe理数据库中特定于SAMBA的用户。 它应该被授予完全访问DIT中的一组SAMBA特定的OU。 我希望我的ACL条目在当前configuration的规则{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接受? 或者给我解释一下configuration它的方法(或者ldapmodify可能是?),这个错误的真正原因是什么?
ldapmodify向你说谎你的文件的有效性。 如果你把你创build和运行的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如何被卡在一起? 这是因为你在每个条目之间没有“ – ”。 出于某种原因,ldapmodify在干运行模式下使用“-n”开关运行时会传递此文件,但在您实际尝试实施时会失败。 你应该改变你的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会encryptionstring。
如果使用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"
我注意到的另一个问题是,如果要向LDAP模式添加新条目或删除不需要使用修改的条目,则使用“修改”关键字,修改仅在修改现有条目时使用。 我发现修改一组ACL的最简单方法是在LDAP服务器上打开几个窗口,准备新的ACL,使用-n开关用ldapmodify进行testing,然后在每个窗口,删除现有的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
validationACL已被删除,然后运行
ldapmodify -Y EXTERNAL -H ldapi:/// -f <path/to/new_acl_file.ldif>
添加新的ACL,然后运行
slapcat -n 0
再次validation它们是否到位。