![访问权限不足 (50) LDAP](https://linux22.com/image/792625/%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90%E4%B8%8D%E8%B6%B3%20(50)%20LDAP.png)
我尝试在 OpenLDAP 服务器启动之初执行自定义 .ldif 文件,并使用以下命令成功执行:
ldapadd -x -D cn=admin,dc=vlad,dc=lan -w admin -H ldap:// -f ldap/ldap-test.ldif
遗憾的是,我希望能够使用以下命令将自定义属性和对象类添加到模式中:
dn: cn=schema,cn=config
changetype: modify
add: olcObjectClasses
olcObjectClasses: ( 1.2.3.4.5.6.7.8.9.0 NAME 'myCustomObjectClass'
DESC 'My Custom Object Class'
AUXILIARY
MAY ( customAttribute1 $ customAttribute2 $ customAttribute3 $
customAttribute4 $ customAttribute5 $ customAttribute6 $
customAttribute7 $ customAttribute8 $ customAttribute9 $
customAttribute10 $ customAttribute11 $ customAttribute12 $
customAttribute13 $ customAttribute14 $ customAttribute15 ) )
不幸的是,它抛出了访问不足 50 错误。这是 slapcat -n0 的输出
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth manage by * break
olcRootDN: cn=admin,cn=config
structuralObjectClass: olcDatabaseConfig
entryUUID: 3e49b716-55fd-103e-8582-a14a85261557
creatorsName: cn=config
createTimestamp: 20240202095739Z
olcRootPW:: e1NTSEF9d3J4NGVYaUFvaGRmc2dDOXlqT0V0cEFmSWhZYklxWXo=
entryCSN: 20240202095739.321947Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20240202095739Z
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=vlad,dc=lan
olcLastMod: TRUE
olcRootDN: cn=admin,dc=vlad,dc=lan
olcRootPW:: -----
olcDbCheckpoint: 512 30
olcDbMaxSize: 1073741824
structuralObjectClass: olcMdbConfig
entryUUID: 3e49fae6-55fd-103e-8589-a14a85261557
creatorsName: cn=admin,cn=config
createTimestamp: 20240202095739Z
olcDbIndex: uid eq
olcDbIndex: mail eq
olcDbIndex: memberOf eq
olcDbIndex: entryCSN eq
olcDbIndex: entryUUID eq
olcDbIndex: objectClass eq
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth manage by * break
olcAccess: {1}to attrs=userPassword,shadowLastChange by self write by dn="cn
=admin,dc=vlad,dc=lan" write by anonymous auth by * none
olcAccess: {2}to * by self read by dn="cn=admin,dc=vlad,dc=lan" wri
te by dn="cn=user-ro,dc=vlad,dc=lan" read by * none
entryCSN: 20240202095739.438344Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20240202095739Z
我怎样才能使用 ldapadd 或 ldapmodify 运行上述命令?需要对哪个用户进行身份验证。
更新:
dn: cn=schema,cn=config changetype: modify add: olcObjectClasses olcObjectClasses: ( 1.2.3.4.5.6.7.8.9.0 NAME 'myCustomObjectClass' DESC 'My Custom Object Class' AUXILIARY MAY ( name ) )
使用上述代码和命令:ldapmodify -Y EXTERNAL -H ldapi:// -f ldap/ldap-modify.ldif
一切看上去都很好,应该添加。
尝试使用该类:
dn: OU=CustomOU,DC=vlad,DC=lan
ou: CustomOU
objectClass: top
objectClass: organizationalUnit
objectClass: myCustomObjectClass
使用命令它说:
ldapadd -x -D cn=admin,dc=vlad,dc=lan -w admin -H ldap:// -f ldap/ldap-test.ldif
additional info: objectClass: value #2 invalid per syntax
并且在检查 slapcat -n0 时,似乎没有添加自定义对象。
答案1
您有两个独立的数据库(“cn=config”数据库和“普通”数据库),您需要记住它们配置了不同的访问策略。
该 DNcn=admin,dc=vlad,dc=lan
被列为“普通”数据库的根 DN仅有的– 它不会自动获得其他数据库的“root”权限 – 并且属性olcAccess
同样是针对每个数据库设置的,仅在“正常”数据库上授予此 DN 一些权限(并且是冗余的),而“配置”数据库没有任何这些访问权限。
因为您要尝试修改 下的条目..., cn=config
,所以您必须首先查看“olcDatabase={0}config”的配置。它具有完全不同的 olcRootDN 用于“超级用户”访问(密码可能相同,也可能不同),并且其 olcAccess 属性仅授予对本地 UID 识别连接的完全访问权限 –不是到您当前尝试绑定(登录)的 DN。
因此你有两个选择:
或者绑定
cn=admin,cn=config
为此数据库的 rootDN(假设您知道密码):ldapmodify -x -D cn=admin,cn=config ...
或者建立由您的 Linux UID 标识的本地连接(然后通过 olcAccess 授予访问权限)。访问列表指定 uidNumber=0,即 root,因此您需要“sudo”整个操作。
sudo ldapmodify -H ldapi:// -Y EXTERNAL ...
请注意,在这种情况下没有
-x
或-D
;而是使用带有-Y
选项的SASL bind。URLldapi://
将通过本地 Unix 套接字连接,从而允许基于 UID 的身份验证工作。(如果是 TCP 连接,则 EXTERNAL 意味着 mTLS 客户端证书身份验证,这不是您在这里所需要的。)这与 Postgres 以及最近的 MariaDB 的工作方式类似(例如在 Debian 上,执行此操作
sudo mariadb
将立即以 MariaDB 根用户身份连接)。