OpenLDAP 系列4 --- 安装
一、概要
1. 承上启下
2. 基础环境
(1) CentOS 7.9
(2) Open LDAP 2.4.44
3. 解决依赖
(1) EPEL
(2) OpenSSL或GnuTLS
Open LDAP 客户端和服务端要求安装OpenSSL、GnuTLS或MozNSS,CentOS 7已经自带了OpenSSL和GnuTLS。
a. OpenSSL
rpm -qa | grep openssl
b. GunTLS
rpm -qa | grep gnutls
(3) SASL (Simple Authentication and Security Layer)
OpenLDAP客户端和服务端软件需要安装Cyrus SASL库来提供简单身份验证和安全服务。CentOS 7已经自带了Cyrus SASL库:
rpm -qa | grep sasl
(4) Kerberos
Kerberos是一个网络认证协议,ldap官方推荐的两种实现软件是Heimdal(https://www.h5l.org/)和MIT(http://web.mit.edu/kerberos/www/),CentOS 7自带MIT实现:
rpm -qa | grep krb
(5) 数据库
Open LDAP 自带了LMDB(Lightning Memory-Mapped Database),无需单独安装数据库。
(6) 查询版本
rpm -qa | grep ldap
不建议用以下命令卸载旧版本
rpm -e openldap-2.4.44-15.e17_5.x86_64
因为对Open LDAP有依赖的软件实在是太多了(如下图),盲目卸载可能会导致系统崩溃。
(7) Rocky Linux 9
对于RL9,需要OpenLDAP在'plus'仓库中,默认是关闭状态的,所以首先需要开启该仓库:
sudo dnf config-manager --set-enabled plus
sudo dnf repolist
二、安装与配置
1. 安装
Open LDAP安装分为两种方式,RPM包安装或者编译安装,前者简单方便而且有现成的服务可用,后者优势是版本较新,建议使用第一种方式。
在我写这篇文章的时候,Open LDAP的最新的Release版本为2.6.3,最新的LTS版本为2.5.1,但yum repository里提供的最新版本是2.4.44。
yum install openldap openldap-servers openldap-clients -y
openldap-clients包含ldapadd和ldapmodify等命令,在配置环节是必要的。
(2) slapd服务
sudo systemctl start slapd
sudo systemctl enable slapd
systemctl status slapd
(3) 防火墙
sudo firewall-cmd --add-service={ldap,ldaps} --permanent sudo firewall-cmd --reload sudo firewall-cmd --list-all
2. 配置框架
Open LDAP的配置以树状结构存储在Open LDAP数据库中,这些节点的配置文件以ldif格式存储在/etc/openldap/slapd.d目录下。
(1) cn=config是根节点用于全局性配置,它的配置文件是/etc/openldap/slapd.d/cn=config.ldif,其结构如下:
dn: cn=config
objectClass: olcGlobal
cn: config
<global config settings>
(2) cn=module{0},cn=config用于配置动态模块,它的配置文件位于/etc/openldap/slapd.d/cn=config目录下,其结构如下:
dn: cn=module{0},cn=config objectClass: olcModuleList cn: module{0} olcModuleLoad: /usr/local/lib/smbk5pwd.la dn: cn=module{1},cn=config objectClass: olcModuleList cn: module{1} olcModulePath: /usr/local/lib:/usr/local/lib/slapd olcModuleLoad: accesslog.la olcModuleLoad: pcache.la
(3) cn=schema,cn=config用于schema配置,它的配置文件位于/etc/openldap/slapd.d/cn=config目录下,其结构如下:
dn: cn=schema,cn=config objectClass: olcSchemaConfig cn: schema <system schema> dn: cn={X}core,cn=schema,cn=config objectClass: olcSchemaConfig cn: {X}core <core schema>
(4) olcDatabase={X}<typeA>,cn=config用于配置数据库,它的配置文件位于/etc/openldap/slapd.d/cn=config目录下,其结构如下:
dn: olcDatabase={X}<typeA>,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {X}<typeA>
<database-specific settings>
3. 配置
(1) 创建目录,用于存储配置文件
mkdir ~/ldap
(2) 管理密码
a. 生成密码
slappasswd
如下图所示,运行该命令后会生成一个密码,该密码会在后续的配置中继续使用:
b. 新建rootPassword.ldif文件:
vi ~/ldap/rootPassword.ldif
将下方olcRootPW的值替换成刚才生成SSHA密码并复制到rootPassword.ldip文件中:
dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}PASSWORD_CREATED
将管理员密码存储到LDAP目录中:
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f rootPassword.ldif
执行之后会有如下提示:
(3) 导入schema
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
重启
sudo systemctl restart slapd
(4) 数据库
从2.4版本开始,Open LDAP已经将之前常用的BDB(Berkeley DB)设置为过时(deprecated)状态并推荐使用LMDB(Lightning Memory-Mapped Database)。
a. 新建mdb.ldif文件:
vi ~/ldap/mdb.ldif
b. 替换下方文本中olcRootPW的值和example,复制替换后的文本到mdb.ldip文件中:
dn: olcDatabase=mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: mdb olcSuffix: dc=example,dc=com olcRootDN: cn=admin,dc=example,dc=com olcDbDirectory: /var/lib/ldap olcDbMaxsize: 1073741824 olcRootPW: {SSHA}Password olcDbIndex: objectClass eq
olcDbIndex: ou,cn,mail,surname,givenname eq olcLastMod: TRUE olcMonitoring: TRUE olcDbEnvFlags: writemap olcDBNoSync: TRUE
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=example,dc=com" write by * read
c. 添加配置:
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f mdb.ldif
d. 清理HDB
sudo rm -rf /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif
(5) monitor
a. 新建monitor.ldif
vi ~/ldap/monitor.ldif
b. 初始化
dn: olcDatabase={1}monitor,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=admin,dc=example,dc=com" read by * none
注意将example替换成自己的域名;
c. 修改配置
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f monitor.ldif
(6) 测试配置
sudo slaptest -u
(7) 重启服务
sudo systemctl restart slapd
4. 初始化数据
(1) 新建data.ldif
vi ~/ldap/data.ldif
(2) 初始化
dn: dc=example,dc=com objectClass: top objectClass: dcObject objectclass: organization o: Example dn: cn=admin,dc=example,dc=com objectClass: organizationalRole cn: admin description: Directory Admin dn: ou=People,dc=example,dc=com objectClass: organizationalUnit ou: People dn: ou=Group,dc=example,dc=com objectClass: organizationalUnit ou: People
(3) 添加数据
sudo ldapadd -Y EXTERNAL -x -D "cn=admin,dc=example,dc=com" -W -f data.ldif
或
sudo ldapadd -x -W -D "cn=admin,dc=example,dc=com" -f data.ldif
5. 测试
(1) 匿名登录测试
默认情况下Open LDAP是支持匿名登录和查询的,所以我们可以通过匿名的方式来查看我们刚才添加的数据:
ldapsearch -x -H ldap://127.0.0.1:389 -b 'ou=People,dc=example,dc=com'
查询成功会返回DN为"ou=Group,dc=example,dc=com"本身和它全部子节点的详细信息,如果返回invalid credentials(49)则说明有问题,可以添加-d 5参数来输出详细信息。
(2) 登录后测试
假设我们在"ou=People,dc=example,dc=com"下面创建了若干员工,并且为员工分配了密码,那么我们可以通过以下命令测试我们添加的数据:
ldapsearch -x -H ldap://127.0.0.1:389 -D uid=<<用户名>>,ou=People,dc=example,dc=com -w <<密码>> -b cn=admin,dc=example,dc=com
关于ldapsearch命令请参考官方文档 https://www.mkssoftware.com/docs/man1/ldapsearch.1.asp, 我这里简单解释一下上面的参数:
-x 表示使用简单身份验证而不是SASL;
-H 是LDAP服务的地址和端口;
-D 是bindDN(需要绑定DN),这里可以理解为用户名,注意这里的用户名是"uid=<<用户名>>,ou=People,dc=example,dc=com",假设员工的uid是zhangsan,那么这里的参数是"uid=zhangsan,ou=People,dc=example,dc=com";
-w 是用户的密码,注意不是root password(虽然你可以用root password但这明显是强烈不建议的);
-b 是baseDN,是你要查询的东西,这里我们查询“cn=admin,dc=example,dc=com”这个节点;
我们务必要区分bindDN和baseDN。
6. objectClass
objectClass之于LDAP就像数据表结构与关系型数据库的关系类似,针对不同的角色,我建议使用以下ObjectClass:
顶层:top + dcObject + organization
二层:organizationalUnit
系统管理员:organizationalRole
Group:groupOfNames
People:inetOrgPerson
Device(Server,打印机): device + shadowAccount + ipHost(可选)
三、卸载与清理
1. 卸载
yum remove openldap-clients openldap-servers -y
2. 清空目录
rm -rf /etc/openldap/slapd.d rm -rf /var/lib/ldap
四、参考
1. 官方
https://www.openldap.org/doc/admin24/
https://www.openldap.org/doc/admin24/slapdconf2.html
https://www.openldap.org/doc/admin26/backends.html#Monitor
2. 安装
(1) CentOS 7
https://www.tecmint.com/install-openldap-server-for-centralized-authentication/
https://linuxhostsupport.com/blog/how-to-install-ldap-on-centos-7/
https://www.cnblogs.com/swordfall/p/12119010.html
(2) Rocky Linux 9
https://www.howtoforge.com/how-to-install-openldap-on-rocky-linux-9/
3. MDB
https://www.openldap.org/doc/admin24/backends.html#LMDB
https://stackoverflow.com/questions/24407788/openldap-switch-to-mdb-backend-memory-mapped-database