OpenLDAP篇-OpenLDAP管理进阶实践03

1、OpenLDAP⽇志管理

1.1 OpenLDAP⽇志介绍

OpenLDAP 使⽤ olcLogLevel 来配置⽇志级别,从⽽控制⽇志记录的详细 程度。⽇志级别可以⽤整数表示,也可以⽤关键字指定。此外多个⽇志级别可以 组合在⼀起使⽤。

以下是 OpenLDAP ⽀持的⽇志级别及其说明:

数值 关键字 说明
-1 any 启用 所有日志(调试模式,可能产生大量日志,慎用)。
0 无日志(默认值,仅记录致命错误)。
1 trace 跟踪函数调用、网络处理等底层操作(极详细,用于开发调试)。
2 packets 记录客户端请求和服务端响应的 协议包详情
4 args 记录客户端请求的 参数信息(如搜索过滤器、属性列表)。
8 conns 记录 连接管理 事件(如连接建立、关闭、会话信息)。
16 BER 记录 BER(基本编码规则)数据包的解析细节(用于协议级调试)。
32 filter 记录搜索过滤器的处理过程(如索引使用情况)。
64 config 记录服务器配置的加载和解析过程。
128 ACL 记录访问控制列表(ACL)的评估细节(权限检查结果)。
256 stats 记录 统计信息(如连接数、操作计数器、响应时间)。
512 stats2 更详细的统计信息(如每个操作的详细指标)。
1024 shell 记录与后端 shell 脚本的交互(如 <font style="color:rgb(64, 64, 64);">slapd-shell</font>后端)。
2048 parse 记录条目解析的详细过程(如 DN 解析、属性验证)。
4096 sync 记录数据同步(Syncrepl)事件(主从同步细节)。

1.2 OpenLDAP⽇志配置

默认情况下,OpenLDAP 使⽤ LOCAL4 设备输出⽇志。因此我们可以借助 rsyslog 来接收这些⽇志,并将其重定向到指定的⽂件。

1、配置 rsyslog ,接收local4设备的所有⽇志,并重新定向到指定的⽂件中

[root@k8s-master31 ~]# echo "local4.* /var/log/ldap.log" >> /etc/rsyslog.conf
[root@k8s-master31 ~]# systemctl restart rsyslog

2、设置OpenLDAP的⽇志级别为记录所有信息( any )。

[root@k8s-master31 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: any
EOF
# 输出
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
# 重启ldap
[root@k8s-master31 ~]# systemctl restart slapd

3、重新修订⽇志级别为 acl、stats ,以避免产⽣过多的冗余信息。

[root@k8s-master31 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: cn=config
changetype: modify
replace: olcLoglevel
olcLogLevel: acl stats
EOF
# 输出
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

2、OpenLDAP访问控制介绍

2.1 什么是访问控制

在 OpenLDAP 中,存储的都是⽤户或密码这样的敏感数据。为了保障这些数据的 访问安全,可以借助 OpenLDAP 的 ACL(访问控制)来设定访问规则。从⽽精 准的控制,谁可以以什么⽅式来访问哪些条⽬的数据,从⽽确保数据访问的安全。

ACL 的核⼼功能在于规则设定,主要包括以下三项:

  • 1、定义需要控制的资源:是整个⽬录、某个组织单元(OU),还是某个具体 ⽤户条⽬?
  • 2、针对资源访问的主体:是管理员、普通⽤户,还是匿名⽤户?
  • 3、赋予的权限:是只读、可修改,还是完全禁⽌访问?

例如:

1、允许⽤户 oldxu 对 ou=ops,dc=oldxu,dc=net ⽬录执⾏读写操作;

2、允许⽤户 zhangsan 对 ou=ops,dc=oldxu,dc=net ⽬录执⾏操作;

3、禁⽌其他⽤户以及匿名⽤户访问该⽬录。

olcAccess to dn.subtree="ou=ops,dc=oldxu,dc=net"
          by dn="uid=oldxu,ou=ops,dc=oldxu,dc=net" write 		# 允许⽤户 oldxu 对资源进⾏读写操作。
          by dn="uid=zhangsan,ou=ops,dc=oldxu,dc=net" read  # 允许⽤户 zhangsan 对资源进⾏只读操作。
          by * none                                         # 禁⽌ 其他⽤户和 匿名⽤户 访问该⽬录资源。

因此,通过访问控制规则,能够限制那些未经授权的⽤户,对条⽬进⾏读写等相关的操作,从⽽保证了数据访问的安全。

2.2 如何定义访问控制

OpenLDAP的访问控制规则是通过 olcAccess 属性定义的,⽽每条访问控制规则,有 3 个主要的组成部分:

olcAccess to <what>
 by <who> <access>
 by <who> <access>
 by ...
  • to :定义需要控制的资源,可以是条⽬、也可以是属性(在图中⽤红⾊框表示)。
  • by :定义资源的访问⽤户或组(在图中⽤绿⾊框表示)。
  • :定义⽤户或组对应的权限(在图中⽤蓝⾊框表示)。

规则⽬标 ( ): 这条规则作⽤于 ou=users,dc=oldxu,dc=net 这个 组织下的所有条⽬。

规则主体 ( )

  • 当前⽤户( self )可以写⼊(也就是 ou=users 下的⽤户可以对⾃⼰的条⽬进⾏写操作)。
  • 普通⽤户 uid=zhangsan,ou=users,dc=oldxu,dc=net 可以写⼊。
  • 管理员组( group="cn=admins,ou=groups,dc=oldxu,dc=net" )可以写⼊。
  • 已认证⽤户( users )可以读取,例如 lisi ⽤户可以读取条⽬信息。
  • 匿名⽤户( anonymous )没有访问权限。

规则按顺序执⾏,匹配到第⼀个符合的规则后会停⽌。

2.3 定义资源what

to 定义了访问控制规则会应⽤到哪些资源上。(也就是具体的条⽬或 属性)。常⻅匹配⽬标有如下⼏类:

  • 整个⽬录树:匹配⽬录中的所有条⽬。
  • 某个条⽬:精确匹配特定的条⽬。
  • 某些属性:仅匹配条⽬中的某些特定属性(如密码字段)。
  • 某些范围的条⽬:⽐如⼀个组织单元(OU)下的所有条⽬。

此外在LDAP 中, to 定义了⼏种具体的匹配规则,⽤于精确匹配需要控制的访问范围。以下是常⻅规则:

  • dn.base: 匹配⼀个特定的条⽬。它只能匹配⽬标条⽬本身,不包括⽬标条⽬下⾯的⼦条⽬。
  • dn.one: 匹配某个条⽬下的⼀级⼦条⽬。但不包括⽬标条⽬本身,也不包括更深层的⼦条⽬。
  • dn.subtree: 匹配某个条⽬及其所有⼦条⽬,包括⽬标条⽬本身,以及所有层级的⼦条⽬。
  • dn.children: 类似 dn.subtree ,但它仅匹配某个条⽬下的⼀级⼦条⽬,及更深层次的所有⼦条⽬(但不包括⽬标条⽬本身)。
  • attrs=匹配条⽬中的某些特定属性,⽽不是整个条⽬。 适⽤于对敏感属性(如密码字段)进⾏细粒度权限控制。

1、授予整个⽬录树( 匹配整个⽬录中的所有条⽬和属性。 )

olcAccess: to *

2、授予某个条⽬

olcAccess: to dn.base="cn=admin,dc=oldxu,dc=net"

3、授予某个ou下⾯的条⽬( 匹配 ou=users,dc=oldxu,dc=net 下的所有⼦条⽬。 )

olcAccess: to dn.subtree="ou=users,dc=oldxu,dc=net"

4、授予某些属性( 匹配条⽬中的 userPassword 属性。 )

olcAccess: to attrs=userPassword

5、授予多个⽬标

olcAccess: to dn.subtree="ou=users,dc=oldxu,dc=net" attrs=userPassword

2.4 定义访问主体who

by ⽤于指定访问资源的主体,也就是具体的⽤户或⽤户组。

  • self :当前⽤户。
  • users :所有已认证⽤户。
  • anonymous :匿名⽤户。
  • dn="" :精准匹配特定⽤户的DN条⽬。
  • group="" :匹配特定的组。

1、当前⽤户( 当前⽤户可以写⼊。 )

by self write

2、已登陆⽤户( 所有已认证⽤户可以读取。 )

by users read

3、匿名⽤户( 匿名⽤户没有权限。 )

by anonymous none

2.5 定义访问权限access

⽤于定义⽤户或⽤户组访问资源的具体权限。

  • manage :完全控制权限(包括读、写、添加、删除、重命名、管理等操作)
  • auth : 允许⽤户在进⾏身份认证时访问特定的属性(例如 userPassword ) ,⽤于⽐对⽤户提交的凭据是否与存储的值匹配。
  • write :允许修改条⽬数据,同时还包含了读取数据的能⼒。
  • read :仅允许读取条⽬数据。
  • none :⽆权限。

1、⽆权限( 匿名⽤户没有任何权限。 )

by anonymous none

2、只读⽤户( 所有已认证⽤户可以读取数据。 )

by users read

3、 当前⽤户可以读写⾃⼰的条⽬。

by self write

4、组合权限( 所有⽤户可以读取数据,但当前⽤户可以写⼊。 )

by users read
by self write

3、OpenLDAP访问控制示例

3.1 配置⽤户能修改⾃⼰的密码

在 Linux 系统中,每个普通⽤户都具备修改⾃⼰密码。但与LDAP集成后,⽤户和密码是存储在 LDAP 服务中的,这意味着修改密码实际上是在修改 LDAP 中⽤户条⽬的属性字段。默认情况下,LDAP 出于安全性考虑,不允许普通⽤户修改这些字段,因此⽤户⽆法直接更改⾃⼰的密码。

[dba01@k8s-node34 ~]$ passwd
更改用户 dba01 的密码 。
当前密码:
新的密码:
重新输入新的密码:
passwd: 鉴定令牌操作错误

为了解决这⼀问题,我们可以配置 ACL 规则,赋予⽤户对其⾃身的密码字段,拥有修改权限,同时确保它们⽆法访问或修改其他⽤户的密码字段。这样既满⾜了功能需求,⼜保障了系统的安全性。

1、配置ACL规则,使普通⽤户可以修改⾃⼰的密码。

[root@k8s-master31 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to attr=userPassword
  by self write
  by anonymous auth
  by * none
EOF
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}mdb,cn=config"
# attrs=userPassword 明确指明对应的属性字段。
# by self write:允许⽤户⾃⼰修改⾃⼰的密码。
# by anonymous auth:允许匿名⽤户进⾏密码认证,也就是匿名⽤户能正常⽐对密码是否正确(但不能读取密码)。
# by * none:禁⽌其他⽤户访问密码字段。

2、测试能否更新密码

[dba01@k8s-node34 ~]$ passwd
更改用户 dba01 的密码 。
当前密码:
新的密码:
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。

3.2 为⽤户授予OU管理员权限

将 ou=dev,dc=oldxu,dc=net 这个组织单元的管理员权限分配给 dev-admins ⽤户,允许其在该 OU 下执⾏创建、修改和删除等操作。

1、在 dev 的OU下⾯创建 dev-admins ⽤户,密码 123456 (这个⽤户放在哪个OU下都可以)

[root@k8s-master31 ~]# ldapadd -x -D cn=admin,dc=oldxu,dc=net -w 123456 <<EOF
dn: uid=dev-admins,ou=dev,dc=oldxu,dc=net
objectClass: inetOrgPerson
uid: dev-admins
cn: dev-admins
sn: Dev OU Admins
mail: dev-admins@qq.com
userPassword: 123456
EOF
adding new entry "uid=dev-admins,ou=dev,dc=oldxu,dc=net"

2、添加ACL规则,使 dev-admins 能够拥有 ou=dev,dc=oldxu,dc=net 组织单元的管理权限。

  • 第⼀条ACL规则:赋予 dev-admins ⽤户对 ou=dev 条⽬及其⼦条⽬拥有管理权限。
  • 第⼆条ACL规则:允许所有已登录的⽤户( users )查看 dc=oldxu,dc=net 整个⽬录树。如不配置此规则,使⽤客户端⼯具可能⽆法正常浏览⽬录树。
ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to dn.subtree="ou=dev,dc=oldxu,dc=net"
  by dn.exact="uid=dev-admins,ou=dev,dc=oldxu,dc=net" write
  by users read
  by * none
-
add: olcAccess
olcAccess: to dn.subtree="dc=oldxu,dc=net"
  by users read
  by * none
EOF

3、使⽤phpLDAPadmin进⾏权限验证

3.3 为⽤户组授予管理员权限

创建⼀个“管理员组”,并为组内的成员授予“⽬录树的管理权限”。

  • 1、创建⼀个名为 Admins 的管理员组,使⽤ groupOfNames 对象类。
  • 2、将现有⽤户 sre01 和 oldxu 添加到该组。
  • 3、配置 ACL 规则,使该组的成员对⽬录树 dc=oldxu,dc=net 拥有管理员权限。

1、使⽤ groupOfNames ⽅式在 ou=dev 下创建 Admins 管理员组,并将 sre01、oldxu ⽤户添加⾄该组;

[root@k8s-master31 ~]# ldapadd -x -D cn=admin,dc=oldxu,dc=net -w 123456 <<EOF
dn: cn=Admins,ou=dev,dc=oldxu,dc=net
objectClass: groupOfNames
cn: Admins
member: uid=oldxu,cn=admins,ou=ops,dc=oldxu,dc=net
member: uid=sre01,cn=sreteam,ou=ops,dc=oldxu,dc=net
EOF
adding new entry "cn=Admins,ou=dev,dc=oldxu,dc=net"

2、添加ACL规则,使 Admins 组成员具有管理权限。

  • 第⼀条ACL规则:之前配置的 ACL 规则可能会⼲扰新的规则匹配,需要先移除针对 dc=oldxu,dc=net 的旧规则。
  • 第⼆条ACL规则: 为 Admins 组成员授予对整个⽬录树的写⼊权限,同时保持其他⽤户的读取权限。
ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
delete: olcAccess
olcAccess: {2}
-
add: olcAccess
olcAccess: to dn.subtree="dc=oldxu,dc=net"
 by group="cn=Admins,ou=dev,dc=oldxu,dc=net" write
 by users read
 by * none
EOF

3、使⽤管理组中的 oldxu ⽤户,添加新的⽤户,验证是否能成功添加。

[root@k8s-master31 ~]# ldapadd -x -D uid=oldxu,cn=admins,ou=ops,dc=oldxu,dc=net -w 123456 << EOF
dn: cn=test_user1,ou=ops,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: test_user1
sn: test_user1
userPassword: test_user1
EOF
adding new entry "cn=test_user1,ou=ops,dc=oldxu,dc=net"


# 如果上面执行报错,权限补充
ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to dn.subtree="ou=ops,dc=oldxu,dc=net"
  by dn.exact="uid=oldxu,cn=admins,ou=ops,dc=oldxu,dc=net" write
  by users read
  by * none
EOF

4、OpenLDAP属性memberOf

4.1 为何需要memberOf

在使⽤ LDAP 对接 GitLab、Jenkins 等应⽤的场景中, LDAP 当中的⽤户条⽬可以直接登录对应的应⽤系统。⾄于登录上的⽤户拥有什么权限,则取决于“应⽤的权限管理机制”。在⼤多数情况下,应⽤的权限管理是基于 组(group)来进⾏分配的。

例如: zhangsan 是 gitlab-admin 组的成员,并且我们在 GitLab 中为gitlab-admin 组分配了管理员权限,那么当 zhangsan 登录时,GitLab 会查询该⽤户的属性,并从中获取⽤户所属的组信息,以此判断⽤户的权限。如果确认他属于 gitlab-admin 组, zhangsan 就会被授予管理员权限;否则他将⽆法获得相应的权限。也就是说,⽤户是否属于某个组,决定了它能拥有什么权限,以及可访问的资源。

但这种权限管理的⽅式,必须要求“⽤户对象能够直接提供其所属的组信息”才能实现。但 LDAP 默认并不会在⽤户条⽬中直接存储所属的组信息,⽽是将这种关系存储在组的条⽬中。也就是说,LDAP中的组条⽬会记录它的成员是谁,但⽤户条⽬本身并不包含任何所属的组信息。这种设计使得我们的应⽤程序⽆法通过查询⽤户条⽬来判断其所属组,从⽽难以完成权限判断。因此想要将⽤户所属的组

信息直接存储在“⽤户条⽬中”,则需要引⼊ memberOf 属性来实现。

4.2 什么是memberOf

memberOf 属性可以在⽤户条⽬中直接记录其所属的所有组信息。 然⽽, memberOf 并⾮ LDAP 核⼼ schema 中的属性,⽽是由 memberof overlay 来提供⽀持。该 overlay 实现了如下两个功能:

  • 1、⾃动在⽤户条⽬中添加 memberOf 属性,⽤于记录⽤户所属的所有组信息。
  • 2、如果⽤户被添加到某个组, memberof overlay 会更新该⽤户条⽬中memberOf 属性(也就是增加组的信息)

然⽽, memberof overlay 存在如下两个功能缺陷:

  • 1、组被删除时: memberof overlay 不会清理⽤户对象中已存在的 memberOf 属性,这可能导致⽤户条⽬保留⽆效的组信息。
  • 2、组被重命名时: memberof overlay ⽆法更新⽤户对象中 memberOf 属性,会导致数据不⼀致。

为了解决这些问题,需要借助 refint overlay 来保障引⽤的完整性。 refint overlay 提供以下功能:

  • 1、当组被删除时, refint overlay 会⾃动移除⽤户对象中对应的 memberOf 属性,确保⽤户条⽬中不再保留过期的组信息。
  • 2、当组被重命名时, refint overlay 会⾃动更新⽤户对象中的 memberOf 属性,使组名变更能够正确的反映在⽤户条⽬中,避免数据不⼀致。

通过结合 memberof overlay 和 refint overlay ,可以实现⽤户与组的动态维护,并在组删除、重命名等复杂场景下保障数据的⼀致性和完整性。

5、OpenLDAP启⽤meberOf

  • 1、加载memberof、refint模块;
  • 2、将 memberof overlay、refint overlay应⽤到数据库当中;
  • 3、创建⽤户,并将⽤户加⼊到组中,然后验证⽤户,是否能通过⽤户条⽬当中的属性,获取到对应⽤户的所属组信息;

5.1 加载memberof和refint模块

ldapadd -Y EXTERNAL -H ldapi:/// <<EOF
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModuleLoad: memberof.la
olcModuleLoad: refint.la
olcModulePath: /usr/lib64/openldap
EOF

2、 如果 cn=module{0},cn=config 条⽬已存在(即模块信息已创建),则通过如下⽅式添加 memberof 和 refint 模块。

ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: memberof.la
-
add: olcModuleLoad
olcModuleLoad: refint.la
-
add: olcModulePath
olcModulePath: /usr/lib64/openldap
EOF

3、检查模块是否加载成功

ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" -LLL -Q "(objectClass=olcModuleList)"
# 输出
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModuleLoad: {0}memberof.la
olcModuleLoad: {1}refint.la
olcModulePath: /usr/lib64/openldap

5.2 加载memberof 配置⾄数据库

1、 memberof overlay 是⼀种扩展功能模块,需要加载到数据库中才能⽣效。

ldapadd -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcOverlay={0}memberof,olcDatabase={2}mdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
EOF

如上配置字段说明:

  • olcOverlay: memberof 指定该 overlay 的类型为 memberof 。
  • olcMemberOfDangling: ignore 设定当组条⽬不存在时的⾏为: ignore :忽略⽆效的组引⽤; drop :拒绝操作。
  • olcMemberOfRefInt: TRUE 启⽤refint。当删除组或重命名组时,会同步更新⽤户条⽬中的 memberOf 属性,避免数据不⼀致。
  • olcMemberOfGroupOC: groupOfNames 指定组条⽬使⽤的对象类,这⾥是 groupOfNames (常⽤的组对象类)。
  • olcMemberOfMemberAD: member 指定组条⽬中记录成员的属性,这⾥是 member 属性。
  • olcMemberOfMemberOfAD: memberOf 指定⽤户条⽬中记录所属组的属性,这⾥是 memberOf 属性。

3、验证配置memberof overlay

[root@k8s-master31 ~]# ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" -LLL -Q "(olcOverlay=memberof)"
dn: olcOverlay={0}memberof,olcDatabase={2}mdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOfConfig
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf

5.3 加载refint配置⾄数据库

1、加载 refint overlay 到数据库中。

ldapadd -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcOverlay={1}refint,olcDatabase={2}mdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
# 启⽤refint
olcOverlay: refint
# 指定需要维护引⽤完整性的属性列表,当这些属性的⽬标对象被修改或删除时,refint会⾃动更新引⽤这些对象的条⽬,从⽽保持数据⼀致性。
olcRefintAttribute: memberof member manager owner
EOF

2、验证结果

[root@k8s-master31 ~]# ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" -LLL -Q "(olcOverlay=refint)"
dn: olcOverlay={1}refint,olcDatabase={2}mdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof member manager owner

5.4 测试并验证memberof

1、使⽤ groupOfNames 在 ou=dev 下⾯创建 Test 组,并通过 member 属性将 oldxu,sre01 ⽤户加⼊组中。

ldapadd -x -D cn=admin,dc=oldxu,dc=net -w 123456 << EOF
dn: cn=Test,ou=dev,dc=oldxu,dc=net
objectClass: groupOfNames
cn: Test
member: uid=oldxu,cn=admins,ou=ops,dc=oldxu,dc=net
member: uid=sre01,cn=sreteam,ou=ops,dc=oldxu,dc=net
EOF

3、检查oldxu、sre01的⽤户是否存在memberof属性,并且对应的值是组的完整 DN;

[root@k8s-master31 ~]# ldapsearch -x -LLL -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "uid=oldxu,cn=admins,ou=ops,dc=oldxu,dc=net" memberOf
dn: uid=oldxu,cn=admins,ou=ops,dc=oldxu,dc=net
memberOf: cn=Test,ou=dev,dc=oldxu,dc=net


[root@k8s-master31 ~]# ldapsearch -x -LLL -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "uid=sre01,cn=sreteam,ou=ops,dc=oldxu,dc=net" memberOf
dn: uid=sre01,cn=sreteam,ou=ops,dc=oldxu,dc=net
memberOf: cn=Test,ou=dev,dc=oldxu,dc=net
posted @ 2025-08-15 14:36  broadviews  阅读(126)  评论(0)    收藏  举报