第 1 章 保护红帽目录服务器
使用红帽目录服务器提高 LDAP 服务的安全性。例如,您可以加密客户端和目录服务器之间的连接,并将加密属性存储在目录服务器数据库中。您还可以加密复制更改日志、配置身份验证和执行其他安全任务。
1.1. 启用 TLS 加密连接到目录服务器 复制链接链接已复制到粘贴板!
默认情况下,红帽目录服务器在没有加密的情况下提供 LDAP 服务。要提高安全性,您可以在 Directory 服务器中配置 TLS,以启用复制环境中的客户端或其他主机使用加密连接。然后,他们可以对端口 389 或 LDAPS 协议在端口 636 上使用 STARTTLS
命令进行安全连接。
您可以使用绑定 Distinguished Name (DN)和密码,或使用基于证书的身份验证来使用 TLS。
目录服务器的加密服务由 Mozilla 网络安全服务(NSS)提供,这是 TLS 和基本加密功能的库。NSS 包括基于软件的加密令牌,该令牌是联邦信息处理标准(FIPS) 140-2 认证。
1.1.1. 加密连接到目录服务器的不同选项 复制链接链接已复制到粘贴板!
要使用加密连接连接到目录服务器,您可以使用以下协议和框架:
- LDAPS
-
当您使用 LDAPS 协议时,连接开始使用加密,成功或失败。但是,网络不会发送未加密的数据。因此,首选 LDAPS 而不是通过未加密的 LDAP 使用
STARTTLS
。 - STARTTLS over LDAP
客户端通过 LDAP 协议建立未加密的连接,然后发送
STARTTLS
命令。如果命令成功,则所有进一步的通信都会被加密。警告如果
STARTTLS
命令失败,且客户端没有取消连接,则所有其他数据(包括身份验证信息)都会通过网络进行未加密的发送。- SASL
- Simple Authentication and Security Layer (SASL)框架允许您使用外部验证方法(如 Kerberos)验证用户。
1.1.2. 目录服务器如何解锁 NSS 数据库 复制链接链接已复制到粘贴板!
目录服务器将证书签名请求(CSR)、私钥和证书存储在网络安全服务(NSS)数据库中。当您安装新实例时,安装程序会自动创建 NSS 数据库并使用随机密码对其进行保护。安装程序将此密码存储在以下文件中:
-
/etc/dirsrv/slapd-<instance_name> /pwdfile.txt
:dsconf tls
命令使用这个文件来访问 NSS 数据库。 /etc/dirsrv/slapd- <instance_name> /pin.txt
:此文件包含令牌和密码,以便在目录服务器启动时自动解锁 NSS 数据库。- 如果您希望目录服务器在每次启动实例时提示输入 NSS 数据库密码,请删除此文件。
- 如果您希望实例在没有提示输入密码的情况下自动启动,请保留此文件并在更改 NSS 数据库密码时更新该文件。
如果 /etc/dirsrv/slapd- <instance_name> /pin.txt
文件不存在,您启动启用了加密的目录服务器并在 NSS 数据库中设置密码,其行为如下:
如果
systemctl
或dsctl
工具启动ns-slapd
Directory Server 进程,systemd
服务会提示输入密码,并自动将输入传递给systemd-tty-ask-password-agent
工具:dsctl <instance_name> start
# dsctl <instance_name> start Enter PIN for Internal (Software) Token: (press TAB for no echo)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在个别情况下,当
ns-slapd
Directory Server 进程没有由systemctl
或dsctl
工具启动,且进程从终端分离时,ns-slapd
使用wall
命令向所有终端发送消息:Broadcast message from root@server (Fri 2021-01-01 06:00:00 CET): Password entry required for 'Enter PIN for Internal (Software) Token:' (PID 1234). Please enter password with the systemd-tty-ask-password-agent tool!
Broadcast message from root@server (Fri 2021-01-01 06:00:00 CET): Password entry required for 'Enter PIN for Internal (Software) Token:' (PID 1234). Please enter password with the systemd-tty-ask-password-agent tool!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入密码:
systemd-tty-ask-password-agent
# systemd-tty-ask-password-agent Enter PIN for Internal (Software) Token:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.3. 使用命令行启用 TLS 加密连接到目录服务器 复制链接链接已复制到粘贴板!
要使用 TLS 加密或基于证书的身份验证,您必须管理网络安全服务(NSS)数据库中的证书。当您创建实例时,ds
create 工具会在 /etc/dirsrv/slapd- <instance_name>/
目录中自动创建此数据库,并使用强密码对其进行保护。
流程
创建私钥和证书签名请求(CSR)。如果要使用外部实用程序创建它们,请跳过这一步。
如果您的主机只能通过一个名称访问,请输入:
dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization"
# dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的主机可以通过多个名称访问:
dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization" server.example.com server.example.net
# dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization" server.example.com server.example.net
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您将主机名指定为最后一个参数,命令将使用 DNS:server.example.
com、DNS:server.example.net
条目将 Subject Alternative Name (SAN)扩展添加到 CSR。
在
-s subject
参数中指定的字符串必须是根据 RFC 1485 的有效主题名称。主题中的CN
字段是必需的,您必须将其设置为服务器的完全限定域名(FQDN)。命令会将 CSR 存储在/etc/dirsrv/slapd- <instance_name>/Server-Cert.csr
文件中。- 将 CSR 提交到证书颁发机构(CA)以获取签发的证书。详情请查看您的 CA 文档。
将 CA 发布的服务器证书导入到 NSS 数据库:
如果您使用
dsctl tls generate-server-cert-csr
命令创建私钥,请输入:dsconf <instance_name> security certificate add --file /root/instance_name.crt --name "server-cert" --primary-cert
# dsconf <instance_name> security certificate add --file /root/instance_name.crt --name "server-cert" --primary-cert
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 记住您在 -name
_certificate_nickname
参数中设置的证书的名称。在后续步骤中,您需要它。如果您使用外部实用程序创建私钥,请导入服务器证书和私钥:
dsctl <instance_name> tls import-server-key-cert /root/server.crt /root/server.key
# dsctl <instance_name> tls import-server-key-cert /root/server.crt /root/server.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,命令要求您首先指定服务器证书的路径,然后指定私钥的路径。这个方法始终将证书的 nickname 设置为
Server-Cert
。
将 CA 证书导入到 NSS 数据库:
dsconf <instance_name> security ca-certificate add --file /root/ca.crt --name "Example CA"
# dsconf <instance_name> security ca-certificate add --file /root/ca.crt --name "Example CA"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置 CA 证书的信任标记:
dsconf <instance_name> security ca-certificate set-trust-flags "Example CA" --flags "CT,,"
# dsconf <instance_name> security ca-certificate set-trust-flags "Example CA" --flags "CT,,"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这会将目录服务器配置为信任用于 TLS 加密和基于证书的身份验证的 CA。
启用 TLS 并设置 LDAPS 端口:
dsconf <instance_name> config replace nsslapd-securePort=636 nsslapd-security=on
# dsconf <instance_name> config replace nsslapd-securePort=636 nsslapd-security=on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
firewalld
服务中打开 LDAPS 端口:firewall-cmd --permanent --add-port=636/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=636/tcp # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用 RSA 密码系列,设置 NSS 数据库安全设备和服务器证书名称:
dsconf <instance_name> security rsa set --tls-allow-rsa-certificates on --nss-token "internal (software)" --nss-cert-name Server-Cert
# dsconf <instance_name> security rsa set --tls-allow-rsa-certificates on --nss-token "internal (software)" --nss-cert-name Server-Cert
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,NSS 数据库中的安全设备名称是
内部的(软件)。
可选:禁用纯文本 LDAP 端口:
dsconf <instance_name> security disable_plain_port
# dsconf <instance_name> security disable_plain_port
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启实例
dsctl <instance_name> restart
# dsctl <instance_name> restart
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 LDAPS 协议建立与目录服务器的连接。例如,运行查询:
ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base
# ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令失败,并显示
ldap_sasl_bind (SIMPLE):无法联系 LDAP 服务器(-1)
错误,请使用 debug 级别 1 重新运行该命令:ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base -d 1
# ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base -d 1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.4. 使用 Web 控制台启用到目录服务器的 TLS 加密连接 复制链接链接已复制到粘贴板!
您可以使用 Web 控制台配置 TLS 加密。
前提条件
- 在 web 控制台中登录到实例。
流程
-
导航到
,然后单击 。 为证书签名请求(CSR)、通用名称(CN)和机构(O)设置名称:
如果您的主机可由多个名称访问,请在 Subject Alternative Names filed 中设置替代名称。
- 单击 。
查看 CSR 文本并复制它:
- 单击您要查看的 CSR 的 Node options 图标,然后选择 View CSR。
- 复制 CSR 内容。
- 将 CSR 文件提交到证书颁发机构(CA)以获取签发的证书。详情请查看您的 CA 文档。
-
从 CA 获取证书时,导航到
,然后单击 。 为服务器证书设置唯一别名,上传发布的证书,然后点
。请记住证书 nickname,因为稍后的步骤需要它。
-
导航到
, 。 - 为 CA 证书设置唯一别名,上传 CA 证书文件,然后单击 。
可选:如果您在 Directory Server 实例安装过程中没有启用 TLS 加密,请启用它:
-
导航到
,并启用安全开关。 - 在弹出窗口上,单击 。
- 在 Security Setting 页面中点 。
-
导航到
在安全配置页面中的配置服务器证书名称:
-
进入到
。 - 在 Server Certificate Name 下拉列表中选择服务器证书 nickname,然后单击 。
- 可选: 如果您在下拉列表中没有看到证书 nickname,请刷新 Security Settings 页面并再次执行上一步。
-
进入到
-
可选:如果要使用
636
以外的 LDAPS 端口,请导航到,设置 LDAPS 端口,然后点 。 在
firewalld
服务中打开 LDAPS 端口:firewall-cmd --permanent --add-port=636/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=636/tcp # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:进入到
,选择 Require Secure Connections,点 。 目录服务器禁用纯文本 LDAP 端口。
- 点右上角的 Restart Instance。 ,然后选择
1.1.5. 如果证书已过期,管理目录服务器的行为 复制链接链接已复制到粘贴板!
默认情况下,如果启用了加密,且证书已过期,Directory 服务器会记录警告并启动服务。要更改此行为,请设置 nsslapd-validate-cert
参数。您可以将其设置为以下值:
-
Warn
: Directory Server 启动并将有关过期证书的警告记录到/var/log/dirsrv/slapd- <instance_name> /error
日志文件。这是默认设置。 -
在 : Directory
服务器上
验证证书。如果证书已过期,实例无法启动。 -
off
:目录服务器不会验证证书过期日期。实例启动,且不会记录任何警告。
前提条件
- 已配置了 TLS 加密。
流程
使用以下命令更改
nsslapd-validate-cert
参数:dsconf <instance_name> config replace nsslapd-validate-cert=<value>
# dsconf <instance_name> config replace nsslapd-validate-cert=<value>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.6. 更改 NSS 数据库的密码 复制链接链接已复制到粘贴板!
您可以更改网络安全服务(NSS)数据库的密码。例如,当未授权人知道密码时,请更改密码。
前提条件
您知道当前的 NSS 数据库密码。
如果您使用密码文件在 Directory Server 启动时自动解锁数据库,密码会以明文形式保存在
/etc/dirsrv/slapd- <instance_name> /pin.txt
文件中。
流程
使用以下命令更改 NSS 数据库密码:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用密码文件在没有提示输入 NSS 数据库密码的情况下自动启动目录服务器,请在
/etc/dirsrv/slapd-<instance_name>/pin.txt
中使用新密码替换旧密码:如果您使用 NSS 软件加密模块,这是默认设置:
Internal (Software) Token:password
Internal (Software) Token:password
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用硬件安全模块(HSM):
name_of_the_token:password
name_of_the_token:password
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
对需要输入密码的 NSS 数据库执行操作。例如,列出您的实例的私钥:
certutil -d /etc/dirsrv/slapd-<instance_name>/ -K
# certutil -d /etc/dirsrv/slapd-<instance_name>/ -K certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services" Enter Password or Pin for "NSS Certificate DB": < 0> rsa 72cb03f87381abfbb6b9e78234e2e4502ad1bfc0 NSS Certificate DB:Server-Cert
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在输入新密码后命令显示预期的输出,则更改密码成功。
1.1.7. 创建密码文件以启动实例,而不提示输入 NSS 数据库密码 复制链接链接已复制到粘贴板!
当您创建新实例时,安装程序会自动创建 /etc/dirsrv/slapd-instance_name/pin.txt
文件,以便目录服务器在不提示输入网络安全服务(NSS)密码的情况下启动。但是,如果您删除此文件,您可以重新创建该文件。
密码以纯文本形式存储。如果服务器在不安全的环境中运行,则不要使用密码文件。
前提条件
- 您知道 NSS 数据库密码。
流程
使用以下内容创建
/etc/dirsrv/slapd-<instance_name>/pin.txt
文件:如果您使用 NSS 软件加密模块,这是默认设置:
Internal (Software) Token:password
Internal (Software) Token:password
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用硬件安全模块(HSM):
name_of_the_token:password
name_of_the_token:password
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
设置文件权限:
chown dirsrv:root /etc/dirsrv/slapd-<instance_name>/pin.txt chmod 400 /etc/dirsrv/slapd-<instance_name>/pin.txt
# chown dirsrv:root /etc/dirsrv/slapd-<instance_name>/pin.txt # chmod 400 /etc/dirsrv/slapd-<instance_name>/pin.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
重启实例:
dsctl <instance_name> restart
# dsctl <instance_name> restart
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果系统没有提示输入 NSS 数据库密码,目录服务器将使用密码文件。
当您在目录服务器中启用 TLS 加密时,您可以将实例配置为使用 CA 发布的证书。如果客户端现在使用 LDAPS 协议或 STARTTLS
命令建立到服务器的连接,目录服务器使用此证书加密连接。客户端实用程序使用 CA 证书来验证服务器证书是否有效。默认情况下,如果它们不信任服务器证书,则这些工具会取消连接。
例 1.1. 如果客户端工具没有使用 CA 证书,则可能会出现连接错误
dsconf
dsconf -D "cn=Directory Manager" ldaps://server.example.com:636 config get
# dsconf -D "cn=Directory Manager" ldaps://server.example.com:636 config get Error: {'desc': "Can't contact LDAP server", 'info': 'error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed (self signed certificate in certificate chain)'}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ldapsearch
ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x
# ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x Enter LDAP Password: ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要在 Red Hat Enterprise Linux 中启用客户端工具来验证证书目录服务器使用,请将 CA 证书添加到操作系统的信任存储中。
前提条件
您知道网络安全服务(NSS)数据库的密码。
如果您仍然使用在 Directory Server 实例安装过程中生成的密码,您可以在
/etc/dirsrv/slapd-<instance_name>/pwdfile.txt
文件以纯文本形式找到这个密码。
流程
如果您没有 Directory 服务器使用的 CA 证书的本地副本:
列出服务器网络安全服务(NSS)数据库中的证书:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 NSS 数据库中 CA 证书的别名导出 CA 证书:
certutil -d /etc/dirsrv/slapd-<instance_name>/ -L -n "Example CA" -a > /tmp/ds-ca.crt
# certutil -d /etc/dirsrv/slapd-<instance_name>/ -L -n "Example CA" -a > /tmp/ds-ca.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
将 CA 证书复制到
/etc/pki/ca-trust/source/anchors/
目录中:cp /tmp/ds-ca.crt /etc/pki/ca-trust/source/anchors/
# cp /tmp/ds-ca.crt /etc/pki/ca-trust/source/anchors/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重建 CA 信任数据库:
update-ca-trust
# update-ca-trust
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用 LDAPS 协议建立与目录服务器的连接。例如,运行查询:
ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base
# ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base
Copy to Clipboard Copied! Toggle word wrap Toggle overflow