LDAP添加 memberOf 模块

ldap的group是一种单独的类型objectClass: groupOfNames, 有个字段叫做member, value就是entry的dn。如此,实现了group-user的映射关系。

  • group添加member的时候会自动给对应的entry添加memberof字段
  • 当删除entry的时候,也会从group里删除member字段

注意:

  • cn=module 的名称请查看ls -l /etc/ldap/slapd.d/cn=config/ |grep module 如果没有直接写module ,Docker中默认为module{0};
  • olcDatabase={2}hdb 请确认ls -l /etc/ldap/slapd.d/cn=config/ |grep olcDatabase 的名称,docker中默认的为{1}mdb,Centos rpm 安装默认为{2}hdb。
  • /usr/lib/ldap 为ldap 模块路径,不同系统的路径不同,Centos 的默认路径为/usr/lib64/openldap ,Ubuntu 系统下的默认路径为/var/lib/ldap

添加 memberOf 模块(每个节点都要添加)

添加 add_module_group.ldif 文件 (在不知道memberof.la文件在什么位置时:find / -name memberof.la)

cat >add_module_group.ldif << EOF
# Load memberof module
dn: cn=module,cn=config
cn: module
objectClass: olcModuleList
olcModulePath: /usr/lib/ldap

dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: memberof.la
EOF

应用ldap 配置

# master 节点
docker cp add_module_group.ldif ldap-master01:/
docker exec ldap-master01 ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /add_module_group.ldif

# slave 节点
docker cp add_module_group.ldif  ldap-slave01:/
docker exec ldap-slave01 ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /add_module_group.ldif
adding new entry "cn=module,cn=config"

modifying entry "cn=module{0},cn=config"

修改配置

ldapmodify -c -Q -Y EXTERNAL -H ldapi:/// -f /add_module_group.ldif

然后使用以下命令验证是否添加成功。

$ docker exec ldap-master01 slapcat -b cn=config | grep olcModuleLoad

olcModuleLoad: {0}back_mdb
olcModuleLoad: {1}memberof
olcModuleLoad: {2}refint
olcModuleLoad: {3}syncprov
olcModuleLoad: {4}syncprov.la
olcModuleLoad: {5}memberof.la
$ docker exec ldap-master01 slapcat -b cn=config | grep olcModulePath
olcModulePath: /usr/lib/ldap
olcModulePath: /usr/lib64/openldap
olcModulePath: /usr/lib64/openldap
olcModulePath: /usr/lib64/openldap
olcModulePath: /var/lib/ldap
olcModulePath: /var/lib/ldap
olcModulePath: /var/lib/ldap
olcModulePath: /usr/lib/ldap
olcModulePath: /usr/lib/ldap

增加 objectClass 支持

添加 add_group_objectClass.ldif 文件,增加 objectClass 支持

cat >add_group_objectClass.ldif << EOF
dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member     
olcMemberOfMemberOfAD: memberOf

dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: cn eq,sub
EOF

# Backend memberOf overlay
dn: olcOverlay={0}memberof,olcDatabase={1},cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcMemberOf
olcOverlay: {0}memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf

应用 ldap 配置

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add_group_objectClass.ldif Docker

# master 节点
docker cp add_group_objectClass.ldif ldap-master01:/
docker exec ldap-master01 ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /add_group_objectClass.ldif

# slave 节点
docker cp add_group_objectClass.ldif ldap-slave01:/
docker exec ldap-slave01 ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /add_group_objectClass.ldif
adding new entry "olcOverlay=memberof,olcDatabase={1}mdb,cn=config"

modifying entry "olcDatabase={1}mdb,cn=config"