如何正确地将一组 olcAccess 属性插入到 OpenLDAP 数据库的配置中?

如何正确地将一组 olcAccess 属性插入到 OpenLDAP 数据库的配置中?

我需要为我的数据库添加一堆 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。

我想要实现的目标可以这样表述:

  • sambaLMPasswordsambaNTPasswordSAMBA 特定的属性(在类的条目上可用)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: 属性,对现有的属性重新编号,它就可以无缝运行。

相关内容