OpenLDAP 系列7 --- memberof & refint
一、概念
1. 承上启下
2. 应用场景
设想一下,一家互联网公司有以下团队:
IT团队负责维护各种硬件,他们有权限给任何服务器打补丁,他们拥有系统最高权限,但是对于数据库他们没有访问权限;
OPS团队负责上线部署,他们掌管线上环境的读写权限(包括数据库),但他们对开发环境不屑一顾;
开发团队负责开发并将代码部署至开发环境,但他们没有访问线上环境的权限,或者仅有只读权限。
我们可以通过在LDAP中设置不同的组来满足这种权限划分,我们可以创建IT Group,OPS Group和Engineer Group并未不同的组赋予不同的权限,当不同环境的不同系统进行鉴权的时候就可以利用当前登录者的所属组进行授权。我们最好还要有自动更新机制,比如我们修改了一个员工的dn,我们希望与他相关的Group能动态做出更新。
IT Group: cn=IT,ou=Group,dc=example,dc=com
dn: cn=IT,ou=Group,dc=example,dc=com
objectclass: groupOfNames
cn: IT
OPS Group: cn=OPS,ou=Group,dc=example,dc=com
dn: cn=OPS,ou=Group,dc=example,dc=com
objectclass: groupOfNames
cn: OPS
Engineer Group: cn=Engineer,ou=Group,dc=example,dc=com
dn: cn=Engineer,ou=Group,dc=example,dc=com
objectclass: groupOfNames
cn: Engineer
3. Overlays
Overlays是Open LDAP的一种软件功能模块,它通过给其他功能提供一些钩子(Hook)来实现类似backend的功能。
标题中提到的memberof和refint都是一种Overlay。
4. memberof
Member是连接Group和Entry的桥梁。
继续我们上面提到的需求场景,我们把所有员工创建在"ou=People,dc=example,dc=com"这个DN之下,然后将员工的Entry添加到不同Group下。
dn: ou=People,dc=example,dc=com objectclass: organizationalUnit ou: People
dn: uid=zhangsan,ou=People,dc=example,dc=com
objectclass: account
uid: zhangsan
dn: cn=IT,ou=Group,dc=example,dc=com
objectclass: groupOfNames
cn: IT
member: uid=zhangsan,ou=People,dc=example,dc=com
5. refint
全称是Referential Integrity,可以理解为“引用一致性”,它用于支持动态更新。
在配置memberof的时候,我们会有以下一条配置:
olcMemberOfRefInt: TRUE
该行配置会启用Referential Integrity。
当配置refint之后,我们将zhangsan删除,或者将张三的dn改为“uid=lisi,ou=People,dc=example,dc=com”,那么Group “cn=IT,ou=Group,dc=example,dc=com”内的member属性会被动态更新。
二、准备
1. 查看已启用的模块:
sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config | grep -i module
如果没有配置过任何module,则会显示:
2. 查看安装路径
sudo find / -iname memberof.la
目录为:
/usr/lib64/openldap/memberof.la
另一个我们要配置的refint.la位于:
/usr/lib64/openldap/refint.la
三、配置
1. memberof
(1) 新建module4memberof.ldif文件:
vi ~/ldap/module4memberof.ldif
(2) 初始化内容
dn: cn=module,cn=config
cn: module
objectClass: olcModuleList
olcModuleLoad: memberof.la
olcModulePath: /usr/lib64/openldap
(3) 添加模块
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f module4memberof.ldif
(4) 校验
sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config | grep -i module
2. 将memberof配置到数据库
(1) 查询数据库配置,本文使用的数据库为mdb
sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config olcDatabase | grep mdb
(2) 创建overlay4memberof.ldif
vi ~/ldap/overlay4memberof.ldif
(3) 初始化内容
dn: olcOverlay=memberof,olcDatabase={3}mdb,cn=config objectClass: olcMemberOf objectClass: olcOverlayConfig objectClass: olcConfig objectClass: top olcOverlay: memberof olcMemberOfRefInt: TRUE olcMemberOfDangling: ignore olcMemberOfGroupOC: groupOfNames olcMemberOfMemberAD: member olcMemberOfMemberOfAD: memberOf
(4) 添加配置
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f overlay4memberof.ldif
3. refint
(1) 创建module4refint.ldif
vi ~/ldap/module4refint.ldif
(2) 初始化内容
dn: cn=module{0},cn=config changetype: modify add: olcModuleLoad olcModuleLoad: refint.la
(3) 更新配置
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f module4refint.ldif
(4) 校验
sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config | grep -i module
或者:
sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=module{0},cn=config
4. 配置Group和Member
此外,我个人强烈建议使用PHPLDAPAdmin添加Group,Member和它们之间的关系,这样容易的多。
5. 测试
(1) 查看Group的member属性:
ldapsearch -H ldapi:/// -Y EXTERNAL -LLL -b "ou=Group,dc=example,dc=com" cn=vpn
(2) 查看所有成员的memberof属性:
ldapsearch -H ldapi:/// -Y EXTERNAL -LLL -b "ou=People,dc=lionlea,dc=com" memberOf
(3) 查看成员的memberof属性:
ldapsearch -H ldapi:/// -Y EXTERNAL -LLL -b "uid=<<用户名>>,ou=People,dc=example,dc=com" memberOf
四、参考
https://www.openldap.org/doc/admin24/overlays.html#Reverse%20Group%20Membership%20Maintenance