在 Rocky Linux 8 上安装和设置 OpenLDAP

在本指南中,我们提供了有关如何在 Rocky Linux 8 上安装和设置 OpenLDAP 的分步教程。 如果您在这里,那么您已经知道 OpenLDAP 服务器是什么,因此对它的描述超出了范围本教程。

在 Rocky Linux 8 上安装和设置 OpenLDAP

好吧,Rocky Linux 8 存储库没有 OpenLDAP 的最新版本。

Rocky Linux 8 基本存储库提供的 OpenLDAP 的可用版本是 OpenLDAP 服务器 v2.4.46。

dnf provides openldap
openldap-2.4.46-16.el8.i686 : LDAP support libraries Repo        : baseos Matched from: Provide    : openldap = 2.4.46-16.el8  openldap-2.4.46-16.el8.x86_64 : LDAP support libraries Repo        : @System Matched from: Provide    : openldap = 2.4.46-16.el8  openldap-2.4.46-16.el8.x86_64 : LDAP support libraries Repo        : baseos Matched from: Provide    : openldap = 2.4.46-16.el8 

要获得带有错误修复的最新版本,您需要按照本指南中的说明从源代码构建它。

运行系统更新

要更新您的系统包,请运行以下命令;

dnf update

安装所需的依赖项和构建工具

从源代码成功构建和编译 OpenLDAP 需要相当多的依赖项和构建工具。 运行下面的命令来安装它们。

dnf install cyrus-sasl-devel make libtool autoconf libtool-ltdl-devel openssl-devel libdb-devel tar gcc perl perl-devel wget vim

安装由 EPEL-7 repos 提供的wiredtiger;

cat > /etc/yum.repos.d/epel-release-7.repo << 'EOF' [epel-release-7] name=Extra Packages for Enterprise Linux 7 - x86_64 baseurl=https://dl.fedoraproject.org/pub/epel/7/x86_64/ enabled=0 gpgcheck=0 EOF
dnf --enablerepo=epel-release-7 install wiredtiger wiredtiger-devel

创建 OpenLDAP 系统帐户

在此演示中,OpenLDAP 将以非特权系统用户运行。 因此,运行以下命令以创建具有自定义用户和组 ID 的 OpenLDAP 系统用户;

useradd -r -M -d /var/lib/openldap -u 55 -s /usr/sbin/nologin ldap

咨询 man useradd 有关上面使用的命令行选项的描述。

下载 OpenLDAP 源代码压缩包

在撰写本文时,OpenLDAP 的最新稳定版本是 OpenLDAP 2.5.5。但是,由于某些原因,此版本无法使用密码策略编译!!

因此,在本教程中,我们将使用 OpenLDAP 2.4.59。 因此导航到 OpenLDAP 下载页面并获取 tarball。

VER=2.4.59
wget ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-$VER.tgz

提取 OpenLDAP 源代码压缩包

可以通过运行命令来提取 tarball;

tar xzf openldap-$VER.tgz

在 Rocky Linux 8 上安装和设置 OpenLDAP

在 Rocky Linux 8 上编译 OpenLDAP

要在 Rocky Linux 8 上编译 OpenLDAP,您首先需要运行配置脚本以使 OpenLDAP 适应您的系统并检查是否缺少任何必需的依赖项,然后才能继续安装。

cd openldap-$VER

使用配置脚本,您可以在构建 OpenLDAP 时启用或禁用各种选项。

./configure --prefix=/usr --sysconfdir=/etc --disable-static  --enable-debug --with-tls=openssl --with-cyrus-sasl --enable-dynamic  --enable-crypt --enable-spasswd --enable-slapd --enable-modules  --enable-rlookups --enable-backends=mod --disable-ndb --disable-sql  --enable-ppolicy --enable-syslog --enable-overlays=mod

要了解有关配置选项的更多信息,请咨询;

./configure --help

如果配置脚本完成没有问题,您应该看到的最后一行是;

Please run "make depend" to build dependencies

正如该行所述,您需要运行 make depend 命令来构建 OpenLDAP 依赖项。

make depend

接下来,在 Rocky Linux 8 上编译 OpenLDAP。

make

如果您有时间和耐心,您可以运行测试套件来验证 OpenLDAP 构建是否存在任何错误。 不过你可以跳过这一步.

make test

在 Rocky Linux 8 上安装 OpenLDAP

如果 OpenLDAP 的编译成功完成,请通过运行命令继续安装它;

make install

OpenLDAP 配置文件现在安装在 /etc/openldap.

ls -1 /etc/openldap/
DB_CONFIG.example ldap.conf ldap.conf.default schema slapd.conf slapd.conf.default slapd.ldif slapd.ldif.default

库安装在 /usr/libexec/openldap.

在 Rocky Linux 8 上配置 OpenLDAP

现在 OpenLDAP 的安装已完成,请继续对其进行配置。

创建 OpenLDAP 数据和数据库目录

mkdir /var/lib/openldap /etc/openldap/slapd.d

在 OpenLDAP 目录和配置文件上设置正确的所有权和权限。

chown -R ldap:ldap /var/lib/openldap
chown root:ldap /etc/openldap/slapd.conf
chmod 640 /etc/openldap/slapd.conf

创建 OpenLDAP Systemd 服务

为了将 OpenLDAP 作为服务运行,您需要创建一个 systemd 服务文件,如下所示。

cat > /etc/systemd/system/slapd.service << 'EOL' [Unit] Description=OpenLDAP Server Daemon After=syslog.target network-online.target Documentation=man:slapd Documentation=man:slapd-mdb  [Service] Type=forking PIDFile=/var/lib/openldap/slapd.pid Environment="SLAPD_URLS=ldap:/// ldapi:/// ldaps:///" Environment="SLAPD_OPTIONS=-F /etc/openldap/slapd.d" ExecStart=/usr/libexec/slapd -u ldap -g ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS  [Install] WantedBy=multi-user.target EOL 

Save 并退出服务文件。 暂时不要运行服务.

创建 OpenLDAP SUDO 架构

使用支持配置 LDAP sudo, 首先检查你安装的版本 sudo 支持 LDAP。

sudo -V |  grep -i "ldap"

如果 sudo 支持 LDAP,您应该看到以下几行;

... ldap.conf path: /etc/sudo-ldap.conf ldap.secret path: /etc/ldap.secret

检查 LDAP sudo 模式可用。

rpm -ql sudo |  grep -i schema.openldap
/usr/share/doc/sudo/schema.OpenLDAP

复制 schema.OpenLDAP 到架构目录。

cp /usr/share/doc/sudo/schema.OpenLDAP  /etc/openldap/schema/sudo.schema

接下来,您需要创建 sudo 架构 ldif 文件。 运行下面的命令来创建 sudo.ldif 文件。 这个 ldif 文件是从 Lullabot github 存储库中获得的。

cat << 'EOL' > /etc/openldap/schema/sudo.ldif dn: cn=sudo,cn=schema,cn=config objectClass: olcSchemaConfig cn: sudo olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s) who may  run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s) who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Command(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s) impersonated by sudo (deprecated)' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Options(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'User(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Group(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) olcObjectClasses: ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top STRUCTURAL DESC 'Sudoer Entries' MUST ( cn ) MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ description ) ) EOL 

更新 OpenLDAP SLAPD 数据库

编辑 SLAPD LDIF 文件, /etc/openldap/slapd.ldif,并更新如下;

mv /etc/openldap/slapd.ldif /etc/openldap/slapd.ldif.bak
cat > /etc/openldap/slapd.ldif << 'EOL' dn: cn=config objectClass: olcGlobal cn: config olcArgsFile: /var/lib/openldap/slapd.args olcPidFile: /var/lib/openldap/slapd.pid  dn: cn=schema,cn=config objectClass: olcSchemaConfig cn: schema  dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulepath: /usr/libexec/openldap olcModuleload: back_mdb.la  include: file:///etc/openldap/schema/core.ldif include: file:///etc/openldap/schema/cosine.ldif include: file:///etc/openldap/schema/nis.ldif include: file:///etc/openldap/schema/inetorgperson.ldif include: file:///etc/openldap/schema/sudo.ldif include: file:///etc/openldap/schema/ppolicy.ldif dn: olcDatabase=frontend,cn=config objectClass: olcDatabaseConfig objectClass: olcFrontendConfig olcDatabase: frontend olcAccess: to dn.base="cn=Subschema" by * read olcAccess: to *    by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage    by * none  dn: olcDatabase=config,cn=config objectClass: olcDatabaseConfig olcDatabase: config olcRootDN: cn=config olcAccess: to *    by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage    by * none EOL 
  • 要从上面 SLAPD LDIF 文件中提供的信息更新 SLAPD 数据库,请使用 slapadd 带选项的命令 -n 0 它创建了第一个数据库。
  • 要指定配置目录, /etc/openldap/slapd.d, 使用选项 -F 和选项 -l 指定上面 LDIF 文件的位置。

在将更改写入数据库之前,请执行试运行以查看会发生什么。 经过 -u slapadd 命令的选项。

slapadd -n 0 -F /etc/openldap/slapd.d -l /etc/openldap/slapd.ldif -u

命令输出应该是这样的;

_#################### 100.00% eta   none elapsed            none fast!

如果一切顺利,然后实施更改。

slapadd -n 0 -F /etc/openldap/slapd.d -l /etc/openldap/slapd.ldif

此命令在下面创建 slapd 数据库配置 /etc/openldap/slapd.d 目录。

ls /etc/openldap/slapd.d
'cn=config'  'cn=config.ldif'

设置用户和组的所有权 /etc/openldap/slapd.d 目录和其中的文件给 ldap 用户。

chown -R ldap:ldap /etc/openldap/slapd.d

运行 SLAPD 服务

重新加载 systemd 配置并启动并启用 OpenLDAP 服务以在引导时运行。

systemctl daemon-reload
systemctl enable --now slapd

检查状态;

systemctl status slapd
● slapd.service - OpenLDAP Server Daemon    Loaded: loaded (/etc/systemd/system/slapd.service; disabled; vendor preset: disabled)    Active: active (running) since Sat 2021-06-19 12:17:43 EAT; 19s ago      Docs: man:slapd            man:slapd-mdb   Process: 153713 ExecStart=/usr/libexec/slapd -u ldap -g ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)  Main PID: 153714 (slapd)     Tasks: 2 (limit: 11389)    Memory: 3.0M    CGroup: /system.slice/slapd.service            └─153714 /usr/libexec/slapd -u ldap -g ldap -h ldap:/// ldapi:/// ldaps:/// -F /etc/openldap/slapd.d  Jun 19 12:17:43 localhost.localdomain systemd[1]: Starting OpenLDAP Server Daemon... Jun 19 12:17:43 localhost.localdomain slapd[153713]: @(#) $OpenLDAP: slapd 2.5.5 (Jun 19 2021 11:30:55) $                                                              [email protected]:/root/openldap-2.5.5/servers/slapd Jun 19 12:17:43 localhost.localdomain slapd[153714]: slapd starting Jun 19 12:17:43 localhost.localdomain systemd[1]: Started OpenLDAP Server Daemon. 

在 Rocky Linux 8 上配置 OpenLDAP 日志记录

使 OpenLDAP 能够记录连接、操作、结果统计、创建和 ldif 文件并更新数据库,如下所示。 在日志级别启用此类 OpenLDAP 日志记录 256 带关键字 stats 通过修改 olcLogLevel 属性如下图。

cd ~
cat > enable-openldap-log.ldif << 'EOL' dn: cn=config changeType: modify replace: olcLogLevel olcLogLevel: stats EOL
ldapmodify -Y external -H ldapi:/// -f enable-openldap-log.ldif
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config "(objectClass=olcGlobal)" olcLogLevel -LLL -Q
dn: cn=config olcLogLevel: stats

配置 Rsyslog 以启用 OpenLDAP 以登录到特定文件。 默认情况下,OpenLDAP 登录到 local4 设施。

echo "local4.* /var/log/slapd.log" >> /etc/rsyslog.conf

重启 Rsyslog

systemctl restart rsyslog

您现在应该能够读取 LDAP 日志, /var/log/slapd.log.

创建 OpenLDAP 默认根 DN

接下来,创建定义根 DN 和访问控制列表的 MDB 数据库。

首先,生成根 DN 密码。

slappasswd
New password: ENTER PASSWORD Re-enter new password: RE-ENTER PASSWORD {SSHA}OH74PoJJKTsYIEg75iuwGk0OKbJ8y/BD

粘贴上面生成的密码哈希作为值 olcRootPW 在下面的根 DN ldif 文件中。

替换域组件, dc=ldapmaster,dc=kifarunix-demo,dc=com 用你合适的名字。

cat > rootdn.ldif << 'EOL' dn: olcDatabase=mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: mdb olcDbMaxSize: 42949672960 olcDbDirectory: /var/lib/openldap olcSuffix: dc=ldapmaster,dc=kifarunix-demo,dc=com olcRootDN: cn=admin,dc=ldapmaster,dc=kifarunix-demo,dc=com olcRootPW: {SSHA}OH74PoJJKTsYIEg75iuwGk0OKbJ8y/BD olcDbIndex: uid pres,eq olcDbIndex: cn,sn pres,eq,approx,sub olcDbIndex: mail pres,eq,sub olcDbIndex: objectClass pres,eq olcDbIndex: loginShell pres,eq olcDbIndex: sudoUser,sudoHost pres,eq olcAccess: to attrs=userPassword,shadowLastChange,shadowExpire   by self write   by anonymous auth   by dn.subtree="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage    by dn.subtree="ou=system,dc=ldapmaster,dc=kifarunix-demo,dc=com" read   by * none olcAccess: to dn.subtree="ou=system,dc=ldapmaster,dc=kifarunix-demo,dc=com" by dn.subtree="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage   by * none olcAccess: to dn.subtree="dc=ldapmaster,dc=kifarunix-demo,dc=com" by dn.subtree="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage   by users read    by * none EOL 

阅读有关 OpenLDAP 访问控制上的 ACL 的更多信息。

用上面的内容更新了 slapd 数据库;

ldapadd -Y EXTERNAL -H ldapi:/// -f rootdn.ldif

示例命令输出;

SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "olcDatabase=mdb,cn=config"

使用 SSL/TLS 配置 OpenLDAP

为了保护客户端和服务器之间的 OpenLDAP 通信,将其配置为使用 SSL/TLS 证书。

在本指南中,我们是自签名证书。 对于生产环境,您可以选择从首选 CA 获取商业签名和可信证书。

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout  /etc/pki/tls/ldapserver.key -out /etc/pki/tls/ldapserver.crt
chown ldap:ldap /etc/pki/tls/{ldapserver.crt,ldapserver.key}

更新 OpenLDAP 服务器 TLS 证书属性。

cat > add-tls.ldif << 'EOL' dn: cn=config changetype: modify add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/pki/tls/ldapserver.crt - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/pki/tls/ldapserver.key - add: olcTLSCertificateFile olcTLSCertificateFile: /etc/pki/tls/ldapserver.crt EOL 

请注意,我们使用自签名证书作为证书和 CA 证书。

ldapadd -Y EXTERNAL -H ldapi:/// -f add-tls.ldif

您可以通过运行来确认这一点;

slapcat -b "cn=config" | grep olcTLS
olcTLSCACertificateFile: /etc/pki/tls/ldapserver.crt olcTLSCertificateKeyFile: /etc/pki/tls/ldapserver.key olcTLSCertificateFile: /etc/pki/tls/ldapserver.crt

更改 CA 证书的位置 /etc/openldap/ldap.conf.

vim /etc/openldap/ldap.conf
... #TLS_CACERT     /etc/pki/tls/cert.pem TLS_CACERT     /etc/pki/tls/ldapserver.crt

创建 OpenLDAP 基本 DN

接下来,创建您的基本 DN 或搜索库以定义您的组织结构和目录。

相应地替换域组件和组织单元。

cat > basedn.ldif << 'EOL' dn: dc=ldapmaster,dc=kifarunix-demo,dc=com objectClass: dcObject objectClass: organization objectClass: top o: Kifarunix-demo dc: ldapmaster  dn: ou=groups,dc=ldapmaster,dc=kifarunix-demo,dc=com objectClass: organizationalUnit objectClass: top ou: groups  dn: ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com objectClass: organizationalUnit objectClass: top ou: people EOL 
ldapadd -Y EXTERNAL -H ldapi:/// -f basedn.ldif

创建 OpenLDAP 用户帐户

您可以将用户添加到 OpenLDAP 服务器。 创建一个 ldif 文件来定义您的用户,如下所示。

cat > users.ldif << 'EOL' dn: uid=johndoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount uid: johndoe cn: John sn: Doe loginShell: /bin/bash uidNumber: 10000 gidNumber: 10000 homeDirectory: /home/johndoe shadowMax: 60 shadowMin: 1 shadowWarning: 7 shadowInactive: 7 shadowLastChange: 0  dn: cn=johndoe,ou=groups,dc=ldapmaster,dc=kifarunix-demo,dc=com objectClass: posixGroup cn: johndoe gidNumber: 10000 memberUid: johndoe EOL 

将用户添加到 OpenLDAP 数据库。

ldapadd -Y EXTERNAL -H ldapi:/// -f users.ldif

为 LDAP 用户设置密码

要为上面的用户设置密码,请运行以下命令;

ldappasswd -H ldapi:/// -Y EXTERNAL -S "uid=johndoe,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com"

创建 OpenLDAP 绑定 DN 和绑定 DN 用户

绑定 DN 用户用于执行 LDAP 操作,例如解析用户 ID 和组 ID。 在本指南中,我们创建了一个名为的绑定 DN system. 请注意与此 ou 关联的访问控制,如上面根 DN 上定义的那样。

列出数据库上的访问控制列表;

ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config '(olcDatabase={1}mdb)' olcAccess

创建 BindDN 用户密码。

slappasswd
New password: Password Re-enter new password: Password {SSHA}1s+ndOUpf7dzQvH3z7BJoJLOkRJRIHvX

将上面的密码哈希值粘贴为 userPassword 下面文件中的属性;

cat > bindDNuser.ldif << 'EOL' dn: ou=system,dc=ldapmaster,dc=kifarunix-demo,dc=com objectClass: organizationalUnit objectClass: top ou: system  dn: cn=readonly,ou=system,dc=ldapmaster,dc=kifarunix-demo,dc=com objectClass: organizationalRole objectClass: simpleSecurityObject cn: readonly userPassword: {SSHA}1s+ndOUpf7dzQvH3z7BJoJLOkRJRIHvX description: Bind DN user for LDAP Operations EOL 
ldapadd -Y EXTERNAL -H ldapi:/// -f bindDNuser.ldif

在防火墙上允许 OpenLDAP 服务

要允许远程客户端查询 OpenLDAP 服务器,请允许 ldap (389 UDP/TCP)ldaps (636 UDP/TCP) 服务在防火墙上。

firewall-cmd --add-service={ldap,ldaps} --permanent
firewall-cmd --reload

测试 OpenLDAP 身份验证

好吧,你去了。 您已经学习了如何在 Rocky Linux 8 上安装和设置 OpenLDAP 服务器。

要验证用户是否可以通过 OpenLDAP 服务器实际连接到系统,您需要在远程系统上配置 OpenLDAP 客户端。

请参阅下面的指南;

在 Rocky Linux 8 上为 LDAP 身份验证配置 SSSD

在 pfSense 上配置 Squid 代理 OpenLDAP 身份验证

配置 OpenLDAP 密码到期电子邮件通知

配置基于 OpenVPN LDAP 的身份验证