一、概念
设想一下,一家互联网公司有以下团队:
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
1. Overlays
Overlays是Open LDAP的一种软件功能模块,它通过给其他功能提供一些钩子(Hook)来实现类似backend的功能。
我们标题中提到的Member和Referential都是一种Overlay。
2. 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
3. refint
全称是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. 查看安装路径
find / -iname memberof.la
目录为:
/usr/lib64/openldap/memberof.la
另一个我们要配置的refint.la位于:
/usr/lib64/openldap/refint.la
3. 工作目录
cd ~/OpenLDAP
三、配置
1. memberof
(1) 新建module4memberof.ldif文件:
vi 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 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 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
4. 配置Group和Member
(1) 添加数据
使用LDAP命令方式添加Group的过程在之前https://www.cnblogs.com/eagle6688/p/15978344.html中有提及,不再赘述。
我个人强烈建议使用PHPLDAPAdmin UI添加Group,Member和它们之间的关系,这样容易的多。
需要提醒的是,针对不同的角色,我建议使用以下ObjectClass:
二层:organizationalRole
Group:groupOfNames
People:inetOrgPerson
Server: device + ipHost + shadowAccount
(2) 检验memberof属性,
sudo 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
https://kifarunix.com/how-to-create-openldap-member-groups/
标签:refint,cn,memberof,dc,---,Group,ou,com,example From: https://www.cnblogs.com/eagle6688/p/16990393.html