我实操OpenLDAP的过程,是先根据官网资料编译安装,大约花费了近2周时间,也有点陷入牛角尖了,一时不得出。后来加了一个群,经过提醒发现了配置文件中的不同,但是依旧不得其果,最终还是自行再折腾了几遍YUM方式的安装,终于才对比发现了一些问题所在,同时也进一步了解了更多内容,知其所以然~~
注意!注意!注意!
根据官方信息来说,2.4不再推荐使用,2.5为LTS版本,2.6为特性版本。因此虽然本章为了省事是基于2.4编写的,仅用于研究,依旧不建议在生产环境中部署了。
前往symas选择对应OpenLDAP版本在相应OS中的repo仓库文件。
symas同时还提供了一些第三方库,可根据具体情况决定是否安装。
wget -q https://repo.symas.com/configs/SOFL/rhel8/sofl.repo -O /etc/yum.repos.d/sofl.repo yum update yum install symas-openldap-servers systemctl start slapd
再次回到那句老话 设定先行! ,这里什么叫设定先行?
如上所说,对于 OpenLDAP2.4 来说,安装后直接启动即会成功运行服务。然鹅……上一章所谓带着问题的问题是什么?我们要操作的DN是什么?密码是什么?
上章的结尾,提到使用 SASL 机制添加前面创建的条目时会提示没有写入权限,现在我们利用前面的文件再试一下:
ldapadd -Q -Y EXTERNAL -H ldapi:// -f add_group.ldif # 一般会返回如下结果 adding new entry "ou=group,dc=example,dc=com" ldap_add: Server is unwilling to perform (53) additional info: no global superior knowledge
诶?先不要管具体的错误原因,但至少身份验证很显然是通过了,这是为什么呢?
还记得之前编译安装的2.5,配置存储目录在哪里么?在 /usr/local/etc/slapd.d/ ,那么通过yum安装的,对应的目录在哪里呢?在: /etc/openldap/slapd.d/ 。使用 tree 命令输出该目录中的内容:
tree /etc/openldap/slapd.d # 返回结果 /etc/openldap/slapd.d ├── cn=config │ ├── cn=schema │ │ └── cn={0}core.ldif │ ├── cn=schema.ldif │ ├── olcDatabase={0}config.ldif │ ├── olcDatabase={-1}frontend.ldif │ ├── olcDatabase={1}monitor.ldif │ └── olcDatabase={2}mdb.ldif └── cn=config.ldif
除了根目录不一致,可以看到目录中还多了一个名为: olcDatabase={1}monitor.ldif 的配置文件。我们现在尚处于不知其所以然的层次,因此可以先不管各个文件是干什么的,目前只需要关注: olcDatabase={0}config.ldif 和 olcDatabase={2}mdb.ldif 这两个文件。
这个配置文件中,最重要的是这一行:
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern al,cn=auth" manage by * none
该配置指令,涉及到了 OpenLDAP 的进阶知识 Access Control 。我们暂且不做深入展开,只需记得:
此配置项决定了客户端可以使用 SASL 机制验证身份后操作LDAP!。
此配置文件,是具体的配置文件,可以看到与前面文章中最大的区别主要在于以下两项配置:
olcSuffix: dc=my-domain,dc=com olcRootDN: cn=Manager,dc=my-domain,dc=com
事实上,正是这两项的配置导致了前面的添加不成功。
我们打开任意一个位于 /etc/openldap/slapd.d/ 目录中的配置文件,都会看到文件头两行显著的文字:
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. # CRC32 xxxxxxxx
什么意思呢?这是自动生成的文件-不要编辑!!!使用 ldapmodify 命令操作 。所以,正如之前网上那篇文章所说的,只要某个文章开头让你编辑这里面的配置,你基本可以直接关闭该文章了,不必浪费时间了!
创建 .ldif 配置文件,编辑如下内容:
# change_domain.ldif dn: olcDatabase={2}mdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=example,dc=com dn: olcDatabase={2}mdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=Manager,dc=example,dc=com
接下来执行编辑命令:
ldapmodify -Q -Y EXTERNAL -H ldapi:// -f change_domain.ldif
Bingo,添加成功!此时再查看前面的 olcDatabase={2}mdb.ldif 文件时,可以发现已经修改成功。
接下来我们再次尝试导入条目:
ldapadd -Q -Y EXTERNAL -H ldapi:// -f add_group.ldif # 返回 adding new entry "ou=group,dc=example,dc=com" ldap_add: No such object (32)
WHY?但我们搜索时,会发现是因为父节点不存在:
ldapsearch -LLL -Q -Y EXTERNAL -H ldapi:// -b 'dc=example,dc=com'
这是因为即便用了YUM安装OpenLDAP,也不会自动创建目录节点,因此,先添加根节点,再添加条目即可:
# add_domain.ldif dn: dc=example,dc=com objectClass: dcObject objectclass: organization o: Example Company dc: example
添加根节点之后,再添加分组:
ldapadd -Q -Y EXTERNAL -H ldapi:// -f add_domain.ldif ldapadd -Q -Y EXTERNAL -H ldapi:// -f add_group.ldif
我们深入探究上面的文件,会发现有点问题。我们实际上是想添加一个 Domain Component ,并不是想当做一个 organization 来添加,而且我们在官网中也可以看到有一个值为 domain 的 objectclass ,于是我们尝试添加一个子域名:
# add_sub_domain.ldif dn: dc=ldap,dc=example,dc=com objectClass: domain domainComponent: ldap
然而我们在添加时,却会返回类似于下面的错误:
ldap_add: Invalid syntax (21) additional info: objectClass: value #0 invalid per syntax
这又是为什么呢?当我们查看 /etc/openldap/slapd.d/cn=config/cn=schema/ 目录时,就会发现原因了。这是因为,OpenLDAP 默认只会添加 core.schema ,而 domain 类型,是由 cosine 架构支持的,因此需要手工添加一下:
# 添加架构 ldapadd -Q -Y EXTERNAL -H ldapi:// -f cosine.ldif # 再次添加子域名 ldapadd -Q -Y EXTERNAL -H ldapi:// -f add_sub_domain.ldif
这回可以看到添加成功了!
经过上面的实验,已经把编译安装的坑填上了,但是……当运行下面的命令时,又会发现遇到新的问题:
ldapsearch -x -W -D cn=Manager,dc=example,dc=com -H ldap:// -b 'dc=example,dc=com' -LLL -s base '(objectclass=*)'
???密码是什么?印象中我们似乎并没有添加什么密码,但是又好像并没有需要添加密码的地方。其实从前面的配置可以看出,yum安装后并没有设置密码的,我们需要手工添加一个密码:
add_passwd.ldif dn: olcDatabase={2}mdb,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}H7pqipuCoHbMH+aAAy3i9Y2/zo+IY2ry
然后使用 ldapadd命令添加到配置文件中即可:
ldapadd -Q -Y EXTERNAL -H ldapi:// -f add_passwd.ldif # 请注意为了测试不同的身份验证方式,使用了不同的协议类型 ldapsearch -x -W -D cn=Manager,dc=example,dc=com -H ldap:// -b 'dc=example,dc=com' -LLL -s base '(objectclass=*)'
DONE!
经过前几章的学习,我们已经通过编译安装和YUM安装,掌握了许多LDAP的基本用法,从不知其然进阶到,知其然而不知其所以然。接下来我们继续深入,从配置开始进一步了解前面的暂不解释,以及未能讲述的问题。
文中用到的配置文件,可点击链接下载。