kos*_*tix -1 openldap access-control-list
我需要为我的数据库添加一堆 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
Run Code Online (Sandbox Code Playgroud)
我目前对我的 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
Run Code Online (Sandbox Code Playgroud)
由于我将数据库设置为用作 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
Run Code Online (Sandbox Code Playgroud)
不幸的是,LDIF 通过了语法检查 ( ldapmodify -n -v <path/to/file.ldif
),错误消息确实无济于事。
无论如何请帮我修复我的 LDIF 以被接受slapd
?或者向我解释一种配置它的方法(或者ldapmodify
可能是?)更详细地说明这个错误的真正原因?
小智 5
ldapmodify 就文件的有效性向您撒谎。如果您使用您创建的 LDIF 文件并运行
ldapmodify -v -n -f <path/to/file.ldif>
Run Code Online (Sandbox Code Playgroud)
输出如下所示:
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"
Run Code Online (Sandbox Code Playgroud)
请注意所有 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
-
Run Code Online (Sandbox Code Playgroud)
代码格式具有欺骗性,但您希望将每个 ACL 定义放在从第 0 列开始的一行中,您希望用“-”分隔每个条目,并且您希望确保 ACL 定义没有末尾的空格或 ldapmodify 将加密字符串。
如果您使用 vi/vim 进行编辑,请使用 :set list 命令显示回车等标点符号并删除它们,并确保行尾没有任何空格。完成此操作后,输出
ldapmodify -v -n -f <path/to/file.ldif>
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
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"
Run Code Online (Sandbox Code Playgroud)
我注意到的另一个问题是您使用了“修改”关键字,如果您向 LDAP 架构添加新条目或删除不需要使用修改的条目,则修改仅在您修改现有条目时使用。我发现像这样修改一组 ACL 的最简单方法是在我的 LDAP 服务器上打开几个窗口,准备我的新 ACL,使用 -n 开关使用 ldapmodify 测试它们,然后在每个窗口中 su 到 root ,删除现有的 ACL,然后添加新的 ACL。您可以使用如下所示的 LDIF 文件删除所有现有 ACL:
# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
delete: olcAccess
Run Code Online (Sandbox Code Playgroud)
然后运行 ldapmodify
ldapmodify -Y EXTERNAL -H ldapi:/// -f <path/to/acl_delete_file.ldif>
Run Code Online (Sandbox Code Playgroud)
删除它们。运行 ldapmodify 后运行
slapcat -n 0
Run Code Online (Sandbox Code Playgroud)
验证 ACL 是否已被删除,然后运行
ldapmodify -Y EXTERNAL -H ldapi:/// -f <path/to/new_acl_file.ldif>
Run Code Online (Sandbox Code Playgroud)
添加新的 ACL,然后运行
slapcat -n 0
Run Code Online (Sandbox Code Playgroud)
再次验证它们是否就位。
小智 5
另一个更简单的答案是使用 ldapvi 命令来编辑 olcAccess 条目:
ldapvi -h ldapi:// -Y EXTERNAL -b cn=config
Run Code Online (Sandbox Code Playgroud)
它将所有 cn=config 转储到 VIM 中,让您在闲暇时编辑它,然后在您保存和退出时为您找出 LDIF。我刚刚添加了另一个 olcAccess: 属性,对现有属性重新编号,并且它无缝地工作。
归档时间: |
|
查看次数: |
16484 次 |
最近记录: |