在本指南中,我们提供了有关如何在 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 的身份验证