主要参考文章
1、https://www.openldap.org/lists/openldap-technical/201103/msg00212.html
2、ttps://serverfault.com/questions/996712/openldap-group-how-to-create-a-group-object-with-both-member-and-memberuid-attr
3、https://mlog.club/article/4222504
4、https://packages.debian.org/stretch/all/gosa-schema/filelist
按我自己的理解,openldap中继承类时可以有多个Auxiliary objectClass,但是只能有一个Structural objectClass
而groupOfUniqueNames和posixGroup在某些版本中都是Structural objectClass,因此不能共存,
解决办法是将posixGroup改为Auxiliary objectClass,网上提供的方法是用rfc2307bis.ldif替换nis.ldif
和上一篇笔记一样,网上说有的Linux发行版本openldap提供的posixGroup已用rfc2307bis.ldif替换nis.ldif
(备注:https://ldapwiki.com/wiki/PosixGroup中清晰地标识为AUXILIARY,可能新版本中改了吧)
还是先测试一下,看看有没有惊喜
一、测试,在上一篇笔记中增加组的定义时加一行objectClass: posixGroup,结果出错,还是没有惊喜,debian9还是太保守
root@mydebian207:~# cat > ~/add_group2_default_unique.ldif << EOF
> dn: cn=testgroup2,ou=web_ftp_groups,dc=mydebian210,dc=mydomain,dc=net
> objectClass: groupOfUniqueNames
> objectClass: posixGroup
> cn: testgroup2
> description: testgroup2
> uniqueMember: uid=testuser,ou=web_ftp_users,dc=mydebian210,dc=mydomain,dc=net
> EOF
root@mydebian207:~# ldapadd -x -D cn=admin,dc=mydebian210,dc=mydomain,dc=net -w "secret_password" -f ~/add_group2_default_unique.ldif
adding new entry "cn=testgroup2,ou=web_ftp_groups,dc=mydebian210,dc=mydomain,dc=net"
ldap_add: Object class violation (65)
additional info: invalid structural object class chain (groupOfUniqueNames/posixGroup)
二、取得rfc2307bis.ldif文件
debian保守是为了稳定,这是我喜欢debian的主要原因,
另一个原因就是巨量的软件库,平时用不上,关键时刻就会少操心
网上提供了很多网址下载rfc2307bis,也许太多了反而不放心,我在https://packages.debian.org/中搜索了一下
搜索软件包的内容
关键字: rfc2307bis.schema
路径结尾是关键字
发行版:oldstable
文件 软件包
/etc/ldap/schema/fusiondirectory/rfc2307bis.schema fusiondirectory-schema [除 powerpc]
/etc/ldap/schema/gosa/rfc2307bis.schema gosa-schema
搜索软件包的内容
关键字: rfc2307bis.ldif
路径结尾是关键字
发行版:oldstable
文件 软件包
/etc/ldap/schema/gosa/rfc2307bis.ldif gosa-schema
/usr/share/dirsrv/data/10rfc2307bis.ldif 389-ds-base [除 powerpc]
明显gosa-schema就是要找的包,安装gosa-schema
root@mydebian210:~# apt install gosa-schema
三、按参考文章3中的方法进行替换
root@mydebian210:~# rm -fr /var/backups/unknown-2.4.44+dfsg-5+deb9u4.ldapdb
root@mydebian210:~# cp /usr/share/slapd/slapd.init.ldif /usr/share/slapd/slapd.init.ldif.mydefault
root@mydebian210:~# nano /usr/share/slapd/slapd.init.ldif
只改动include: file:///etc/ldap/schema/nis.ldif所在行
#include: file:///etc/ldap/schema/nis.ldif
include: file:///etc/ldap/schema/gosa/rfc2307bis.ldif
重配置前查看一下对应目录
root@mydebian210:~# ls /etc/ldap/slapd.d/cn\=config/cn\=schema
cn={0}core.ldif cn={1}cosine.ldif cn={2}nis.ldif cn={3}inetorgperson.ldif
再次重配置slapd
root@mydebian210:~# dpkg-reconfigure slapd
Backing up /etc/ldap/slapd.d in /var/backups/slapd-2.4.44+dfsg-5+deb9u4... done.
Moving old database directory to /var/backups:
- directory unknown... done.
Creating initial configuration... done.
Creating LDAP directory... done.
重配置后查看一下对应目录
root@mydebian210:~# ls /etc/ldap/slapd.d/cn\=config/cn\=schema
cn={0}core.ldif cn={2}rfc2307bis.ldif
cn={1}cosine.ldif cn={3}inetorgperson.ldif
四、再次测试,测试要在openldap中增加内容,如果同时要支持memberOf特性又以不想反复重新配置,先配置好支持memberOf特性
(一)、步骤一配置支持memberOf特性,因为这一步必须在openldap中没有数据时完成
root@mydebian210:~# ldapadd -Q -Y EXTERNAL -H ldapi:/// -f ~/memberof_config_default_unique.ldif
adding new entry "cn=module,cn=config"
adding new entry "olcOverlay={0}memberof,olcDatabase={1}mdb,cn=config"
root@mydebian210:~# ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f ~/refint1_default_unique.ldif
modifying entry "cn=module{1},cn=config"
root@mydebian210:~# ldapadd -Q -Y EXTERNAL -H ldapi:/// -f ~/refint2_default_unique.ldif
adding new entry "olcOverlay=refint,olcDatabase={1}mdb,cn=config"
确认支持memberOf特性已生效
root@mydebian210:~# ldapadd -x -D cn=admin,dc=mydebian210,dc=mydomain,dc=net -w "secret_password" -f ~/add_nodes.ldif
adding new entry "ou=web_ftp_users,dc=mydebian210,dc=mydomain,dc=net"
adding new entry "ou=web_ftp_groups,dc=mydebian210,dc=mydomain,dc=net"
root@mydebian210:~# ldapadd -x -D cn=admin,dc=mydebian210,dc=mydomain,dc=net -w "secret_password" -f ~/add_user_default_unique.ldif
adding new entry "uid=testuser,ou=web_ftp_users,dc=mydebian210,dc=mydomain,dc=net"
root@mydebian210:~# ldapadd -x -D cn=admin,dc=mydebian210,dc=mydomain,dc=net -w "secret_password" -f ~/add_group_default_unique.ldif
adding new entry "cn=testgroup,ou=web_ftp_groups,dc=mydebian210,dc=mydomain,dc=net"
root@mydebian210:~# ldapsearch -x -LLL -H ldap:/// -b uid=testuser,ou=web_ftp_users,dc=mydebian210,dc=mydomain,dc=net dc memberof
dn: uid=testuser,ou=web_ftp_users,dc=mydebian210,dc=mydomain,dc=net
memberOf: cn=testgroup,ou=web_ftp_groups,dc=mydebian210,dc=mydomain,dc=net
(二)、下一步才能测试rfc2307bis是否生效
root@mydebian210:~# ldapadd -x -D cn=admin,dc=mydebian210,dc=mydomain,dc=net -w "secret_password" -f ~/add_group2_default_unique.ldif
adding new entry "cn=testgroup2,ou=web_ftp_groups,dc=mydebian210,dc=mydomain,dc=net"
ldap_add: Object class violation (65)
additional info: object class 'posixGroup' requires attribute 'gidNumber'
虽然是出错信息,但是已经证明rfc2307bis已经生效了,posixGroup中gidNumber是必需的属性
加入gidNumber后就可以完成了
root@mydebian210:~# cat > ~/add_group2_default_unique.ldif << EOF
> dn: cn=testgroup2,ou=web_ftp_groups,dc=mydebian210,dc=mydomain,dc=net
> objectClass: groupOfUniqueNames
> objectClass: posixGroup
> cn: testgroup2
> gidNumber: 1002
> description: testgroup2
> uniqueMember: uid=testuser,ou=web_ftp_users,dc=mydebian210,dc=mydomain,dc=net
> EOF
root@mydebian210:~# ldapadd -x -D cn=admin,dc=mydebian210,dc=mydomain,dc=net -w "secret_password" -f ~/add_group2_default_unique.ldif
adding new entry "cn=testgroup2,ou=web_ftp_groups,dc=mydebian210,dc=mydomain,dc=net"
顺便再测试一下同一用户被加入了两个组时的memberOf查询结果
root@mydebian210:~# ldapsearch -x -LLL -H ldap:/// -b uid=testuser,ou=web_ftp_users,dc=mydebian210,dc=mydomain,dc=net dc memberof
dn: uid=testuser,ou=web_ftp_users,dc=mydebian210,dc=mydomain,dc=net
memberOf: cn=testgroup,ou=web_ftp_groups,dc=mydebian210,dc=mydomain,dc=net
memberOf: cn=testgroup2,ou=web_ftp_groups,dc=mydebian210,dc=mydomain,dc=net