在 Rocky Linux 8 上安裝和設置 OpenLDAP


本指南提供有關如何在 Rocky Linux 8 上安裝和設置 OpenLDAP 的分步教程。如果您在這裡,您已經知道什麼是 OpenLDAP 服務器,因此解釋它超出了本教程的範圍。

在 Rocky Linux 8 上安裝和設置 OpenLDAP

好吧,Rocky Linux 8 存儲庫沒有最新版本的 OpenLDAP。

Rocky Linux 8 基本存儲庫中提供的 OpenLDAP 可用版本是 OpenLDAP Server 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 存儲庫提供的wiretiger。

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

保存服務文件並退出。 暫時不要運行該服務.

創建 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請注意上面根 DN 中定義的與此 ou 關聯的訪問控制。

列出數據庫訪問控制列表。

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 (389UDP/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 的身份驗證