保护红帽目录服务器
提高目录服务器的安全性
摘要
对红帽文档提供反馈
我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。要做到这一点:
第 1 章 启用到目录服务器的 TLS 加密连接
默认情况下,Red Hat Directory Server 在不加密的情况下提供 LDAP 服务。要提高安全性,您可以在 Directory 服务器中配置 TLS,使复制环境中的客户端或其他主机能够使用加密的连接。然后,他们可以在端口 389 或端口 636 上的 LDAPS 协议中使用 STARTTLS
命令进行安全连接。
您可以使用 bind Distinguished Name (DN)和密码或使用基于证书的身份验证来使用 TLS 与简单身份验证。
目录服务器的加密服务由 Mozilla 网络安全服务(NSS)提供,它是 TLS 和基本加密功能库。NSS 包含基于软件的加密令牌,其为联邦信息处理标准(FIPS) 140-2 认证。
1.1. 加密到 Directory 服务器的连接的不同选项
要使用加密连接连接到 Directory 服务器,您可以使用以下协议和框架:
- LDAPS
-
当您使用 LDAPS 协议时,连接开始使用加密,并可成功或失败。但是,不会通过网络发送未加密的数据。因此,首选使用 LDAPS 而不是通过未加密的 LDAP 使用
STARTTLS
。 - 使用 LDAP 的 STARTTLS
客户端通过 LDAP 协议建立未加密的连接,然后发送
STARTTLS
命令。如果命令成功,则所有进一步的通信都会被加密。警告如果
STARTTLS
命令失败,并且客户端不会取消连接,所有进一步的数据(包括身份验证信息)通过网络发送未加密。- SASL
- 简单身份验证和安全层(SASL)框架可让您使用外部身份验证方法(如 Kerberos)验证用户身份。
1.2. Directory 服务器如何解锁 NSS 数据库
目录服务器在网络安全服务(NSS)数据库中存储证书签名请求(CSR)、私钥和证书。安装新实例时,安装程序会自动创建 NSS 数据库并使用随机密码对其进行保护。安装程序在以下文件中存储这个密码:
-
/etc/dirsrv/slapd-instance_name/pwdfile.txt
:dsconf tls
命令使用此文件来访问 NSS 数据库。 /etc/dirsrv/slapd-instance_name/pin.txt
:此文件包含令牌和密码,以便在 Directory 服务器启动时自动解锁 NSS 数据库。- 如果您希望 Directory 服务器在每次启动实例时提示输入 NSS 数据库密码,请删除此文件。
- 如果您希望实例在不提示输入密码的情况下自动启动,请保留此文件并在更改 NSS 数据库密码时更新该文件。
如果 /etc/dirsrv/slapd-instance_name/pin.txt
文件不存在,您启动 Directory Server (启用加密)并在 NSS 数据库中设置密码,其行为如下:
如果
systemctl
ordsctl
实用程序启动ns-slapd
Directory Server 进程,systemd
服务会提示输入密码,并将输入自动传递给systemd-tty-ask-password-agent
程序:#
dsctl instance_name start
Enter PIN for Internal (Software) Token: (press TAB for no echo)在个别情况下,当
ns-slapd
Directory Server 进程没有由systemctl
或dsctl
程序启动,并且进程从终端分离时,Nns-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!
要输入密码:
#
systemd-tty-ask-password-agent
Enter PIN for Internal (Software) Token:
其他资源
1.3. 使用命令行启用与目录服务器的 TLS 加密连接
要使用 TLS 加密或基于证书的身份验证,您必须在网络安全服务(NSS)数据库中管理证书。当您创建实例时,dscreate
工具会在 /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" server.example.com server.example.net
如果将主机名指定为最后一个参数,该命令会通过
DNS:server.example.com 添加 Subject Alternative Name (SAN)扩展,DNS:server.example.net
条目到 CSR。
根据 RFC 1485,在
-s subject
参数中指定的字符串必须是有效的主题名称。subject 中的CN
字段是必需的,且您必须将它设置为服务器的完全限定域名(FQDN)。命令将 CSR 存储在/etc/dirsrv/slapd-instance_name/Server-Cert.csr
文件中。- 将 CSR 提交到证书颁发机构(CA)以获取签发的证书。详情请查看您的 CA 文档。
将 CA 发布的服务器证书导入到 NSS 数据库:
如果使用
dsctl tls generate-server-cert-csr
命令创建私钥,请输入:#
dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate add --file /root/instance_name.crt --name "server-cert" --primary-cert
请记住在
--name _certificate_nickname
参数中设置的证书名称。后续步骤中需要用到它。如果您使用外部实用程序创建了私钥,请导入服务器证书和私钥:
#
dsctl instance_name tls import-server-key-cert /root/server.crt /root/server.key
请注意,命令要求您首先指定服务器证书的路径,然后再指定私钥的路径。这个方法始终将证书的 nickname 设置为
Server-Cert
。
将 CA 证书导入到 NSS 数据库:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate add --file /root/ca.crt --name "Example CA"
设置 CA 证书的信任标记:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "CT,,"
这会将 Directory 服务器配置为信任 TLS 加密和基于证书的身份验证的 CA。
启用 TLS 并设置 LDAPS 端口:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-securePort=636 nsslapd-security=on
在
firewalld
服务中打开 LDAPS 端口:#
firewall-cmd --permanent --add-port=636/tcp
#firewall-cmd --reload
启用 RSA 密码系列、设置 NSS 数据库安全设备以及服务器证书名称:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com security rsa set --tls-allow-rsa-certificates on --nss-token "internal (software)" --nss-cert-name Server-Cert
默认情况下,NSS 数据库中安全设备的名称
为内部(软件)
可选:禁用纯文本 LDAP 端口:
#
dsconf inst security disable_plain_port
重启实例
#
dsctl instance_name restart
验证
使用 LDAPS 协议建立与目录服务器的连接。例如,运行查询:
#
ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base
如果命令失败,使用
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
后续步骤
其他资源
1.4. 使用 Web 控制台启用对 Directory 服务器的 TLS 加密连接
您可以使用 Web 控制台配置 TLS 加密。
前提条件
- 在 web 控制台中登录到实例。
流程
- 导航到 Server → Security → Certificate Management → Certificate Signing Request,再单击 Create Certificate Signing Request。
为证书签名请求(CSR)、通用名称(CN)和机构(O)设置名称:
如果您的主机可以被多个名称访问,请在 Subject Alternative Names 文件中设置替代名称。
- 单击 Create Certificate Signing Request。
查看 CSR 文本并复制它:
- 单击您要查看的 CSR 的 Node options 图标,然后选择 View CSR。
- 复制 CSR 内容。
- 将 CSR 文件提交到证书颁发机构(CA)以获取签发证书。详情请查看您的 CA 文档。
- 从 CA 获取证书时,导航到 Server → Security → Certificate Management → TLS Certificates,然后单击 Add Server Certificate。
为服务器证书设置唯一 nickname,上传发布的证书,然后点 Add Certificate。
请记住证书别名,因为后续步骤需要它。
- 导航到 Server → Security → Certificate Management → Trusted Certificate Authorities,然后单击 Add CA 证书。
- 为 CA 证书设置唯一 nickname,上传 CA 证书文件,然后点 Add Certificate。
可选:如果您在 Directory Server 实例安装过程中没有启用 TLS 加密,请启用它:
- 导航到 Server → Security Settings,再启用安全交换机。
- 在弹出窗口中点 Enable Security。
- 在 Security Setting 页面上,单击 Save Configuration。
在安全配置页面中的配置服务器证书名称:
- 导航到 Server → Security → Security Configuration。
- 在 Server Certificate Name 下拉列表中选择服务器证书 nickname,然后点 Save Configuration。
- 可选: 如果您在下拉列表中没有看到证书 nickname,请刷新 Security Settings 页面并再次执行上一步。
-
可选: 如果要使用
636
以外的 LDAPS 端口,请导航到 Server → Server Settings,设置 LDAPS 端口,然后点 Save。 在
firewalld
服务中打开 LDAPS 端口:#
firewall-cmd --permanent --add-port=636/tcp
#firewall-cmd --reload
可选:进入到 Server → Security → Security Configuration,选择 Require Secure Connections,点 Save Configuration。
目录服务器禁用纯文本 LDAP 端口。
- 点右上角的 Actions,然后选择 Restart Instance。
1.5. 如果证书已过期,则管理 Directory Server 的行为
默认情况下,如果启用了加密并且证书已过期,Directory 服务器会记录警告和服务启动。要更改此行为,请设置 nsslapd-validate-cert
参数。您可以将其设置为以下值:
-
Warn
: Directory 服务器启动并将有关过期证书的警告记录到/var/log/dirsrv/slapd-instance_name/error
日志文件。这是默认设置。 -
在 : Directory Server
上
验证证书。如果证书已过期,实例无法启动。 -
off
: Directory Server 不会验证证书过期日期。实例启动且不会记录任何警告。
前提条件
- 已配置了 TLS 加密。
流程
使用以下命令更改
nsslapd-validate-cert
参数:#
dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-validate-cert=<value>
1.6. 更改 NSS 数据库的密码
您可以更改网络安全服务(NSS)数据库的密码。例如,当密码被授权者知道时,请更改它。
前提条件
您知道当前 NSS 数据库密码。
如果您使用密码文件在 Directory Server 启动时自动解锁数据库,密码将以纯文本形式存储在
/etc/dirsrv/slapd-instance_name/pin.txt
文件中。
流程
使用以下命令更改 NSS 数据库密码:
#
certutil -d /etc/dirsrv/slapd-instance_name/ -W
Enter Password or Pin for "NSS Certificate DB": Enter a password which will be used to encrypt your keys. The password should be at least 8 characters long, and should contain at least one non-alphabetic character. Enter new password: Re-enter password: Password changed successfully.如果您使用密码文件自动启动 Directory 服务器而不提示输入 NSS 数据库密码,请将旧密码替换为
/etc/dirsrv/slapd-instance_name/pin.txt
中的新密码:如果您使用 NSS 软件加密模块,这是默认设置:
Internal (Software) Token:password
如果您使用硬件安全模块(HSM):
name_of_the_token:password
验证
对需要输入密码的 NSS 数据库执行操作。例如,列出实例的私钥:
#
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如果命令在输入新密码后显示预期的输出,则更改密码可以成功。
1.7. 创建密码文件以在不提示输入 NSS 数据库密码的情况下启动实例
当您创建新实例时,安装程序会自动创建 /etc/dirsrv/slapd-instance_name/pin.txt
文件,使 Directory 服务器在不提示输入网络安全服务(NSS)密码的情况下启动。但是,如果您删除了这个文件,您可以重新创建它。
密码以纯文本形式存储。如果服务器在不安全的环境中运行,则不要使用密码文件。
前提条件
- 您知道 NSS 数据库密码。
流程
使用以下内容创建
/etc/dirsrv/slapd-instance_name/pin.txt
文件:如果您使用 NSS 软件加密模块,这是默认设置:
Internal (Software) Token:password
如果您使用硬件安全模块(HSM):
name_of_the_token:password
设置文件权限:
#
chown dirsrv:root /etc/dirsrv/slapd-instance_name/pin.txt
#chmod 400 /etc/dirsrv/slapd-instance_name/pin.txt
验证
重启实例:
#
dsctl instance_name restart
如果系统不提示输入 NSS 数据库密码,Directory 服务器将使用密码文件。
1.8. 将目录服务器使用的 CA 证书添加到 Red Hat Enterprise Linux 的信任存储中
当您在 Directory 服务器中启用 TLS 加密时,您可以将实例配置为使用 CA 发布的证书。如果一个客户端现在使用 LDAPS 协议或使用 STARTTLS
命令通过 LDAP 建立到服务器的连接,则 Directory 服务器会使用这个证书来加密连接。客户端实用程序使用 CA 证书来验证服务器证书是否有效。默认情况下,如果这些工具不信任服务器证书,则这些实用程序会取消连接。
例 1.1. 如果客户端实用程序不使用 CA 证书,则可能的连接错误
dsconf
#
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)'}ldapsearch
#
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)
要在 Red Hat Enterprise Linux 上启用客户端实用程序来验证证书目录服务器使用,请将 CA 证书添加到操作系统的信任存储中。
前提条件
您知道网络安全服务(NSS)数据库的密码。
如果您仍然使用在 Directory Server 实例安装过程中生成的密码,您可以在
/etc/dirsrv/slapd-instance_name/pwdfile.txt
文件中找到此密码。
流程
如果您没有 Directory 服务器使用的 CA 证书的本地副本:
列出服务器网络安全服务(NSS)数据库中的证书:
#
certutil -d /etc/dirsrv/slapd-instance_name/ -L
Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI Example CA C,, Server-Cert u,u,u使用 NSS 数据库中 CA 证书的别名导出 CA 证书:
#
certutil -d /etc/dirsrv/slapd-instance_name/ -L -n "Example CA" -a > /tmp/ds-ca.crt
将 CA 证书复制到
/etc/pki/ca-trust/source/anchors/
目录中:#
cp /tmp/ds-ca.crt /etc/pki/ca-trust/source/anchors/
重建 CA 信任数据库:
#
update-ca-trust
验证
使用 LDAPS 协议建立与目录服务器的连接。例如,运行查询:
#
ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x -s base
其他资源
-
update-ca-trust (8)
man page
第 2 章 配置支持的 TLS 协议版本
在 Red Hat Enterprise Linux 9 中,所有系统范围的加密策略配置集将 TLS 1.2 定义为最小值。因此,这个 TLS 版本也是目录服务器中最低的版本。但是,如果您只拥有支持较新的 TLS 版本的客户端,您可以将更高的协议版本设置为最小,以提高安全性。
2.1. 使用命令行设置最小和最大 TLS 协议版本
您可以使用命令行设置最小和最大 TLS 协议。
不要设置最大 TLS 协议。如果您这样做,您的客户端可能需要使用较弱的 TLS 协议作为其默认标准。如果您没有设置最大 TLS 版本,Directory 服务器总是使用支持最强的版本。
前提条件
- 您在 Directory 服务器中启用了 TLS 加密。
流程
可选:显示 Directory 服务器中当前启用的 TLS 协议:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security get | egrep -i "sslVersionMin|sslVersionMax" sslversionmin: TLS1.2 sslversionmax: TLS1.3
设置最小 TLS 协议。例如,要将它设置为 TLS 1.3,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-protocol-min="TLS1.3"
请注意,您无法将参数设置为比 TLS 1.2 低的值,这是所有 RHEL 系统范围的加密策略配置集的最低值。
不建议:设置支持最高的 TLS 协议:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-protocol-max="TLS1.3"
如果将
--tls-protocol-max
设置为小于--tls-protocol-min
的值,则 Directory 服务器会将最大协议设置为与最小值相同的值。要始终使用强大的支持加密协议作为支持的最大 TLS 版本,请不要设置
--tls-protocol-max
。重启实例:
# dsctl instance_name restart
验证
显示支持的 TLS 协议:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security get | egrep -i "sslVersionMin|sslVersionMax" sslversionmin: TLS1.3 sslversionmax: TLS1.3
使用
openssl
实用程序使用特定的 TLS 协议建立安全客户端连接:# echo | openssl s_client -connect server.example.com:636 -tls1_3 ... New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256 ...
2.2. 使用 web 控制台设置最小和最大 TLS 协议版本
您可以使用 Web 控制台设置最小和最大 TLS 协议
不要设置最大 TLS 协议。如果您这样做,您的客户端可能需要使用较弱的 TLS 协议作为其默认标准。如果您没有设置最大 TLS 版本,Directory 服务器总是使用支持最强的版本。
前提条件
- 您在 Directory 服务器中启用了 TLS 加密。
- 您已登录到 web 控制台中的 Directory Server 实例。
流程
- 导航到 Server → Security。
-
在
Minimum TLS Version
字段中设置最小 TLS 协议。 -
不建议:在
Maximum TLS Version
字段中设置支持最高的 TLS 协议。 - 点 Save Settings。
-
点击右上角的 Actions,然后选择
Restart Instance
。
验证
使用
openssl
实用程序使用特定的 TLS 协议建立安全客户端连接:# echo | openssl s_client -connect server.example.com:636 -tls1_3 ... New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256 ...
第 3 章 对于加密的连接需要 LDAPS 或 STARTTLS
要防止通过网络发送未加密的密码,您可以将 Directory 服务器配置为要求用户在连接到服务器时使用 LDAPS 或 STARTTLS 加密。
3.1. 使用命令行配置 Directory Server,以只接受使用 LDAPS 或 STARTTLS 加密的连接
默认情况下,Directory 服务器允许使用绑定 DN 和密码进行未加密的连接进行身份验证,这是一个安全风险。假设您不能使用其他安全机制,如基于证书的身份验证或 SASL。在这种情况下,您可以使用 TLS 或 STARTTLS 将 Directory 服务器配置为在向服务器进行身份验证时需要加密的连接。
绑定操作需要安全连接仅适用于经过身份验证的绑定。在没有密码的情况下绑定操作(如匿名和未经身份验证的绑定)可以继续进行标准连接。
前提条件
- 您已经配置了服务器到服务器的连接,如复制协议,以使用安全绑定。
流程
将
nsslapd-require-secure-binds
配置参数设置为on
:# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-require-secure-binds=on
可选: 如果要使用 LDAPS,请禁用纯文本 LDAP 端口:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security disable_plain_port
重启实例:
# dsctl instance_name restart
当您启用此功能时,所有连接都需要它。例如,这包括复制协议、同步和数据库链。
其他资源
3.2. 使用 Web 控制台配置 Directory 服务器来接受使用 LDAPS 或 STARTTLS 加密的连接
默认情况下,Directory 服务器允许使用绑定 DN 和密码进行未加密的连接进行身份验证,这是一个安全风险。假设您不能使用其他安全机制,如基于证书的身份验证或 SASL。在这种情况下,您可以使用 TLS 或 STARTTLS 将 Directory 服务器配置为在向服务器进行身份验证时需要加密的连接。
绑定操作需要安全连接仅适用于经过身份验证的绑定。在没有密码的情况下绑定操作(如匿名和未经身份验证的绑定)可以继续进行标准连接。
前提条件
- 您已经配置了服务器到服务器的连接,如复制协议,以使用安全绑定。
- 在 web 控制台中登录到实例。
流程
-
进入到 Server → Security → Security Configuration,选择
Require Secure Connections
选项,点 Save Configuration。 -
可选:如果要使用 LDAPS,进入到 Server → Server Settings → General Settings,将
LDAP Port
设置为0
来禁用明文 LDAP 端口。点 Save。 -
点击右上角的 Actions,然后选择
Restart Instance
。
当您启用此功能时,所有连接都需要它。例如,这包括复制协议、同步和数据库链。
其他资源
第 4 章 更新 Directory 服务器支持的密码列表
要建立加密的连接,目录服务器和客户端需要至少一个通用密码。例如,如果传统应用程序需要在 Directory 服务器中默认启用了密码,您可以启用它。
4.1. 默认密码和可用密码之间的区别
您可以使用 nsSSL3Ciphers
参数中的以下关键字之一来列出独立密码:
默认
:请参阅网络安全服务(NSS)中启用的默认密码。要显示列表,请输入:# /usr/lib64/nss/unsupported-tools/listsuites | grep -B1 --no-group-separator "Enabled"
default
关键字是nsSSL3Ciphers
参数的默认值。All
:请参阅 Directory Server 中的所有支持的密码。要显示列表,请输入:# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list --supported
当只想启用特定密码时,请使用
all
关键字。例如,将nsSSL3Ciphers
设置为-all,+TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
配置目录服务器以禁用所有密码,并仅启用TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
。
4.2. 弱密码
默认情况下,Directory 服务器会拒绝弱密码,而且您必须配置目录服务器来支持它们。
密码被视为弱点,如果:
它们可以被导出。
可导出的密码在密码名称中被标记为
EXPORT
。例如,在TLS_RSA_EXPORT_WITH_RC4_40_MD5
中。与
3DES
算法相比,它们是对称和弱器。对于加密和解密,对称加密都使用相同的加密密码。
- 密钥长度比 128 位短。
4.3. 设置加密目录服务器支持使用命令行
要更新目录服务器中支持的密码列表,请更新 nsSSL3Ciphers
参数。
前提条件
- 您在 Directory 服务器中启用了 TLS 加密。
流程
显示启用的密码列表:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list default
default
关键字表示只启用网络安全服务(NSS)中启用的密码。如果您需要启用弱密码,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security set --allow-insecure-ciphers on
更新
nsSSL3Ciphers
参数。例如:要仅启用TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
和TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
密码,请输入:# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers set -- "-all,+TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,+TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
使用
--
可以防止 shell 将-all
中的-
字符解析为命令的一个选项。不要使用\
字符转义-all
,因为它可能会出错,这会导致不同的密码选择。重启实例:
# dsctl instance_name restart
验证
显示启用的密码列表:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list default +TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 +TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
其他资源
4.4. 使用 Web 控制台设置加密目录服务器支持
您可以在 Directory Server web 控制台的 Cipher Preferences
菜单中配置密码设置。
前提条件
- 您在 Directory 服务器中启用了 TLS 加密。
- 在 web 控制台中登录到实例。
流程
如果您需要启用弱密码:
- 进入到 Server → Security → Security Configuration。
-
选择
Allow Weak Ciphers
。 -
点
Save Settings
。
- 导航到 Server → Security → Cipher Preferences。
更新密码设置。例如,仅启用
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
和TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
密码:-
在
Cipher Suite
字段中选择No Ciphers
。 -
在
Allow Specific Ciphers
字段中输入TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
。
-
在
- 点 Save Settings。
- 点 Actions → Restart Instance。
验证
-
导航到 Server → Security → Cipher Preferences。
Enabled Ciphers
列表显示启用的密码。
第 5 章 更改 CA 信任标志
证书颁发机构(CA)信任标志定义了目录服务器信任 CA 证书的情况。例如,您可以将标志设置为信任到服务器的 TLS 连接的证书,以及用于基于证书的身份验证。
5.1. 使用命令行更改 CA 信任标志
您可以在证书颁发机构(CA)证书上设置以下信任标记:
-
c
: Trusted CA -
T
: Trusted CA 客户端身份验证 -
c
: Valid CA -
P
: Trusted peer -
P
: Valid peer -
U
:私钥
您可以使用三种类别指定信任标志: TLS、电子邮件、对象签名
例如,要信任 TLS 加密和基于证书的验证的 CA,请将信任标志设置为 CT,
。
前提条件
- 您可以将 CA 证书导入到网络安全服务(NSS)数据库。
流程
使用以下命令更改 CA 证书的信任标志:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "trust_flags"
验证
显示 NSS 数据库中的所有证书:
#
certutil -d /etc/dirsrv/slapd-instance_name/ -L
Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI Example CA CT,,
其他资源
-
certutil(1)
手册页
5.2. 使用 Web 控制台更改 CA 信任标志
您可以使用 Web 控制台更改 CA 信任标志。
前提条件
- 您可以将 CA 证书导入到网络安全服务(NSS)数据库。
流程
- 导航到 Server → Security → Certificate Management → Trusted Certificate Authorities。
-
点 CA 证书旁边的 … 图标,然后选择
Edit Trust Flags
。 选择信任标志。
- 点 Save
验证
- 导航到 Server → Security → Certificate Management → Trusted Certificate Authorities。
- 点 CA 证书旁的 > 显示信任标记。
第 6 章 续订 TLS 证书
TLS 证书具有过期日期和时间。要持续提供安全连接,请在 Directory Server 过期前更新服务器证书。
6.1. 使用命令行更新 TLS 证书
在 TLS 服务器证书过期以续订它前按照以下步骤操作。
前提条件
- 未配置属性加密。
- TLS 证书将在不久的将来过期。
流程
创建私钥和证书签名请求(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" server.example.com server.example.net
如果将主机名指定为最后一个参数,该命令会通过
DNS:server.example.com 添加 Subject Alternative Name (SAN)扩展,DNS:server.example.net
条目到 CSR。
根据 RFC 1485,在
-s subject
参数中指定的字符串必须是有效的主题名称。subject 中的CN
字段是必需的,且您必须将它设置为服务器的完全限定域名(FQDN)。命令将 CSR 存储在/etc/dirsrv/slapd-instance_name/Server-Cert.csr
文件中。- 将 CSR 提交到证书颁发机构(CA)以获取签发的证书。详情请查看您的 CA 文档。
-
将 CA 证书和服务器证书存储在
/root/
目录中。 使用以下选项之一将 CA 发布的服务器证书导入到 NSS 数据库:
如果使用
dsctl tls generate-server-cert-csr
命令创建私钥,请输入:# dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate add --file /root/instance_name.crt --name "server-cert" --primary-cert
请记住在
--name _certificate_nickname
参数中设置的证书名称。后续步骤中需要用到它。如果您使用外部实用程序创建了私钥,请导入服务器证书和私钥:
# dsctl instance_name tls import-server-key-cert /root/server.crt /root/server.key
请注意,命令要求您首先指定服务器证书的路径,然后再指定私钥的路径。这个方法始终将证书的 nickname 设置为
Server-Cert
。
将 CA 证书导入到 NSS 数据库:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate add --file /root/ca.crt --name "Example CA"
设置 CA 证书的信任标记:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "CT,,"
这会将 Directory 服务器配置为信任 TLS 加密和基于证书的身份验证的 CA。
停止实例:
# dsctl instance_name stop
编辑
/etc/dirsrv/slapd-instance_name/dse.ldif
文件,并删除以下条目,包括它们的属性:-
cn=AES,cn=encrypted 属性 keys,cn=database_name,cn=ldbm database,cn=plugins,cn=config
-
cn=3DES,cn=encrypted 属性 key,cn=database_name,cn=ldbm database,cn=plugins,cn=config
重要删除所有数据库的条目。如果包含
nsSymmetricKey
属性的任何条目都保留在/etc/dirsrv/slapd-instance_name/dse.ldif
文件中,Directory 服务器将无法启动。-
启动实例:
# dsctl instance_name start
第 7 章 配置基于证书的身份验证
目录服务器支持 LDAP 客户端和服务器到服务器连接(如复制拓扑)的基于证书的身份验证。
根据配置,客户端可以或必须使用证书进行身份验证。在验证证书后,根据证书的主题字段中的属性,服务器将搜索 目录中的用户。如果搜索只返回一个用户条目,Directory 服务器会将此用户用于所有进一步的操作。另外,您可以配置用于身份验证的证书必须与用户条目的 userCertificate
属性中存储的证书匹配。
使用基于证书的身份验证的好处:
- 提高了效率:与证书数据库密码进行身份验证,然后为所有后续绑定或身份验证操作使用该证书比重复提供可分辨的名称(DN)和密码更有效。
- 提高安全性:由于基于证书的验证使用公钥加密,因此基于证书的身份验证更为安全,而非certificate 绑定操作。攻击者无法通过网络拦截绑定凭证。如果证书或设备丢失,则在没有 PIN 的情况下使用,因此很容易与第三方的干扰,比如网络攻击。
7.1. 设置基于证书的身份验证
前提条件
- 您在 Directory 服务器中启用了 TLS 加密。
-
您在网络安全服务(NSS)数据库中为证书颁发机构(CA)证书设置
CT
标志。
流程
创建
/etc/dirsrv/slapd-instance_name/certmap.conf
文件,将证书中的信息映射到 Directory Server 用户:certmap default default default:DNComps dc default:FilterComps mail,cn default:VerifyCert on certmap example cn=Example CA example:DNComps
使用此配置,对于由
cn=Example CA
发布的证书,Directory 服务器不会从证书主题生成基本 DN,因为DNComps
参数为此签发者设置了空的。另外,FilterComps
和VerifyCert
的设置从默认条目继承。带有与
cn=Example CA
不同的签发者 DN 的证书将使用 default 条目中的设置,并根据证书主体中的 cn 属性生成基本 DN。这可让 Directory Server 在特定 DN 下启动搜索,而不搜索整个目录。对于所有证书,Directory 服务器使用证书主体中的
mail
和cn
属性生成搜索过滤器。但是,如果主题中没有mail
属性,Directory 服务器将自动使用主题中证书 e 属性的值。启用基于证书的身份验证。例如,要将基于证书的身份验证配置为可选,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-client-auth="allowed"
使用
--tls-client-auth=required
选项将基于证书的身份验证配置为强制性。可选:如果您根据需要配置了基于证书的身份验证,请启用
nsslapd-require-secure-binds
参数:# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-require-secure-binds=on
此设置确保用户无法使用未加密的连接绕过基于证书的身份验证。
可选:如果 Directory 服务器应该使用证书中的身份而不是绑定请求中的凭证,请将 Directory 服务器配置为使用
EXTERNAL
简单验证和安全层(SASL)机制:# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-force-sasl-external=on
使用这个设置时,Directory 服务器会忽略与证书中身份以外的任何其他绑定方法。
重启实例:
# dsctl instance_name restart
后续步骤:
-
如果您配置了 Directory 服务器,以便身份验证证书必须与用户的
userCertificate
属性中存储的证书匹配,请将证书添加到用户条目。详情请查看 第 7.2 节 “将证书添加到用户”
其他资源
- 启用到目录服务器的 TLS 加密连接
- 更改 CA 信任标志
-
certmap.conf (5)
手册页
7.2. 将证书添加到用户
当您设置基于证书的身份验证时,您可以配置服务器,以便用于身份验证的证书必须与用户 userCertificate
二进制文件中存储的证书匹配。如果您启用了这个功能,您必须将受影响用户的证书添加到其目录条目中。
前提条件
- 在 Directory 服务器中启用了基于证书的身份验证。
- 您有一个由服务器信任的证书颁发机构(CA)发布的客户端证书。
- 客户端证书是可分辨的编码规则(DER)格式。
-
客户端证书满足服务器上
/etc/dirsrv/slapd-instance_name/certmap.conf
中设置的要求。
流程
如果证书不是 DER 格式,请将其转换。例如,要将证书从隐私增强的邮件(PEM)转换为 DER,请输入:
# openssl x509 -in /home/user_name/certificate.pem -out /home/user_name/certificate.der -outform DER
将证书添加到用户的
userCertificate
属性中:# ldapmodify -D "cn=Directory Manager" -W -H ldaps://server.example.com -x dn: uid=user_name,ou=People,dc=example,dc=com changetype: modify add: userCertificate userCertificate:< file:///home/user_name/example.der
验证
使用基于证书的身份验证以用户身份进行身份验证:
将以下环境变量设置为 CA 证书、用户密钥和用户证书的对应路径:
LDAPTLS_CACERT=/home/user_name/CA.crt LDAPTLS_KEY=/home/user_name/user.key LDAPTLS_CERT=/home/user_name/user.der
另外,还可在当前用户的
~/.ldaprc
文件中设置TLS_CACERT
、TLS_KEY
和TLS_CERT
参数。连接到服务器:
# ldapwhoami -H ldaps://server.example.com -Y EXTERNAL dn: uid=example,ou=people,dc=example,dc=com
其他资源
-
ldap.conf (5)
man page 中的TLS OPTIONS
部分
第 8 章 使用基于证书的身份验证配置多位复制
当您在两个 Directory 服务器实例之间设置复制时,您可以使用基于证书的身份验证,而不使用绑定 DN 和密码向复制合作伙伴进行身份验证。
您可以通过在复制拓扑中添加新服务器并使用基于证书的身份验证来设置新主机和现有服务器之间的复制协议,来实现此目的。
基于证书的验证需要 TLS 加密的连接。
8.1. 准备帐户和绑定组,以便在复制协议与基于证书的身份验证中使用
要在复制协议中使用基于证书的身份验证,首先准备帐户并将客户端证书存储在这些帐户的 userCertificate
属性中。另外,这个过程会创建一个稍后在复制协议中使用的绑定组。
在现有主机 server1.example.com
上执行此步骤。
前提条件
- 您在 Directory 服务器中启用了 TLS 加密。
您已将客户端证书以区分编码规则(DER)格式保存在
/root/server1.der
和/root/server2.der
文件中。有关客户端证书以及如何从您的证书颁发机构(CA)请求它们的详情,请参考您的 CA 文档。
流程
如果不存在,请创建
ou=services
条目:# ldapadd -D "cn=Directory Manager" -W -H ldaps://server1.example.com -x dn: ou=services,dc=example,dc=com objectClass: organizationalunit objectClass: top ou: services
为两个服务器创建帐户,如
cn=server1,ou=services,dc=example,dc=com
和cn=server1,ou=services,dc=example,dc=com
:# ldapadd -D "cn=Directory Manager" -W -H ldaps://server1.example.com -x dn: cn=server1,ou=services,dc=example,dc=com objectClass: top objectClass: person objectClass: inetOrgPerson sn: server1 cn: server1 userPassword: password userCertificate:< file:///root/server1.der adding new entry "cn=server1,ou=services,dc=example,dc=com" dn: cn=server2,ou=services,dc=example,dc=com objectClass: top objectClass: person objectClass: inetOrgPerson sn: server2 cn: server2 userPassword: password userCertificate:< file:///root/server2.der adding new entry "cn=server2,ou=services,dc=example,dc=com"
创建一个组,如
cn=repl_servers,dc=groups,dc=example,dc=com
:# dsidm -D "cn=Directory Manager" ldaps://server1.example.com -b "dc=example,dc=com" group create --cn "repl_servers"
将两个复制帐户作为成员添加到组中:
# dsidm -D "cn=Directory Manager" ldaps://server1.example.com -b "dc=example,dc=com" group add_member repl_servers "cn=server1,ou=services,dc=example,dc=com" # dsidm -D "cn=Directory Manager" ldaps://server1.example.com -b "dc=example,dc=com" group add_member repl_servers "cn=server2,ou=services,dc=example,dc=com"
其他资源
8.2. 使用临时复制管理器帐户初始化新服务器
基于证书的验证使用存储在 目录中的证书。但是,在初始化新服务器之前,server2.example.com
上的数据库为空,并且具有相关证书的帐户不存在。因此,在初始化数据库前无法使用证书进行复制。您可以使用临时复制管理器帐户初始化 server2.example.com
来解决此问题。
前提条件
-
在
server2.example.com
上安装了 Directory Server 实例。 -
dc=example,dc=com
后缀的数据库存在。 -
您在
server1.example.com
和server2.example.com
上的目录服务器中启用 TLS 加密。
流程
在
server2.example.com
上,为dc=example,dc=com
后缀启用复制:# dsconf -D "cn=Directory Manager" ldaps://server2.example.com replication enable --suffix "dc=example,dc=com" --role "supplier" --replica-id 2 --bind-dn "cn=replication manager,cn=config" --bind-passwd "password"
此命令将
server2.example.com
主机配置为dc=example,dc=com
后缀的供应商,并将此主机的副本 ID 设置为2
。另外,命令创建了临时cn=replication manager,cn=config
用户,其指定了密码,并允许此帐户复制该主机的后缀更改。副本 ID 必须是
1
到65534
之间的唯一整数,用于拓扑中的所有供应商的后缀。在
server1.example.com
上:启用复制:
# dsconf -D "cn=Directory Manager" ldaps://server1.example.com replication enable --suffix="dc=example,dc=com" --role="supplier" --replica-id="1"
创建一个临时复制协议,它使用上一步中的临时帐户进行身份验证:
# dsconf -D "cn=Directory Manager" ldaps://server1.example.com repl-agmt create --suffix="dc=example,dc=com" --host="server1.example.com" --port=636 --conn-protocol=LDAPS --bind-dn="cn=Replication Manager,cn=config" --bind-passwd="password" --bind-method=SIMPLE --init temporary_agreement
验证
验证初始化是否成功:
# dsconf -D "cn=Directory Manager" ldaps://server1.example.com repl-agmt init-status --suffix "dc=example,dc=com" temporary_agreement Agreement successfully initialized.
8.3. 使用基于证书的身份验证配置多位复制
在具有基于证书的验证的多代复制环境中,副本会利用证书对方进行身份验证。
前提条件
-
您在两个主机上为
server1.example.com
和server2.example.com
设置基于证书的身份验证。 - 目录服务器信任发布客户端证书的证书颁发机构(CA)。
-
客户端证书满足服务器上
/etc/dirsrv/slapd-instance_name/certmap.conf
中设置的要求。
流程
在
server1.example.com
上:删除临时复制协议:
# dsconf -D "cn=Directory Manager" ldaps://server1.example.com repl-agmt delete --suffix="dc=example,dc=com" temporary_agreement
将
cn=repl_servers,dc=groups,dc=example,dc=com
绑定组添加到复制设置中:# dsconf -D "cn=Directory Manager" ldaps://server1.example.com replication set --suffix="dc=example,dc=com" --repl-bind-group "cn=repl_servers,dc=groups,dc=example,dc=com"
配置 Directory 服务器,以自动检查绑定组中的更改:
# dsconf -D "cn=Directory Manager" ldaps://server1.example.com replication set --suffix="dc=example,dc=com" --repl-bind-group-interval=0
在
server2.example.com
上:删除临时复制管理器帐户:
# dsconf -D "cn=Directory Manager" ldaps://server2.example.com replication delete-manager --suffix="dc=example,dc=com" --name="Replication Manager"
将
cn=repl_servers,dc=groups,dc=example,dc=com
绑定组添加到复制设置中:# dsconf -D "cn=Directory Manager" ldaps://server2.example.com replication set --suffix="dc=example,dc=com" --repl-bind-group "cn=repl_servers,dc=groups,dc=example,dc=com"
配置 Directory 服务器,以自动检查绑定组中的更改:
# dsconf -D "cn=Directory Manager" ldap://server2.example.com replication set --suffix="dc=example,dc=com" --repl-bind-group-interval=0
使用基于证书的身份验证创建复制协议:
dsconf -D "cn=Directory Manager" ldaps://server2.example.com repl-agmt create --suffix="dc=example,dc=com" --host="server1.example.com" --port=636 --conn-protocol=LDAPS --bind-method="SSLCLIENTAUTH" --init server2-to-server1
在
server1.example.com
上,使用基于证书的身份验证创建复制协议:dsconf -D "cn=Directory Manager" ldaps://server1.example.com repl-agmt create --suffix="dc=example,dc=com" --host="server2.example.com" --port=636 --conn-protocol=LDAPS --bind-method="SSLCLIENTAUTH" --init server1-to-server2
验证
在每台服务器中验证初始化是否成功:
# dsconf -D "cn=Directory Manager" ldaps://server1.example.com repl-agmt init-status --suffix "dc=example,dc=com" server1-to-server2 Agreement successfully initialized. # dsconf -D "cn=Directory Manager" ldaps://server2.example.com repl-agmt init-status --suffix "dc=example,dc=com" server2-to-server1 Agreement successfully initialized.
其他资源
第 9 章 加密复制更改日志
如果攻击者获得服务器文件系统的访问权限,加密复制更改日志以增强您的实例的安全性。
更改日志加密使用服务器的 TLS 加密密钥和相同的 PIN 解锁密钥。您必须在服务器启动时手动输入 PIN,或使用 PIN 文件。
目录服务器使用随机生成的对称密码密钥来加密和解密 changelog。服务器为每个配置的密码使用单独的密钥。这些密钥使用服务器 TLS 证书中的公钥进行嵌套,生成的密钥将存储在服务器配置文件中。属性加密的有效强度与用于嵌套的 TLS 密钥的优点相同。如果没有访问服务器的私钥和 PIN,则无法从嵌套的副本中恢复对称密钥。
9.1. 使用命令行加密 changelog
要在复制拓扑中提高安全性,请加密供应商和 hub 上的更改日志。这个步骤描述了如何为 dc=example,dc=com
后缀启用 changelog 加密。
前提条件
- 服务器启用了 TLS 加密。
- 主机是复制拓扑中的供应商或 hub。
流程
将 changelog 导出到
/tmp/changelog.ldif
文件:#
dsconf -D "cn=Directory Manager" ldap://server.example.com replication export-changelog to-ldif -o /tmp/changelog.ldif -r "dc=example,dc=com"
为
dc=example,dc=com
后缀启用更改日志加密:#
dsconf -D "cn=Directory Manager" ldap://server.example.com replication --suffix "dc=example,dc=com" --encrypt
从
/tmp/changelog.ldif
文件中导入 changelog:#
dsconf -D "cn=Directory Manager" ldap://server.example.com replication import-changelog from-ldif -r "dc=example,dc=com" /tmp/changelog.ldif
重启实例:
#
dsctl instance_name restart
验证
- 在 LDAP 目录中进行更改,例如更新条目。
停止实例:
#
dsctl instance_name stop
列出后缀及其对应的数据库:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
dc=example,dc=com (userroot)记录启用 changelog 加密的数据库名称。
输入以下命令显示 changelog 的部分:
#
dbscan -f /var/lib/dirsrv/slapd-instance_name/db/userroot/replication_changelog.db | tail -50
如果对更改日志进行加密,您只看到加密的数据。
启动该实例。
#
dsctl instance_name start
其他资源
第 10 章 启用组的成员备份 Directory 服务器,并执行备份作为其中一个组成员
您可以配置组成员有备份实例的权限并执行备份。这会增加安全性,因为您不再需要在备份脚本或 cron 作业中设置 cn=Directory Manager
的凭证。另外,您可以通过修改组来轻松授予和撤销备份权限。
10.1. 启用一个组来备份 Directory 服务器
使用这个步骤添加 cn=backup_users,ou=groups,dc=example,dc=com
组,并启用此组的成员来创建备份任务。
前提条件
-
数据库中存在条目
ou=groups,dc=example,dc=com
。
流程
创建
cn=backup_users,ou=groups,dc=example,dc=com
组:#
dsidm -D "cn=Directory manager" ldap://server.example.com -b "dc=example,dc=com" group create --cn backup_users
添加一个访问控制指令(ACI),允许
cn=backup_users,ou=groups,dc=example,dc=com
组的成员创建备份任务:#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com
dn: cn=config changetype: modify add: aci aci: (target = "ldap:///cn=backup,cn=tasks,cn=config")(targetattr="*") (version 3.0 ; acl "permission: Allow backup_users group to create backup tasks" ; allow (add, read, search) groupdn = "ldap:///cn=backup_users,ou=groups,dc=example,dc=com";) - add: aci aci: (target = "ldap:///cn=config")(targetattr = "nsslapd-bakdir || objectClass") (version 3.0 ; acl "permission: Allow backup_users group to access bakdir attribute" ; allow (read,search) groupdn = "ldap:///cn=backup_users,ou=groups,dc=example,dc=com";)创建用户:
创建用户帐户:
#
dsidm -D "cn=Directory manager" ldap://server.example.com -b "dc=example,dc=com" user create --uid="example" --cn="example" --uidNumber="1000" --gidNumber="1000" --homeDirectory="/home/example/" --displayName="Example User"
在用户帐户上设置密码:
#
dsidm -D "cn=Directory manager" ldap://server.example.com -b "dc=example,dc=com" account reset_password "uid=example,ou=People,dc=example,dc=com" "password"
将
uid=example,ou=People,dc=example,dc=com
用户添加到cn=backup_users,ou=groups,dc=example,dc=com
组:#
dsidm -D "cn=Directory manager" ldap://server.example.com -b "dc=example,dc=com" group add_member backup_users uid=example,ou=People,dc=example,dc=com
验证
显示
cn=config
条目中设置的 ACI:#
ldapsearch -o ldif-wrap=no -LLLx -D "cn=directory manager" -W -H ldap://server.example.com -b cn=config aci=* aci -s base
dn: cn=config aci: (target = "ldap:///cn=backup,cn=tasks,cn=config")(targetattr="*")(version 3.0 ; acl "permission: Allow backup_users group to create backup tasks" ; allow (add, read, search) groupdn = "ldap:///cn=backup_users,ou=groups,dc=example,dc=com";) aci: (target = "ldap:///cn=config")(targetattr = "nsslapd-bakdir || objectClass")(version 3.0 ; acl "permission: Allow backup_users group to access bakdir attribute" ; allow (read,search) groupdn = "ldap:///cn=backup_users,ou=groups,dc=example,dc=com";) ...
10.2. 以普通用户身份执行备份
您可以以普通用户身份而不是 cn=Directory Manager
执行备份。
前提条件
-
您启用了
cn=backup_users,ou=groups,dc=example,dc=com
组的成员来执行备份。 -
用于执行备份的用户是
cn=backup_users,ou=groups,dc=example,dc=com
组的成员。
流程
使用以下方法之一创建备份任务:
使用
dsconf 备份 create
命令:#
dsconf -D "uid=example,ou=People,dc=example,dc=com" ldap://server.example.com backup create
通过手动创建任务:
#
ldapadd -D "uid=example,ou=People,dc=example,dc=com" -W -H ldap://server.example.com
dn: cn=backup-2021_07_23_12:55_00,cn=backup,cn=tasks,cn=config changetype: add objectClass: extensibleObject nsarchivedir: /var/lib/dirsrv/slapd-instance_name/bak/backup-2021_07_23_12:55_00 nsdatabasetype: ldbm database cn: backup-2021_07_23_12:55_00
验证
验证备份是否已创建:
#
ls -l /var/lib/dirsrv/slapd-instance_name/bak/
total 0 drwx------. 3 dirsrv dirsrv 108 Jul 23 12:55 backup-2021_07_23_12_55_00 ...
其他资源
第 11 章 启用组的成员导出数据并执行导出作为其中一个组成员
您可以配置组成员有导出数据的权限。这会提高安全性,因为您不再需要在脚本中设置 cn=Directory Manager
的凭证。另外,您可以通过修改组来轻松授予和撤销导出权限。
11.1. 启用组导出数据
使用这个步骤添加 cn=export_users,ou=groups,dc=example,dc=com
组,并启用此组的成员来创建导出任务。
流程
创建
cn=export_users,ou=groups,dc=example,dc=com
组:#
dsidm -D "cn=Directory manager" ldap://server.example.com -b "dc=example,dc=com" group create --cn export_users
添加访问控制指令(ACI),允许
cn=export_users,ou=groups,dc=example,dc=com
组的成员创建导出任务:#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com
dn: cn=config changetype: modify add: aci aci: (target = "ldap:///cn=export,cn=tasks,cn=config") (targetattr="*") (version 3.0 ; acl "permission: Allow export_users group to export data" ; allow (add, read, search) groupdn = "ldap:///cn=export_users,ou=groups,dc=example,dc=com";) - add: aci aci: (target = "ldap:///cn=config")(targetattr = "objectclass || cn || nsslapd-suffix || nsslapd-ldifdir") (version 3.0 ; acl "permission: Allow export_users group to access ldifdir attribute" ; allow (read,search) groupdn = "ldap:///cn=export_users,ou=groups,dc=example,dc=com";)创建用户:
创建用户帐户:
#
dsidm -D "cn=Directory manager" ldap://server.example.com -b "dc=example,dc=com" user create --uid="example" --cn="example" --uidNumber="1000" --gidNumber="1000" --homeDirectory="/home/example/" --displayName="Example User"
在用户帐户上设置密码:
#
dsidm -D "cn=Directory manager" ldap://server.example.com -b "dc=example,dc=com" account reset_password "uid=example,ou=People,dc=example,dc=com" "password"
将
uid=example,ou=People,dc=example,dc=com
用户添加到cn=export_users,ou=groups,dc=example,dc=com
组:#
dsidm -D "cn=Directory manager" ldap://server.example.com -b "dc=example,dc=com" group add_member export_users uid=example,ou=People,dc=example,dc=com
验证
显示
cn=config
条目中设置的 ACI:#
ldapsearch -o ldif-wrap=no -LLLx -D "cn=directory manager" -W -H ldap://server.example.com -b cn=config aci=* aci -s base
dn: cn=config aci: (target = "ldap:///cn=export,cn=tasks,cn=config")(targetattr="*")(version 3.0 ; acl "permission: Allow export_users group to export data" ; allow (add, read, search) groupdn = "ldap:///cn=export_users,ou=groups,dc=example,dc=com";) aci: (target = "ldap:///cn=config")(targetattr = "objectclass || cn || nsslapd-suffix || nsslapd-ldifdir")(version 3.0 ; acl "permission: Allow export_users group to access ldifdir attribute" ; allow (read,search) groupdn = "ldap:///cn=export_users,ou=groups,dc=example,dc=com";) ...
11.2. 以普通用户身份执行导出
您可以以普通用户身份而不是 cn=Directory Manager
执行导出。
前提条件
-
您启用了
cn=export_users,ou=groups,dc=example,dc=com
组的成员以导出数据。 -
用于执行导出的用户是
cn=export_users,ou=groups,dc=example,dc=com
组的成员。
流程
使用以下方法之一创建导出任务:
使用
dsconf 后端导出
命令:#
dsconf -D "uid=example,ou=People,dc=example,dc=com" ldap://server.example.com backend export userRoot
通过手动创建任务:
#
ldapadd -D "uid=example,ou=People,dc=example,dc=com" -W -H ldap://server.example.com
dn: cn=userRoot-2021_07_23_12:55_00,cn=export,cn=tasks,cn=config changetype: add objectClass: extensibleObject nsFilename: /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2021_07_23_12:55_00.ldif nsInstance: userRoot cn: export-2021_07_23_12:55_00
验证
验证备份是否已创建:
#
ls -l /var/lib/dirsrv/slapd-instance_name/ldif/*.ldif
total 0 -rw-------. 1 dirsrv dirsrv 10306 Jul 23 12:55 None-userroot-2021_07_23_12_55_00.ldif ...
其他资源
第 12 章 管理访问控制指令
当 Directory Server 收到请求时,它使用 bind 操作中用户提供的身份验证信息以及目录中定义的访问控制指令(ACI)来允许或拒绝访问所请求的条目或属性。服务器可以允许或拒绝执行操作的权限,如 读取
、写入
、搜索和
比较
。为用户授予的权限级别取决于提供的身份验证信息。
Directory 服务器中的访问控制可让您在 ACI 适用时设置精确规则:
- 对于整个目录、子树或特定条目
- 对于特定用户,属于特定组或角色的所有用户,或者 目录中的所有用户
对于特定位置,如 IP 地址、IP 范围或 DNS 名称。
请注意,负载均衡器可能会影响特定于位置的规则。
难以阅读和理解复杂 ACI。您可以编写多个简单规则来达到同样效果,而不是一个复杂的 ACI。但是,更多 ACI 也会增加 ACI 处理的成本。
12.1. ACI 放置
目录服务器将访问控制指令(ACI)存储在目录条目的多值 aci
操作属性中。要设置 ACI,请将 aci
属性添加到对应的目录条目。目录服务器应用 ACI:
只有包含 ACI 的条目(如果它没有任何子条目)例如,如果客户端需要访问
uid=user_name,ou=People,dc=example,dc=com
对象,而 ACI 仅在dc=example,dc=com
上设置,而不适用于任何子条目,仅应用此 ACI。注意具有
添加权限
的 ACI 也适用于在以后创建的子条目。如果条目含有 ACI 以及以下所有条目,则将其在所有条目中。因此,当服务器评估对任何给定条目的访问权限时,它会验证一个请求和目录后缀之间的每个条目的 ACI,以及条目本身的 ACI。
例如,在
dc=example,dc=com
和ou=People,dc=example,dc=com
条目中设置了 ACI:如果一个客户端要访问uid=user_name,ou=People,dc=example,dc=com
对象,它没有设置 ACI,Directory Server 会首先验证ou=People,dc=example,dc=com
条目中的 ACI。如果这个 ACI 授予访问权限,则评估会停止并授予访问权限。如果没有,Directory 服务器会验证ou=People,dc=example,dc=com
上的 ACI。如果这个 ACI 成功授权客户端,它可以访问该对象。
rootDSE
条目中设置的 ACI 仅适用于此条目。
可以在条目上创建的 ACI 不能直接应用到该条目,而是指向下面的子树中的部分或全部条目。这种方法的优势在于,通用 ACI 可以在目录树中放置更高的条目,从而对树中较低条目产生影响。例如,可以在 organizationalUnit
条目的级别上创建包含 inetOrgPerson
对象类的 ACI 条目或本地类型条目。
通过将常规规则放置到高级别分支点,以最小化目录树中的 ACI 数量。为限制更具体规则的范围,请尽可能将它们放在叶条目中。
12.2. ACI 的结构
aci
属性使用以下语法:
(target_rule) (version 3.0; acl "ACL_name"; permission_rule bind_rules;)
-
target_rule
指定控制访问的条目、属性或一组条目和属性。 -
版本 3.0
是一个所需的字符串,用于标识访问控制指令(ACI)版本。 -
ACL "ACL 名称"
可设置描述 ACI 的名称和字符串。 -
permission_rule
可设置允许或拒绝权限,如read
或write
。 -
bind_rules
指定在绑定中必须匹配哪些规则允许或拒绝访问。
权限和绑定规则对称为访问控制规则。
要有效地为给定目标设置多个访问控制,您可以为每个目标设置多个访问控制规则:
(target_rule)(version 3.0; acl "ACL_name"; permission_rule bind_rules; permission_rule bind_rules; ... ;)
12.3. ACI 评估
为了评估特定条目的访问权限,服务器会创建条目本身的访问控制指令(ACI)列表,并在父条目中备份存储在 Directory Server 中的顶层条目。ACI 会针对特定实例在所有数据库中评估,但不在不同实例之间进行评估。
目录服务器根据 ACI 的语义(而非在目录树中的放置位置)评估 ACI 的这个列表。这意味着,与目录树根目录接近的 ACI 不会比目录树更接近的 ACI 优先于 ACI。
在 Directory 服务器中,ACI 中的 拒绝
权限优先于 允许
权限。例如,如果您拒绝目录 root 级别的写入权限,则没有人可以写入该目录,无论其他 ACI 是否被授予此权限。要为目录授予特定用户写入权限,您必须向原始拒绝规则添加例外,以允许用户在该目录中写入。
对于改进的 ACI,请使用精细的 allow
规则而不是 拒绝规则
。
12.4. ACI 的限制
当您设置访问控制指令(ACI)时,会有以下限制:
如果目录数据库分布到多个服务器,则以下限制适用于 ACI 中可以使用的关键字:
ACI 取决于使用
groupdn
关键字的组条目,必须与组条目位于同一服务器上。如果组是动态的,则组的所有成员都必须在服务器上有一个条目。静态组的成员条目可以位于远程服务器中。
-
ACI 取决于使用
roledn
关键字的角色定义,它必须位于与角色定义条目相同的服务器上。要拥有该角色的每个条目也必须位于同一服务器上。
但是,您可以将存储在目标条目中的值与存储在绑定用户条目中的值匹配,例如使用
userattr
关键字。在这种情况下,即使绑定用户在存储 ACI 的服务器中没有条目,也会评估访问。在以下 ACI 关键字中无法使用虚拟属性,如服务(CoS)属性:
-
targetfilter
-
targattrfilters
-
userattr
-
- 访问控制规则仅在本地服务器上评估。例如,如果您在 ACI 关键字中指定 LDAP URL 中的服务器主机名,则 URL 将会被忽略。
12.5. Directory 服务器如何在复制拓扑中处理 ACI
访问控制指令(ACI)存储在条目的 某一
属性中。因此,如果包含 ACI 的条目是复制数据库的一部分,则 ACI 会复制。
ACI 始终在可以解析传入的 LDAP 请求的服务器上评估。当消费者服务器收到更新请求时,它会返回供应商服务器的引用,然后再评估请求是否可在供应商上提供服务。
12.6. 显示、添加、删除和更新 ACI
您可以使用 ldapsearch
实用程序搜索,并使用 ldapmodify
实用程序来添加、删除和更新访问控制指令(ACI)。
显示 ACI:
例如,要显示 dc=example,dc=com
和 sub-entries 中设置的 ACIs,请输入:
# ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b "dc=example,dc=com" -s sub '(aci=*)' aci
添加 ACI
例如,要将 ACI 添加到 ou=People,dc=example,dc=com
条目,请输入:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="userPassword") (version 3.0; acl
"Allow users updating their password";
allow (write) userdn= "ldap:///self";)
删除 ACI
删除 ACI:
如果条目上只有一个
aci
属性,或者您要从条目中删除所有 ACI:#
ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com changetype: delete delete: aci如果条目上存在多个 ACI,且要删除特定 ACI,请指定精确的 ACI:
#
ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com changetype: modify delete: aci aci: (targetattr="userPassword") (version 3.0; acl "Allow users updating their password"; allow (write) userdn= "ldap:///self";)
更新 ACI
更新 ACI:
- 删除现有的 ACI。
- 使用更新的设置添加新的 ACI。
12.7. 定义 ACI 目标
访问控制指令(ACI)中的目标规则定义了 Directory 服务器应用 ACI 条目。如果没有设置目标,则 ACI 会应用到包含 aci
属性和以下条目的条目。
在 ACI 中,以下突出显示的部分是目标规则:
(target_rule)(version 3.0; acl "ACL_name"; permission_rule bind_rules;)
对于复杂的 ACI,Directory 服务器支持使用 ACI 中具有不同关键字的多个目标规则:
(target_rule_1)(target_rule_2)(...)(version 3.0; acl "ACL_name"; permission_rule bind_rules;)
如果您指定多个目标规则,则顺序不相关。请注意,您只能在 ACI 中一次使用以下关键字:
-
目标
-
targetattr
-
targetattrfilters
-
targetfilter
-
target_from
-
target_to
12.7.1. 目标规则的语法
目标规则的一般语法是:
(keyword comparison_operator "expression")
-
关键字
:设置目标的类型。 comparison_operator
: Valid 值是=
和!=
,并指明目标是否为表达式中指定的对象。警告出于安全考虑,红帽建议不要使用
!=
运算符,因为它允许在所有其他条目或属性上进行指定操作。例如:(targetattr != "userPassword");(version 3.0; acl "example"); allow (write) ... );
前面的示例允许用户设置、更新或删除任何属性,但
userPassword
属性除您设置 ACI 的 Distinguished Name (DN)下。然而,这也允许用户添加额外的aci
属性,以允许写入此属性的写入访问权限。-
表达式
:设置目标,且必须通过引号来周围。表达式本身取决于您使用的关键字。
12.7.2. 以目录条目为目标
要根据可辨识的名称(DN)和下面的条目控制访问权限,请在访问控制指令(ACI)中使用 target
关键字。使用 target
关键字的目标规则将 DN 作为表达式进行:
(target comparison_operator "ldap:///distinguished_name")
您必须在 DN 上使用 target
关键字设置 ACI,您目标为目标或更高级别的 DN。例如,如果您目标 ou=People,dc=example,dc=com,则必须在 ou=People,dc=example,dc=com 或 dc=example,dc=com 中设置 ACI。
例 12.1. 使用 target 关键字
启用存储在 ou=People,dc=example,dc=com 条目中的用户来搜索并显示其自己条目中的所有属性:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///ou=People,dc=example,dc=com") (version 3.0;
acl "Allow users to read and search attributes of own entry"; allow (search, read)
(userdn = "ldap:///self");)
使用带有 target 关键字的通配符
您可以使用 *
通配符字符目标多个条目。
以下目标规则示例与 ou=People,dc=example,dc=com
中的所有条目匹配:它的 uid 属性设为以字母 a
开头的值:
(target = "ldap:///uid=a*,ou=People,dc=example,dc=com")
根据通配符的位置,该规则不仅适用于属性值,也应用于完整的 DN。因此,您可以使用通配符作为 DN 的部分内容替代。
例 12.2. 使用通配符以目录条目为目标
以下规则以 dc=example,dc=com
树中的所有条目为目标,其具有匹配的 uid
属性,而不仅存储于 dc=example,dc=com
条目本身的条目:
(target = "ldap:///uid=user_name*,dc=example,dc=com")
前面的目标规则匹配多个条目,例如:
-
uid=user_name,dc=example,dc=com
-
uid=user_name,ou=People,dc=example,dc=com
-
uid=user_name2,dc=example,dc=com
目录服务器不支持 DN 后缀中的通配符。例如,如果您的目录的后缀是 dc=example,dc=com
,则不能在这个后缀中使用带有通配符的目标,如 (target = "ldap:///dc=*.com")
。
12.7.3. 目标属性
要将访问控制指令(ACI)中的访问限制到特定属性,请使用 targetattr
关键字。例如,这个关键字定义了:
- 在读取操作中,哪些属性将返回到客户端
- 在搜索操作中,搜索哪些属性
- 在写入操作中,哪些属性可以被写入对象
- 在添加操作中,可在创建新对象时添加哪些属性
在某些情况下,您可以通过将其他目标关键字与 targetattr
结合使用,使用 targetattr
关键字来保护 ACI。请参阅 目标规则的高级用法。
在 读取和
搜索
操作中,默认目标 no 属性。没有 targetattr
关键字的 ACI 只对带有正确影响一个完整条目的 ACI 有用,例如 add
或 delete
。
要在使用 targetattr
关键字的目标规则中分隔多个属性,请使用 ||
:
(targetattr comparison_operator "attribute_1 || attribute_2 || ...")
表达式中设置的属性必须在 schema 中定义。
表达式中指定的属性适用于您创建 ACI 以及其它目标规则的所有条目的条目。
例 12.3. 使用 targetattr 关键字
要启用存储在 dc=example,dc=com
中的用户,且所有子项都试图更新其自己条目中的 userPassword
属性,请输入:
# ldapmodify -D "cn=Directory Manager" -W -H ldap::server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "userPassword") (version 3.0;
acl "Allow users updating own userPassword";
allow (write) (userdn = "ldap:///self");)
使用带有 targetattr 关键字的通配符
使用 *
通配符字符,例如,针对所有属性:
(targetattr = "*")
为安全起见,请不要将通配符与 targetattr
搭配使用,因为它允许访问所有属性,包括操作属性。例如,如果用户可以添加或修改所有属性,用户可能会创建额外的 ACI 并增加自己的权限。
12.7.4. 使用 LDAP 过滤器目标条目和属性
要针对一组与特定条件匹配的条目为目标,请使用带 LDAP 过滤器的 target
filter 关键字:
(targetfilter comparison_operator "LDAP_filter")
过滤器表达式是一个标准 LDAP 搜索过滤器。
例 12.4. 使用 targetfilter 关键字
要为 cn=Human Resources,dc=example,dc.com
组的成员授予权限,修改该部门属性设置为 Engineering
或 Sales
的所有条目:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetfilter = "(|(department=Engineering)(department=Sales)")
(version 3.0; acl "Allow HR updating engineering and sales entries";
allow (write) (groupdn = "ldap:///cn=Human Resources,dc=example,dc.com");)
targetfilter
关键字以整个条目为目标。如果您将其与 targetattr
关键字结合,则访问控制指令(ACI)仅适用于目标条目的属性子集。请参阅目标与过滤器匹配的条目的特定属性。
使用 LDAP 过滤器在目标在目录中分布的条目和属性时很有用。但是,有时结果无法预测,因为过滤器不会直接命名您要管理访问权限的对象。过滤 ACI 的目标条目集合可能会在添加或删除属性时改变。因此,如果您在 ACI 中使用 LDAP 过滤器,使用同一过滤器(例如在 ldapsearch
操作中)验证它们是否以正确的条目和属性为目标。
使用 targetfilter 关键字的通配符
targetfilter
关键字支持通配符与标准 LDAP 过滤器类似。例如,要针对其值以 adm
开头的所有 uid 属性为目标,请使用:
(targetfilter = "(uid=adm*) ...)
12.7.5. 使用 LDAP 过滤器目标属性值
您可以使用访问控制来针对属性的具体值。这意味着,如果该属性的值满足在访问控制指令(ACI)中定义的条件,您可以对属性授予或拒绝权限。根据属性值授予或拒绝访问的 ACI 称为基于值的 ACI。这只适用于 ADD
和 DEL
操作。您无法根据特定值限制搜索权利。
要创建基于值的 ACI,请使用以下语法使用 targattrfilters
关键字:
对于一个带有一个属性和过滤组合的操作:
(targattrfilters="operation=attribute:filter")
对于一个带有多个属性和过滤器组合的操作:
(targattrfilters="operation=attribute_1:filter_1 && attribute_2:filter_2 ... && attribute_m:filter_m")
对于两个操作,每个都有多个属性和过滤器组合:
(targattrfilters="operation_1=attribute_1_1:filter_1_1 && attribute_1_2:filter_1_2 ... && attribute_1_m:filter_1_m , operation_2=attribute_2_1:filter_2_1 && attribute_2_2:filter_2_2 ... & attribute_2_n:filter_2_n ")
在前面的语法示例中,您可以设置 要添加
或 del
的操作。属性:filter
组合设置过滤器,并将过滤器应用到的属性。
下面描述了如何过滤匹配:
- 在创建条目和过滤器应用到新条目中的属性时,该属性的每个实例都必须与过滤器匹配。
- 当删除条目和过滤器应用到条目中的属性时,该属性的每个实例也必须与过滤器匹配。
-
当修改条目和操作添加一个属性时,适用于该属性的
add
过滤器必须匹配。 -
如果操作删除了属性,则适用于该属性的
del
过滤器必须匹配。如果条目中已存在属性的不同值被替换,则add
和del
过滤器都必须匹配。
例 12.5. 使用 targattrfilters 关键字
要创建 ACI,让用户可以在自己的条目中添加任何角色,但 Admin
角色除外,并添加 电话
属性,只要值以 123
前缀开头,请输入:
# ldapmodify -D "cn=Directory Manager" -W -H ldap::server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targattrfilters="add=nsroledn:(!(nsroledn=cn=Admin)) &&
telephoneNumber:(telephoneNumber=123*)") (version 3.0;
acl "Allow adding roles and telephone";
allow (add) (userdn = "ldap:///self");)
12.7.6. 目标源和目标 DN
在某些情况下,管理员希望允许用户移动目录条目。在访问控制指令(ACI)中使用 target_from
和 target_to
关键字,您可以指定操作的源和目的地,而无需启用用户:
- 要从 ACI 中设置的不同源移动条目。
- 将条目移到 ACI 中设置的不同目的地。
- 要从来源区分名称(DN)中删除现有条目。
- 将新条目添加到目标 DN 中:
例 12.6. 使用 target_from 和 target_to 关键字
要启用 uid=user,dc=example,dc=com
帐户,将用户帐户从 cn=staging,dc=example,dc=com
条目移动到 cn= people,dc=example,dc=com
,输入:
# ldapmodify -D "cn=Directory Manager" -W -H ldap:server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target_from="ldap:///uid=*,cn=staging,dc=example,dc=com")
(target_to="ldap:///cn=People,dc=example,dc=com")
(version 3.0; acl "MODDN from"; allow (moddn))
userdn="ldap:///uid=user,dc=example,dc=com";)
ACI 只适用于定义的子树。在上例中,ACI 仅应用到 dc=example,dc=com
子树。
如果没有设置 target_from
或 target_to
关键字,则 ACI 与任何源或目的地匹配。
12.8. 目标规则的高级用法
通过组合多个关键字,您可以创建复杂的目标规则。本节提供了目标规则的高级用法示例。
12.8.1. 委派权限以创建和维护组
在某些情况下,管理员希望将权限委派给其他帐户或组。通过将目标关键字结合在一起,您可以创建解决此请求的安全访问控制指令(ACI)。
例 12.7. 委派权限以创建和维护组
启用 uid=user,ou=People,dc=example,dc=com" 帐户以在 ou=groups,dc=example,dc=com 条目中创建和更新组:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///cn=*,ou=Groups,dc=example,dc=com")
(targattrfilters="add=objectclass:(|(objectclas=top)(objectclass=groupOfUniqueNames)))
(targetattr="cn || uniqueMember || objectClass")
(version 3.0; acl "example"; allow (read, search, write, add)
(userdn = "ldap:///uid=test,ou=People,dc=example,dc=com");)
出于安全考虑,前面的示例会有一些限制。uid=test,ou=People,dc=example,dc=com
用户:
-
可以创建必须包含
top
和groupOfUniqueNames
对象类的对象。 -
无法添加额外的对象类,如
account
。例如,如果使用 Directory Server 帐户进行本地身份验证,这会防止为root
用户创建新用户,如0。
targetfilter
规则可确保 ACI 条目只适用于 groupofuniquenames
对象类的条目,而 targetattrfilter
规则可确保无法添加其他对象类。
12.8.2. 以条目和属性为目标
目标
根据可识别的名称(DN)控制访问。但是,如果您将其与通配符和 targetattr
关键字结合使用,您可以对条目和属性都为目标。
例 12.8. 以条目和属性为目标
启用 uid=user,ou=People,dc=example,dc.com
用户在 dc=example,dc=com
子树中所有机构单元中读取和搜索组的成员:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target="ldap:///cn=*,dc=example,dc=com")(targetattr="member" || "cn") (version 3.0;
acl "Allow uid=user to search and read members of groups";
allow (read, search) (userdn = "ldap:///uid=user,ou=People,dc=example,dc.com");)
12.8.3. 针对与过滤器匹配的条目的某些属性
如果您在两个目标规则中组合了 targetattr
和 targetfilter
关键字,您可以针对与过滤器匹配的条目的特定属性。
例 12.9. 针对与过滤器匹配的条目的某些属性
要允许 cn=Engineering Admins,dc=example,dc=com
组的成员修改 jpegPhoto
和 manager
属性,并将 department
属性设置为 Engineering
,请输入:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "jpegPhoto || manager")
(targetfilter = "(department=Engineering)") (version 3.0;
acl "Allow engineering admins updating jpegPhoto and manager of department members";
allow (write) (groupdn = "ldap:///cn=Engineering Admins,dc=example,dc.com");)
12.8.4. 以单一目录条目为目标
要针对单个目录条目为目标,请组合 targetattr
和 targetfilter
关键字。
例 12.10. 以单一目录条目为目标
启用 uid=user,ou=People,dc=example,dc=com 用户读取和搜索 ou=Engineering,dc=example,dc=com 条目中的 ou=Engineering,dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=Engineering,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "ou || cn")
(targetfilter = "(ou=Engineering)") (version 3.0;
acl "Allow uid=user to search and read engineering attributes";
allow (read, search) (userdn = "ldap:///uid=user,ou=People,dc=example,dc.com");)
要启用上一示例以仅针对 ou=Engineering,dc=example,dc=com
条目,在 ou=Engineering,dc=example,dc=com
中没有将 ou
=Engineering,dc=com 的子条目设置为 Engineering
。
如果您的目录结构改变,这些 ACI 可能会失败。
另外,您可以创建一个与绑定请求中的用户输入匹配的绑定规则,以及一个存储在目标条目中的属性值。请参阅 根据与 匹配的值来定义访问权限。
12.9. 定义 ACI 权限
权限规则定义与访问控制指令(ACI)关联的权利,以及是否允许或拒绝访问。
在 ACI 中,以下突出显示的部分是权限规则:
(target_rule) (version 3.0; acl "ACL_name"; permission_rule bind_rules;)
12.9.1. 权限规则的语法
权限规则的一般语法是:
permission (rights)
-
权限
:如果访问控制指令(ACI)允许或拒绝权限,请进行设置。 -
权限
:设置 ACI 允许或拒绝的权限。请参阅 权限规则中的用户权限。
例 12.11. 定义权限
启用存储在 ou=People,dc=example,dc=com
条目中的用户来搜索并显示其自己条目中的所有属性:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///ou=People,dc=example,dc=com") (version 3.0;
acl "Allow users to read and search attributes of own entry"; allow (search, read)
(userdn = "ldap:///self");)
12.9.2. 权限规则中的用户权限
权限规则中的权利定义授予或拒绝哪些操作。在 ACI 中,您可以设置以下一个或多个权限:
表 12.1. 用户权限
右 | Description |
---|---|
| 设定用户是否能够读取目录数据。此权限只适用于 LDAP 中的搜索操作。 |
|
设定用户是否可以通过添加、修改或删除属性来修改条目。此权限适用于 LDAP 中的 |
|
设定用户是否可以创建条目。这个权限只适用于 LDAP 中的 |
|
设定用户是否能够删除条目。此权限仅适用于 LDAP |
|
设定用户是否可以搜索目录数据。要查看作为搜索结果的一部分返回的数据,分配 |
|
设置用户是否可以比较他们提供的数据与 目录中存储的数据。通过 |
| 设置用户是否可以向组中添加或删除自己的可分辨名称(DN)。右键仅用于组管理。 |
|
设置指定的 DN 是否可以通过另一个条目的访问权限来访问目标。右侧的 |
|
设置所有权限,但 |
12.9.3. LDAP 操作所需的权限
This section describes the rights you must grant to users depending on the type of LDAP operation you want to authorize them to perform.
添加条目:
-
授予
您要添加的
条目的添加权限。 -
授予条目中各个属性值
的写入权限
。默认情况下会授予此权利,但可以使用targattrfilters
关键字限制。
-
授予
删除条目:
-
授予您要删除的条目的
delete
权限。 -
授予条目中各个属性值
的写入权限
。默认情况下会授予此权利,但可以使用targattrfilters
关键字限制。
-
授予您要删除的条目的
修改条目中的属性:
-
授予属性类型
的写入权限
。 -
授予每个属性值
的写入权限
。默认情况下会授予此权利,但可以使用targattrfilters
关键字限制。
-
授予属性类型
修改条目的 RDN:
-
为条目授予
写入权限
。 -
为新的 RDN 中使用的属性类型授予
写入权限
。 -
如果要授予该用户删除旧 RDN 中的属性类型,请授予
写入权限
。 -
授予新 RDN 中使用的属性值
的写入权限
。默认情况下会授予此权利,但可以使用targattrfilters
关键字限制。
-
为条目授予
比较属性值:
-
授予
比较
属性类型的权限。
-
授予
搜索条目:
-
授予
搜索过滤器
中使用的每种属性类型的搜索权限。 -
授予条目中使用的属性类型
的读取权限
。
-
授予
12.10. 定义 ACI 绑定规则
访问控制指令(ACI)中的绑定规则定义所需的绑定参数,该参数必须符合该参数,以便 Directory 服务器应用 ACI。例如,您可以基于以下方法设置绑定规则:
- DNS
- 组成员资格或分配角色
- 条目必须绑定的位置
- 在绑定过程中必须使用的验证类型
- 绑定发生的时间或天数
在 ACI 中,以下突出显示的部分是绑定规则:
(target_rule) (version 3.0; acl "ACL_name"; permission_rule bind_rules;)
12.10.1. 绑定规则的语法
绑定规则的一般语法是:
keyword comparison_operator "expression"
-
关键字
:设置 bind 操作的类型。 -
comparison_operator
: Valid 值是=
和!=
,并指明目标是否为表达式中指定的对象。如果关键字支持其他比较运算符,则会在相应的部分中介绍它。 -
表达式
:设置表达式,必须通过引号括起。表达式本身取决于您使用的关键字。
12.10.2. 定义基于用户的访问权限
userdn
关键字可让您基于一个或多个 DN 授予或拒绝访问,并使用以下语法:
userdn comparison_operator "ldap:///distinguished_name || ldap:///distinguished_name || ..."
将表达式中的 DN 设置为:
- DN: 使用 userdn 关键字 的 DN。
- LDAP 过滤器:请参考在 LDAP 过滤器中使用 userdn 关键字。
-
任何人
别名: 查看匿名访问。 -
all
别名: 查看对经过身份验证的用户的访问权限。 -
自助服务
别名: 请参阅启用用户访问他们自己的条目。 -
父
别名: 对用户 的子条目设置访问权限。
不要在 LDAP URL 中指定主机名或端口号。URL 始终应用于本地服务器。
使用 userdn 关键字的 DN
将 userdn
关键字设置为可分辨的名称(DN),以将 ACI 应用到匹配的条目。要匹配多个条目,请在 DN 中使用 *
通配符。
在 DN 中使用 userdn
关键字必须使用以下语法:
userdn comparison_operator ldap:///distinguished_name
例 12.12. 使用 userdn 关键字的 DN
启用 uid=admin,ou=People,dc=example,dc=com
用户读取 ou=People,dc=example,dc=com
条目中所有其他用户的 manager
属性:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="manager") (version 3.0; acl "Allow uid=admin reading manager attribute";
allow (search, read) userdn = "ldap:///uid=admin,ou=People,dc=example,dc=com";)
在 LDAP 过滤器中使用 userdn 关键字
如果要动态允许或拒绝用户的权限,在 LDAP 过滤器中使用 userdn
关键字:
userdn comparison_operator "ldap:///distinguished_name??scope?(filter)"
LDAP 过滤器支持 *
通配符。
例 12.13. 在 LDAP 过滤器中使用 userdn 关键字
要启用将 department 属性设置为 human
Resources
的用户,以更新 ou=People,dc=example,dc=com
条目中的用户的 homePostalAddress
属性:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="homePostalAddress") (version 3.0;
acl "Allow HR setting homePostalAddress"; allow (write)
userdn = "ldap:///ou=People,dc=example,dc=com??sub?(department=Human Resources)";)
授予匿名访问
在某些情况下,管理员希望配置对 目录中数据的匿名访问。匿名访问意味着可以通过提供 来绑定到该目录:
- 没有绑定 DN 和密码
- 有效的绑定 DN 和密码
要配置匿名访问,请使用 bind 规则中的 userdn
关键字的 ldap:///anyone
表达式:
userdn comparison_operator "ldap:///anyone"
例 12.14. 授予匿名访问
启用没有身份验证的任何人读取和搜索 sn
、givenName
和 电话Number
属性(在 ou=People,dc=example,dc=com
条目中:
# ldapmodify -D "cn=Directory Manager" -W -H __ldap://server.example.com
-x`
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="sn" || targetattr="givenName" || targetattr = "telephoneNumber")
(version 3.0; acl "Anonymous read, search for names and phone numbers";
allow (read, search) userdn = "ldap:///anyone")
授予对经过身份验证的用户的访问权限
在某些情况下,管理员想要向任何能够成功绑定到目录服务器的用户授予权限,但匿名绑定除外。要配置此功能,请使用 bind 规则中的 userdn
关键字的 ldap:///all
表达式:
userdn comparison_operator "ldap:///all"
例 12.15. 授予对经过身份验证的用户的访问权限
启用经过身份验证的用户来添加和移除自身为 ou=example,ou=groups,dc=example,dc=com
组的成员:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=example,ou=Groups,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="member") (version 3.0;
acl "Allow users to add/remove themselves from example group";
allow (selfwrite) userdn = "ldap:///all")
允许用户访问自己的条目
要设置允许或拒绝对他们自己的条目的访问的 ACI,请使用 bind 规则中的 userdn
关键字的 ldap:///self
表达式:
userdn comparison_operator "ldap:///self"
例 12.16. 允许用户访问自己的条目
要在 ou=People,dc=example,dc=com
条目中启用用户,以更新自己的 userPassword
属性:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="userPassword") (version 3.0;
acl "Allow users updating their password";
allow (write) userdn = "ldap:///self")
为用户的子条目设置访问权限
只有在绑定 DN 是目标条目的父项时,要指定用户被授予或拒绝访问条目,请在绑定规则中使用带有 userdn
关键字的 self:///parent
表达式:
userdn comparison_operator "ldap:///parent"
例 12.17. 为用户的子条目设置访问权限
启用 cn=user,ou=People,dc=example,dc=com
用户以更新其自身子条目的 manager
属性,如 cn=example,cn=user,ou=People,dc=example,dc=com
:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: cn=user,ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="manager") (version 3.0;
acl "Allow cn=user to update manager attributes";
allow (write) userdn = "ldap:///parent")
12.10.3. 定义基于组的访问
基于组访问控制指令(ACI)允许您通过向组或从组添加或删除用户来管理访问权限。要配置基于组成员资格的 ACI,请使用 groupdn
关键字。如果用户是一个或多个指定组的成员,则 ACI 会匹配。
使用 groupdn
关键字时,Directory 服务器会根据以下属性验证组成员资格:
- 成员
- uniqueMember
- memberURL
- memberCertificateDescription
使用 groupdn
关键字绑定规则使用以下语法:
groupdn comparison_operator "ldap:///distinguished_name || ldap:///distinguished_name || ..."
将表达式中的可分辨名称(DN)设置为:
- 一个 DN。请参阅使用 groupdn 关键字的 DN。
- LDAP 过滤器。请参阅在 LDAP 过滤器中使用 groupdn 关键字
如果您在一个绑定规则中设置多个 DN,如果经过身份验证的用户是这些组的成员,Directory 服务器会应用 ACI。要将用户设置为多个组的成员,请使用多个 groupdn
关键字,并使用布尔值 和
运算符组合它们。详情请参阅 使用布尔值 Operator 组合 Bind Rules。
不要在 LDAP URL 中指定主机名或端口号。URL 始终应用于本地服务器。
使用 groupdn 关键字的 DN
要将 ACI 应用到组的成员,请将 groupdn
关键字设置为组的 DN。
groupdn
关键字设置为 DN 使用以下语法:
groupdn comparison_operator ldap:///distinguished_name
例 12.18. 使用带组关键字的 DN
要启用 cn=example,ou=Groups,dc=example,dc=com
组的成员在 ou=People,dc=example,dc=com
中搜索和读取条目的 manager 属性:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="manager") (version 3.0;
acl "Allow example group to read manager attribute";
allow (search, read) groupdn = "ldap:///cn=example,ou=Groups,dc=example,dc=com";)
将 groupdn 关键字用于 LDAP 过滤器
通过 groupdn
关键字使用 LDAP 过滤器,您可以定义经过身份验证的用户必须是最少一个过滤搜索返回的组的成员,以便与 ACI 匹配。
带有 LDAP 过滤器的 groupdn
关键字使用以下语法:
groupdn comparison_operator "ldap:///distinguished_name??scope?(filter)"
LDAP 过滤器支持 *
通配符。
例 12.19. 将 groupdn 关键字用于 LDAP 过滤器
要启用 dc=example,dc=com
和 subtrees 中的组的成员,请将 manager
属性设置为 example
,更新 ou=People,dc=example,dc=com
中条目的 homePostalAddress
:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="homePostalAddress") (version 3.0;
acl "Allow manager=example setting homePostalAddress"; allow (write)
userdn = "ldap:///dc=example,dc=com??sub?(manager=example)";)
12.10.4. 根据值匹配定义访问权限
在 bind 规则中使用 userattr
关键字指定哪个属性必须与用于绑定到目录和目标条目的条目之间匹配。
userattr
关键字使用以下语法:
userattr comparison_operator "attribute_name#bind_type_or_attribute_value
如需了解更多详细信息,请参阅:
默认情况下,Directory 服务器会评估其创建的条目的访问权限。但是,为了避免同一级别上用户对象,在使用 userattr
关键字时,Directory 服务器不会向条目授予设置访问控制指令 (ACI) 的 add
权限。要配置此行为,请结合使用 userattr
关键字和 parent
关键字,并在级别 0 上授予权限。
有关继承的详情,请参阅根据匹配的值来定义访问权限。
使用 USERDN 绑定类型
要在绑定用户区分名称(DN)匹配属性中存储的 DN 时应用 ACI,请使用 USERDN
绑定类型。
带有 USERDN
绑定类型的 userattr
关键字需要以下语法:
userattr comparison_operator "attribute_name#USERDN"
例 12.20. 使用 USERDN 绑定类型
为经理授予自己同事 的电话
属性所有权限:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "telephoneNumber")
(version 3.0; acl "Manager: telephoneNumber";
allow (all) userattr = "manager#USERDN";)
如果该条目的 DN 在 ou=People,dc=example,dc=com
中的条目上执行操作,则上一 ACI 的 DN 与该条目的 manager
属性中存储的 DN 匹配。
使用 GROUPDN 绑定类型
要在绑定用户 DN 是属性中设置的组的成员时应用 ACI,请使用 GROUPDN
绑定类型。
带有 GROUPDN
绑定类型的 userattr
关键字需要以下语法:
userattr comparison_operator "attribute_name#GROUPDN"
例 12.21. 使用 GROUPDN 绑定类型
要授予用户删除他们在 ou=Social Committee,ou=Groups,dc=example,dc=com
条目下拥有的组条目的权限:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=Social Committee,ou=Groups,dc=example,dc=com
changetype: modify
add: aci
aci: (target="ou=Social Committee,ou=Groups,dc=example,dc=com)
(targattrfilters="del=objectClass:(objectClass=groupOfNames)")
(version 3.0; acl "Delete Group";
allow (delete) userattr = "owner#GROUPDN";)
如果执行该操作的 DN 是 owner
属性中指定的组的成员,则上一 ACI 将评估为 true。
指定组可以是动态组,组 DN 可以在数据库中的任何后缀下。但是,对服务器型 ACI 的评估非常高。
如果您使用与目标条目相同的后缀中的静态组,请使用以下表达式来提高性能:
userattr comparison_operator "ldap:///distinguished_name?attribute_name#GROUPDN"
使用 ROLEDN 绑定类型
要在绑定用户属于属性中指定的角色时应用 ACI,请使用 ROLEDN
绑定类型。
带有 ROLEDN
绑定类型的 userattr
关键字需要以下语法:
userattr comparison_operator "attribute_name#ROLEDN"
例 12.22. 使用 ROLEDN 绑定类型
启用具有 cn=Administrators,dc=example,dc=com
角色的用户在 ou=People,dc=example,dc=com
中搜索和读取条目的 manager
属性:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (version 3.0; acl "Allow example role owners to read manager attribute";
allow (search, read) userattr = manager#ROLEDN;)
指定的角色可以在数据库中的任何后缀下。如果您还使用过滤的角色,则对 ACI 的评估将使用服务器上的大量资源。
如果您使用静态角色定义,且角色条目与目标条目的后缀相同,请使用以下表达式来提高性能:
使用 SELFDN 绑定类型
SELFDN
绑定类型可让您在条目的 single-value 属性中设置绑定用户的 DN。
带有 SELFDN
绑定类型的 userattr
关键字需要以下语法:
userattr comparison_operator "attribute_name#SELFDN"
例 12.23. 使用 SELFDN 绑定类型
要让用户添加 ipatokenuniqueid=*,cn=otp,dc=example,dc=com
条目,该条目在 ipatokenOwner
属性中设置绑定用户的 DN:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=otp,dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///ipatokenuniqueid=*,cn=otp,dc=example,dc=com")
(targetfilter = "(objectClass=ipaToken)")(version 3.0;
acl "token-add-delete"; allow (add) userattr = "ipatokenOwner#SELFDN";)
使用 LDAPURL 绑定类型
要在绑定 DN 与目标条目属性中指定的过滤器匹配时应用 ACL,请使用 LDAPURL
绑定类型。
带有 LDAPURL
bind 类型的 userattr
关键字需要以下语法:
userattr comparison_operator "attribute_name#LDAPURL"
例 12.24. 使用 LDAPURL 绑定类型
为包含 aciurl
属性设为 ldap:///ou=People,dc=example,dc=com?one?one?one?one?one? (uid=user*)的用户
对象授予读取和搜索权限:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*")
(version 3.0; acl "Allow read,search "; allow (read,search)
(userattr = "aciurl#LDAPURL);)
使用具有继承的 userattr 关键字
当您使用 userattr
关键字关联用于与目标条目绑定的条目时,ACI 仅适用于指定目标,而不是与它关联的条目。在某些情况下,管理员希望在目标条目下扩展 ACI 多项级别的应用程序。这可以通过使用 parent
关键字并指定应继承 ACI 的目标级别数。
当在 parent
关键字中使用 userattr
关键字时,其语法如下:
userattr comparison_operator "parent[inheritance_level].attribute_name#bind_type_or_attribute_value
-
inheritance_level
: Comma-separated list,它代表目标下面的多少个级别继承 ACI。您可以在目标条目的下面包括五个级别(0
、1
、2
、3
、4
)。零( 0)表示
目标条目。 -
attribute_name
:由userattr
或groupattr
关键字目标的属性。 -
bind_type_or_attribute_value
: 设置属性值或绑定类型,如USERDN
。
例如:
userattr = "parent[0,1].manager#USERDN"
如果绑定 DN 与目标条目的 manager 属性匹配,则此绑定规则会被评估为 true。当将绑定规则评估为 true 时,授予的权限适用于目标条目,并立即应用于它下的所有条目。
例 12.25. 使用具有继承的 userattr 关键字
要让用户读取和搜索 cn=Profiles,dc=example,dc=com
条目,其中用户的 DN 在 owner
属性中设置,以及包括 cn=mail,cn=Profiles,dc=example,dc=example,dc=example,dc=example,dc=example
,dc=example,dc=example,dc=com 的子条目的第一个级别
:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com
-x`
dn: cn=Profiles,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="*") (version 3.0; acl "Profile access",
allow (read,search) userattr="parent[0,1].owner#USERDN" ;)
12.10.5. 定义来自特定 IP 地址或范围的访问
通过 bind 规则中的 ip
关键字,您可以授予或拒绝来自特定 IP 地址或 IP 地址范围内的访问。
使用 ip
关键字绑定规则使用以下语法:
ip comparison_operator "IP_address_or_range"
例 12.26. 在绑定规则中使用 IPv4 地址范围
拒绝从 192.0.2.0/24
网络到 dc=example,dc=com
条目的访问:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Deny 192.0.2.0/24"; deny (all)
(userdn = "ldap:///anyone") and (ip != "192.0.2.");)
例 12.27. 在绑定规则中使用 IPv6 地址范围
将 2001:db8::/64
网络中的访问拒绝到 dc=example,dc=com
条目:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Deny 2001:db8::/64"; deny (all)
(userdn = "ldap:///anyone") and (ip != "2001:db8::");)
12.10.6. 定义来自特定主机或域的访问
绑定规则中的 dns
关键字允许您授予或拒绝来自特定主机或域的访问。
如果 Directory 服务器无法使用 DNS 将 IP 地址解析为完全限定域名(FQDN),服务器不会应用具有这个客户端的 dns
绑定规则的访问控制指令(ACI)。
如果无法使用 DNS 解析客户端 IP 地址,则改为使用 ip
关键字和 IP 地址。请参阅从特定 IP 地址或范围 进行访问。
使用 dns
关键字绑定规则使用以下语法:
dns comparison_operator "host_name_or_domain_name"
例 12.28. 定义来自特定主机的访问
将 client.example.com 主机访问拒绝到 dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Deny client.example.com"; deny (all)
(userdn = "ldap:///anyone") and (dns != "client.example.com");)
例 12.29. 定义特定域的访问
将 example.com 域内所有主机的访问拒绝到 dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "") (version 3.0;acl "Deny example.com"; deny (all) (userdn = "ldap:///anyone") and (dns != ".example.com");)
12.10.7. 在连接中需要一定级别的安全性
连接的安全性由其安全强因(SSF)决定,这是处理操作所需的最小密钥优势。在 bind 规则中使用 ssf
关键字,您可以设置连接必须使用特定级别的安全性。这可让您强制操作(例如密码更改)通过加密连接执行。
任何操作的 SSF 的值都是 TLS 连接和 SASL 绑定之间值的高。这意味着,如果服务器被配置为通过 TLS 运行,并且为 SASL/GSSAPI 配置复制协议,则运行 SSF (无论可用加密类型更为安全)。
使用 ssf
关键字绑定规则使用以下语法:
ssf comparison_operator key_strength
您可以使用以下比较运算符:
-
=
(首要) -
!
(不等于) -
&
lt; (少于) -
>
; (而不是greater) -
&
lt;.> (不代表或等于) -
>
;=(greater than or equal)
如果将 key_strength
参数设置为 0,
则 LDAP 操作不需要安全操作。
例 12.30. 在连接中需要一定级别的安全性
要在 dc=example,dc=com 条目中配置该用户,只能在 SSF 为 128 或更高版本时更新其 userPassword 属性:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "userPassword") (version 3.0;
acl "Allow users updating own userPassword";
allow (write) (userdn = "ldap:///self") and (ssf >= "128");)
12.10.8. 在一周的某一天定义访问
绑定规则中的 dayofweek
关键字允许您根据星期几来授予或拒绝访问。
目录服务器使用服务器上的时间来评估访问控制指令(ACI);而不是客户端上的时间。
将规则与 dayofweek
关键字绑定规则使用以下语法:
dayofweek comparison_operator "comma-separated_list_of_days"
例 12.31. 授予对一周的指定日期的访问权限
拒绝 uid=user,ou=People,dc=example,dc=com
用户条目的访问,以绑定到 Saturdays 和 Sundays 上的服务器:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (version 3.0; acl "Deny access on Saturdays and Sundays";
deny (all)
(userdn = "ldap:///uid=user,ou=People,dc=example,dc=com") and
(dayofweek = "Sun,Sat");)
12.10.9. 在一天的特定时间定义访问
绑定规则中的 timeofday
关键字允许您根据一天的时间授予或拒绝访问。
目录服务器使用服务器上的时间来评估访问控制指令(ACI);而不是客户端上的时间。
使用 timeofday
关键字绑定规则使用以下语法:
timeofday comparison_operator "time"
您可以使用以下比较运算符:
-
=
(首要) -
!
(不等于) -
&
lt; (少于) -
>
; (而不是greater) -
&
lt;.> (不代表或等于) -
>
;=(greater than or equal)
timeofday
关键字要求您以 24 小时格式显示时间。
例 12.32. 在一天的特定时间定义访问
拒绝 uid=user,ou=People,dc=example,dc=com
用户条目的访问,以便在 6pm 和 0am 之间绑定到服务器:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (version 3.0; acl "Deny access between 6pm and 0am"; deny (all) (userdn = "ldap:///uid=user,ou=People,dc=example,dc=com") and (timeofday >= "1800" and timeofday < "2400");)
12.10.10. 根据验证方法定义访问权限
bind 规则中的 authmethod
关键字设置在连接到服务器时必须使用什么身份验证方法,以应用访问控制指令(ACI)。
使用 authmethod
关键字绑定规则使用以下语法:
authmethod comparison_operator "authentication_method"
您可以设置以下验证方法:
-
none
:不需要身份验证,代表匿名访问。这是默认值。 -
简单
:客户端必须提供要绑定到 目录的用户名和密码。 -
SSL
:客户端必须使用数据库中、智能卡或其他设备中 TLS 证书绑定到目录。有关基于证书的身份验证的详情,请参考 根据身份验证方法定义访问权限。 -
SASL
:客户端必须通过简单验证和安全层(SASL)连接绑定到 目录。当您在 bind 规则中使用这个验证方法时,还要指定 SASL 机制,如EXTERNAL
。
例 12.33. 仅为使用 EXTERNAL SASL 身份验证方法启用连接的访问
如果连接没有使用基于证书的身份验证方法或 SASL,拒绝对服务器的访问:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com
-x`
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (version 3.0; acl "Deny all access without certificate"; deny (all)
(authmethod = "none" or authmethod = "simple");)
12.10.11. 根据角色定义访问权限
通过 bind 规则中的 roledn
关键字,您可以授予或拒绝对拥有一个或多个角色集合的用户的访问权限。
红帽建议使用组而不是角色。
使用 roledn
关键字绑定规则使用以下语法:
roledn comparison_operator "ldap:///distinguished_name || ldap:///distinguished_name || ..."
如果可识别的名称(DN)包含逗号,请使用反斜杠转义逗号。
例 12.34. 根据角色定义访问权限
要启用具有 cn=Human Resources,ou=People,dc=example,dc=com
角色的用户,在 nsRole
属性中设置dc=com 角色以搜索并读取 ou=People,dc=example,dc=com
中的条目 管理器
属性:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="manager") (version 3.0;
acl "Allow manager role to update manager attribute";
allow (search, read) roledn = "ldap:///cn=Human Resources,ou=People,dc=example,dc=com";)
12.10.12. 使用布尔值运算符组合绑定规则
在创建复杂的绑定规则时,和
和,或
,不
布尔值运算符可用于组合多个关键字。
将规则与布尔值运算符组合使用的语法如下:
bind_rule_1 boolean_operator bind_rule_2...
例 12.35. 使用布尔值运算符组合绑定规则
要配置属于 cn=Administrators,ou=Groups,dc=example,com
和 cn=Operators,ou=Groups,dc=example,com]
组成员的用户可以 [command]`read, search
, add
, update
, 和 delete
entries in ou=People,dc=example,dc=com
:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (target="ldap:///ou=People,dc=example,dc=com") (version 3.0;
acl "Allow members of administrators and operators group to manage users";
allow (read, search, add, write, delete)
groupdn = "ldap:///cn=Administrators,ou=Groups,dc=example,com" AND
groupdn = "ldap:///cn=Operators,ou=Groups,dc=example,com";)
Directory Server 如何评估布尔值运算符
目录服务器使用下列规则评估布尔值运算符:
来自左到右的所有表达式。
在以下示例中,首先评估
bind_rule_1
:(bind_rule_1) OR (bind_rule_2)
首先是最位于最主要的表达式中。
在以下示例中,将首先评估
bind_rule_2
和bind_rule_3
秒:(bind_rule_1) OR ((bind_rule_2) AND (bind_rule_3))
不允许在
AND
或OR
运算符前。在以下示例中,首先评估 bind_rule_2 :
(bind_rule_1) AND NOT (bind_rule_2)
AND
和OR
运算符没有优先级顺序。
第 13 章 以 FIPS 模式运行 Directory 服务器
目录服务器全面支持联邦信息处理标准 (FIPS) 140-2。当您以 FIPS 模式运行 Directory 服务器时,与安全相关的设置改变。例如,SSL 会自动禁用,且只使用 TLS 1.2 和 1.3 加密。
13.1. 启用 FIPS 模式
要在联邦信息处理标准(FIPS)模式中使用 Directory Server,请在 RHEL 和 Directory Server 中启用模式。
前提条件
- 在 RHEL 中启用了 FIPS 模式。
流程
为网络安全服务(NSS)数据库启用 FIPS 模式:
# modutil -dbdir /etc/dirsrv/slapd-instance_name/ -fips true
重启实例:
#
dsctl instance_name restart
验证
验证为 NSS 数据库启用了 FIPS 模式:
# modutil -dbdir /etc/dirsrv/slapd-instance_name/ -chkfips true FIPS mode enabled.
如果模块采用
FIPS 模式,该命令会返回启用了
FIPS 模式。
13.2. 其他资源
第 14 章 配置基于密码的帐户锁定策略
基于密码的帐户锁定策略可防止攻击者重复尝试猜测用户密码。您可以配置帐户锁定策略,以在指定次数尝试绑定失败后锁定用户帐户。
如果配置了基于密码的帐户锁定策略,Directory 服务器会在以下用户条目的属性中维护锁定信息:
-
passwordRetryCount
:存储失败的绑定尝试次数。如果用户成功绑定到 目录,则目录服务器会重置值,超过retryCountResetTime
中的时间。用户第一次绑定后会存在此属性。 -
retryCountResetTime
:存储 resetpasswordRetryCount
属性的时间。用户第一次绑定后会存在此属性。 -
accountUnlockTime
:存储用户帐户被解锁的时间。此属性会在帐户首次锁定后存在。
14.1. 配置是否在达到或超过配置的最大尝试时锁定帐户
当 Directory Server 锁定帐户失败时,管理员可以配置以下任一行为:
如果超过限制,服务器会锁定帐户。例如,如果将限制设定为 3 次,则第四次尝试后会出现锁定(
n+1
)。这也意味着如果第四次尝试成功,Directory 服务器也不会锁定帐户。默认情况下,Directory 服务器使用此传统密码策略,这些密码通常是由传统 LDAP 客户端所期望的。
如果达到限制,服务器会锁定帐户。例如,如果将限制设定为 3 次,则服务器在第三个尝试失败后锁定帐户(
n
)。现代 LDAP 客户端通常期望此行为。
这个步骤描述了如何禁用旧密码策略。更改策略后,Directory 服务器会阻止访问所配置限制的用户的登录尝试。
前提条件
- 已配置了一个帐户锁定策略。
流程
要禁用旧密码策略并在达到限制时锁定帐户,请输入:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com config replace passwordLegacyPolicy=off
验证
显示
passwordmaxfailure
设置的值:#
dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy get passwordmaxfailure
passwordmaxfailure: 2尝试绑定使用无效密码的时间超过
passwordmaxfailure
中设置的值:#
ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w invalid-password -b "dc=example,dc=com" -x
ldap_bind: Invalid credentials (49) #ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w invalid-password -b "dc=example,dc=com" -x
ldap_bind: Invalid credentials (49) #ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w invalid-password -b "dc=example,dc=com" -x
ldap_bind: Constraint violation (19) additional info: Exceed password retry limit. Please try later.禁用旧密码后,Directory 服务器在第二次尝试后锁定帐户,而进一步尝试会使用
ldap_bind: Constraint violation (19)
错误阻止。
其他资源
14.2. 使用命令行配置基于密码的帐户锁定策略
要块使用无效密码的登录绑定尝试,请配置基于密码的帐户锁定策略。
Directory 服务器在到达或超过配置的最大尝试时锁定帐户的行为取决于旧的密码策略设置。
流程
可选:识别是否启用或禁用旧密码策略:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com config get passwordLegacyPolicy
passwordLegacyPolicy: on启用 password lockout 策略,并将最大故障数设置为
2:
#
[command]`dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdlockout on --pwdmaxfailures=2
启用传统密码策略时,Directory 服务器会在第三个尝试绑定失败后锁定帐户(
--pwdmaxfailures
参数的值 + 1)。dsconf pwpolicy set
命令支持以下参数:-
--pwdlockout
:启用或禁用帐户锁定功能。默认:off
。 --pwdmaxfailures
:设置在目录服务器锁定帐户前允许尝试的最大值。默认:3
。请注意,如果启用了传统密码策略设置,则稍后会尝试锁定。默认:
3
。-
--pwdresetfailcount
:设置目录服务器在用户条目中重置passwordRetryCount
属性前的时间(以秒为单位)。默认:600
秒(10 分钟)。 -
--pwdlockoutduration
:设置已锁定帐户的时间(以秒为单位)。如果将--pwdunlock
参数设置为off
,则此参数将被忽略。默认:3600
秒(1 小时)。 -
--pwdunlock
:启用或禁用在一定时间后是否应解锁锁定的帐户,或保持禁用状态,直到管理员手动解锁为止。默认:上的
。
-
验证
尝试绑定使用无效密码两次,超过您在
--pwdmaxfailures
参数中设置的值:#
ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w invalid-password -b "dc=example,dc=com" -x
ldap_bind: Invalid credentials (49) #ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w invalid-password -b "dc=example,dc=com" -x
ldap_bind: Invalid credentials (49) #ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w invalid-password -b "dc=example,dc=com" -x
ldap_bind: Invalid credentials (49) #ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w invalid-password -b "dc=example,dc=com" -x
ldap_bind: Constraint violation (19) additional info: Exceed password retry limit. Please try later.启用旧密码后,Directory 服务器在超过限制后锁定帐户,而进一步的尝试将使用
ldap_bind: Constraint violation (19)
错误阻止。
其他资源
14.3. 使用 Web 控制台配置基于密码的帐户锁定策略
要块使用无效密码的登录绑定尝试,请配置基于密码的帐户锁定策略。
Directory 服务器在到达或超过配置的最大尝试时锁定帐户的行为取决于旧的密码策略设置。
前提条件
- 在 web 控制台中登录到实例。
流程
可选:识别是否启用或禁用旧密码策略:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com config get passwordLegacyPolicy
passwordLegacyPolicy: on此设置在 web 控制台中不可用。
- 导航到 Database → Password Policies → Global Policy → Account Lockout。
-
选择
"启用帐户锁定
"。 配置锁定设置:
-
锁出帐户的失败登录
数:设置在目录服务器锁定帐户前允许的最大绑定尝试次数。 -
Time Until Failure Count Resets
: 在 Directory Server 重置用户条目中的passwordRetryCount
属性前的时间(以秒为单位)。 -
时间未锁定
:设置帐户锁定的时间(以秒为单位)。如果您禁用Do Not Lockout account Forever,则忽略此参数
。 -
不锁定帐户
:启用或禁用锁定的帐户在一定时间后是否应该被解锁,直到管理员手动解锁它们为止。
-
- 点 Save。
验证
尝试绑定使用无效密码两次,超过您在编号为
Failed Logins this Account
时设置的值:#
ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w invalid-password -b "dc=example,dc=com" -x
ldap_bind: Invalid credentials (49) #ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w invalid-password -b "dc=example,dc=com" -x
ldap_bind: Invalid credentials (49) #ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w invalid-password -b "dc=example,dc=com" -x
ldap_bind: Invalid credentials (49) #ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w invalid-password -b "dc=example,dc=com" -x
ldap_bind: Constraint violation (19) additional info: Exceed password retry limit. Please try later.启用旧密码后,Directory 服务器在超过限制后锁定帐户,而进一步的尝试将使用
ldap_bind: Constraint violation (19)
错误阻止。
其他资源
第 15 章 禁用匿名绑定
如果用户尝试连接 Directory 服务器而不提供任何凭证,则此操作被称为 anonymous bind
。匿名绑定简化了搜索和读取操作,如在目录中查找电话号码,而无需用户首先进行身份验证。但是,匿名绑定也可能会造成安全隐患,因为没有帐户的用户可以访问数据。
默认情况下,在 Directory 服务器中启用了匿名绑定来搜索和读取操作。这允许未授权访问用户条目以及配置条目,如根目录服务器条目(DSE)。
15.1. 使用命令行禁用匿名绑定
要提高安全性,您可以禁用匿名绑定。
流程
将
nsslapd-allow-anonymous-access
配置参数设置为off
:#
dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-allow-anonymous-access=off
验证
运行搜索但不指定用户帐户:
#
ldapsearch -H ldap://server.example.com -b "dc=example,dc=com" -x
ldap_bind: Inappropriate authentication (48) additional info: Anonymous access is not allowed
15.2. 使用 Web 控制台禁用匿名绑定
要提高安全性,您可以禁用匿名绑定。
前提条件
- 在 web 控制台中登录到实例。
流程
- 导航到 Server → Server Settings → Advanced Settings。
-
将
Allow Anonymous Access
参数设置为off
。 - 点 Save。
验证
运行搜索但不指定用户帐户:
#
ldapsearch -H ldap://server.example.com -b "dc=example,dc=com" -x
ldap_bind: Inappropriate authentication (48) additional info: Anonymous access is not allowed
第 16 章 在复制环境中的所有服务器同步帐户锁定属性
目录服务器在本地存储帐户锁定属性。在具有多个服务器的环境中,配置这些属性的复制以防止攻击者试图登录到一台服务器,直到达到帐户锁定计数,然后再在其他服务器上继续。
16.1. Directory 服务器如何在复制环境中处理密码和帐户锁定策略
目录服务器强制实施密码和帐户锁定策略,如下所示:
- 在数据供应商强制密码策略
- 在复制拓扑中的所有服务器上强制实施帐户锁定策略
目录服务器复制以下密码策略属性:
-
passwordMinAge
-
passwordMaxAge
-
passwordExp
-
passwordWarning
但是,默认情况下,Directory 服务器不会复制常规帐户锁定属性:
-
passwordRetryCount
-
retryCountResetTime
-
accountUnlockTime
要防止攻击者试图登录到一个服务器,直到达到帐户锁定计数,然后再在其他服务器上继续,复制这些帐户锁定属性。
16.2. 配置 Directory Server 以复制帐户锁定属性
如果您使用一个帐户锁定策略或密码策略,它会更新 passwordRetryCount
、RetryCountResetTime
或 accountUnlockTime
属性,将 Directory Server 配置为复制这些属性,以便它们的值在所有服务器中相同。
对复制拓扑中的所有供应商执行此步骤。
前提条件
- 您已经配置了帐户锁定策略或密码策略,用于更新一个或多个上述属性。
- 您可以在复制环境中使用 Directory 服务器。
流程
启用密码策略属性复制:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdisglobal="on"
如果使用部分复制,显示复制中排除的属性列表:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt get --suffix "dc=example,dc=com" example-agreement | grep "nsDS5ReplicatedAttributeList"
使用默认设置时,不会显示输出,Directory 服务器复制帐户锁定属性。但是,如果命令返回排除属性列表,如下例所示,请验证属性列表:
nsDS5ReplicatedAttributeList: (objectclass=*) $ EXCLUDE accountUnlockTime passwordRetryCount retryCountResetTime example1 example2
在本例中,
帐户UnlockTime
、passwordRetryCount
和retryCountResetTime
lockout 策略属性不包括在复制中,以及其他属性。如果上一命令的输出列出了任何帐户锁定属性,请更新部分复制设置,使其只包含 lockout 策略属性以外的属性:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt set --suffix "dc=example,dc=com" --frac-list "example1 example2" example-agreement
验证
尝试以具有无效密码的用户身份执行搜索:
#
ldapsearch -H ldap://server.example.com -D "uid=example,ou=People,dc=example,dc=com" -w "invalid-password" -b "dc=example,dc=com" -x
ldap_bind: Invalid credentials (49)显示用户的
passwordRetryCount
属性:#
ldapsearch -H ldap://server.example.com -D "cn=Directory Manager" -W -b "uid=example,ou=People,dc=example,dc=com" -x passwordRetryCount
... dn: uid=example,ou=People,dc=example,dc=com passwordRetryCount: 1-
在复制拓扑的不同服务器中运行上一命令。如果
passwordRetryCount
属性的值相同,Directory 服务器会复制 属性。
其他资源
第 17 章 配置基于时间的帐户锁定策略
您可以使用帐户策略插件配置不同的基于时间的锁定策略,例如:
17.1. 在最后成功登录后自动禁用帐户一定时间
按照此流程,配置在 dc=example,dc=com
条目下激活的基于时间的锁定策略,该策略没有登录 21 天。
这个帐户不活动功能可确保员工离开公司,并且管理员忘记删除帐户,该目录服务器在一定时间后停用帐户。
流程
启用帐户策略插件:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
配置插件配置条目:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy config-entry set "cn=config,cn=Account Policy Plugin,cn=plugins,cn=config" --always-record-login yes --state-attr lastLoginTime --alt-state-attr 1.1 --spec-attr acctPolicySubentry --limit-attr accountInactivityLimit
这个命令使用以下选项:
-
--always-record-login yes
: 启用登录时间记录。这需要使用 Class of Service (CoS)或具有帐户策略的角色,即使它没有设置acctPolicySubentry
属性。 -
--state-attr lastLoginTime
:配置帐户策略插件将最后登录时间存储在用户的lastLoginTime
属性中。 -
--Alt-state-attr 1.1
:禁止使用 alternative 属性检查主属性是否不存在。默认情况下,Directory 服务器使用createTimestamp
属性作为替代方案。但是,如果 Directory 服务器没有设置lastLoginTime
属性,并且createTimestamp
比配置的不活跃周期旧,则 Directory 服务器会自动注销现有的用户。禁用 alternative 属性会导致 Directory 服务器在下次登录时自动将lastLoginTime
属性添加到用户条目。 -
--spec-attr acctPolicySubentry
: Configures Directory Server 将策略应用到设置了acctPolicySubentry
属性的条目。您可以在 CoS 条目中配置此属性。 -
--limit-attr accountInactivityLimit
: 配置 account inactivation 策略条目中的accountInactivityLimit
属性存储不活跃的时间。
-
重启实例:
#
dsctl instance_name restart
创建 account inactivation 策略条目:
#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: cn=Account Inactivation Policy,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectClass: extensibleObject objectClass: accountpolicy accountInactivityLimit: 1814400 cn: Account Inactivation PolicyaccountInactivityLimit
属性中的值在最后一次登录后将 Directory 服务器配置为激活帐户1814400
秒(21 天)。创建 CoS 模板条目:
#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: cn=TemplateCoS,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectClass: extensibleObject objectClass: cosTemplate acctPolicySubentry: cn=Account Inactivation Policy,dc=example,dc=com此模板条目引用帐户处于激活策略。
创建 CoS 定义条目:
#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: cn=DefinitionCoS,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectclass: cosSuperDefinition objectclass: cosPointerDefinition cosTemplateDn: cn=TemplateCoS,dc=example,dc=com cosAttribute: acctPolicySubentry default operational-default此定义条目引用 CoS 模板条目,并导致
acctPolicySubentry
属性出现在每个用户条目中,其值设置为cn=Account Inactivation Policy,dc=example,dc=com
。
验证
将用户的
lastLoginTime
属性设置为比您配置不活跃的时间旧的值:#
ldapmodify -H ldap://server.example.com -x -D "cn=Directory Manager" -W
dn: uid=example,ou=People,dc=example,dc=com changetype: modify replace: lastLoginTime lastLoginTime: 20210101000000Z尝试以这个用户身份连接到该目录:
#
ldapsearch -H ldap://server.example.com -x -D "uid=example,ou=People,dc=example,dc=com" -W -b "dc=example,dc=com"
ldap_bind: Constraint violation (19) additional info: Account inactivity limit exceeded. Contact system administrator to reset.如果 Directory Server 拒绝访问并返回这个错误,则帐户不活动。
其他资源
17.2. 在创建帐户后自动禁用帐户一定时间
按照以下步骤,在 dc=example,dc=com
条目中配置该帐户在管理员创建之后有 60 天过期。
例如,使用帐户过期功能来确保外部 worker 的帐户在创建后锁定一定时间。
流程
启用帐户策略插件:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
配置插件配置条目:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy config-entry set "cn=config,cn=Account Policy Plugin,cn=plugins,cn=config" --always-record-login yes --state-attr createTimestamp --alt-state-attr 1.1 --spec-attr acctPolicySubentry --limit-attr accountInactivityLimit
这个命令使用以下选项:
-
--always-record-login yes
: 启用登录时间记录。这需要使用 Class of Service (CoS)或具有帐户策略的角色,即使它没有设置acctPolicySubentry
属性。 -
--state-attr createTimestamp
:配置 Account Policy 插件使用createTimestamp
属性的值来计算帐户是否已过期。 -
--Alt-state-attr 1.1
:禁止使用 alternative 属性检查主属性是否不存在。 -
--spec-attr acctPolicySubentry
: Configures Directory Server 将策略应用到设置了acctPolicySubentry
属性的条目。您可以在 CoS 条目中配置此属性。 -
--limit-attr accountInactivityLimit
: 配置帐户过期策略条目中的accountInactivityLimit
属性存储最大期限。
-
重启实例:
#
dsctl instance_name restart
创建帐户过期策略条目:
#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: cn=Account Expiration Policy,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectClass: extensibleObject objectClass: accountpolicy accountInactivityLimit: 5184000 cn: Account Expiration PolicyaccountInactivityLimit
属性中的值配置该帐户在创建后5184000
秒(60 天)过期。创建 CoS 模板条目:
#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: cn=TemplateCoS,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectClass: extensibleObject objectClass: cosTemplate acctPolicySubentry: cn=Account Expiration Policy,dc=example,dc=com此模板条目引用帐户到期策略。
创建 CoS 定义条目:
#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: cn=DefinitionCoS,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectclass: cosSuperDefinition objectclass: cosPointerDefinition cosTemplateDn: cn=TemplateCoS,dc=example,dc=com cosAttribute: acctPolicySubentry default operational-default此定义条目引用 CoS 模板条目,并导致
acctPolicySubentry
属性出现在每个用户条目中,其值设置为cn=Account Expiration Policy,dc=example,dc=com
。
验证
尝试以存储在
dc=example,dc=com
条目中的用户连接该目录,其createTimestamp
属性被设置为 60 天前的一个值:#
ldapsearch -H ldap://server.example.com -x -D "uid=example,dc=example,dc=com" -W -b "dc=example,dc=com"
ldap_bind: Constraint violation (19) additional info: Account inactivity limit exceeded. Contact system administrator to reset.如果 Directory Server 拒绝访问并返回这个错误,则帐户过期工作。
其他资源
17.3. 在密码到期后自动禁用帐户所需时间
按照以下步骤配置在 dc=example,dc=com
条目下激活用户的基于时间的锁定策略,该策略不会更改其密码超过 28 天。
前提条件
-
用户必须在其条目中设置
passwordExpirationTime
属性。
流程
启用密码过期功能:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com config replace passwordExp=on
启用帐户策略插件:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
配置插件配置条目:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy config-entry set "cn=config,cn=Account Policy Plugin,cn=plugins,cn=config" --always-record-login yes --always-record-login-attr lastLoginTime --state-attr non_existent_attribute --alt-state-attr passwordExpirationTime --spec-attr acctPolicySubentry --limit-attr accountInactivityLimit
这个命令使用以下选项:
-
--always-record-login yes
: 启用登录时间记录。这需要使用 Class of Service (CoS)或具有帐户策略的角色,即使它没有设置acctPolicySubentry
属性。 -
--always-record-login-attr lastLoginTime
:配置帐户策略插件将最后登录时间存储在用户的lastLoginTime
属性中。 -
--state-attr non_attribute
:设置用于评估帐户策略到不存在的 dummy 属性的主要时间属性。 -
--Alt-state-attr 'passwordExpirationTime
:配置插件以使用passwordExpirationTime
属性作为替代属性。 -
--spec-attr acctPolicySubentry
: Configures Directory Server 将策略应用到设置了acctPolicySubentry
属性的条目。您可以在 CoS 条目中配置此属性。 -
--limit-attr accountInactivityLimit
: 配置帐户策略条目中的accountInactivityLimit
属性会在帐户上次密码更改后被激活时保存时间。
-
重启实例:
#
dsctl instance_name restart
创建 account inactivation 策略条目:
#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: cn=Account Inactivation Policy,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectClass: extensibleObject objectClass: accountpolicy accountInactivityLimit: 2419200 cn: Account Inactivation PolicyaccountInactivityLimit
属性中的值在更改密码后将 Directory 服务器配置为激活帐户2419200
秒(28 天)。创建 CoS 模板条目:
#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: cn=TemplateCoS,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectClass: extensibleObject objectClass: cosTemplate acctPolicySubentry: cn=Account Inactivation Policy,dc=example,dc=com此模板条目引用帐户处于激活策略。
创建 CoS 定义条目:
#
ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
dn: cn=DefinitionCoS,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectclass: cosSuperDefinition objectclass: cosPointerDefinition cosTemplateDn: cn=TemplateCoS,dc=example,dc=com cosAttribute: acctPolicySubentry default operational-default此定义条目引用 CoS 模板条目,并导致
acctPolicySubentry
属性出现在每个用户条目中,其值设置为cn=Account Inactivation Policy,dc=example,dc=com
。
验证
将用户的
passwordExpirationTime
属性设置为比您配置不活跃的时间旧的值:#
ldapmodify -H ldap://server.example.com -x -D "cn=Directory Manager" -W
dn: uid=example,ou=People,dc=example,dc=com changetype: modify replace: passwordExpirationTime passwordExpirationTime: 20210101000000Z尝试以这个用户身份连接到该目录:
#
ldapsearch -H ldap://server.example.com -x -D "uid=example,ou=People,dc=example,dc=com" -W -b "dc=example,dc=com"
ldap_bind: Constraint violation (19) additional info: Account inactivity limit exceeded. Contact system administrator to reset.如果 Directory Server 拒绝访问并返回这个错误,则帐户不活动。
其他资源
17.4. 在帐户不活跃和密码过期时自动禁用帐户
在使用 checkAllStateAttrs
设置进行身份验证时,您可以同时应用帐户不活跃和密码过期。默认情况下,当插件配置条目中没有 checkAllStateAttrs
时,或者在将此参数设置为 no
时,插件会检查 state 属性 lastLoginTime
。如果条目中没有属性,则插件会检查备用 state 属性。
您可以将 main state 属性设置为不存在的属性,并在您希望插件根据 passwordExpirationtime
属性处理过期时将备用 state 属性设置为 passwordExpirationtime
。当您启用此参数时,它会检查 main state 属性,以及帐户是否微调,然后检查备用状态属性。
这与密码策略的密码过期不同,因为如果密码过期时间超过不活跃的限制,则帐户策略插件会完全禁用帐户。使用密码策略过期时,用户仍然可以登录并更改其密码。帐户策略插件完全阻止用户进行任何操作,管理员必须重置帐户。
流程
创建插件配置条目并启用设置:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy config-entry set "cn=config,cn=Account Policy Plugin,cn=plugins,cn=config" --always-record-login yes --state-attr lastLoginTime --alt-state-attr 1.1 --spec-attr acctPolicySubentry --limit-attr accountInactivityLimit --check-all-state-attrs yes
重启服务器以载入新的插件配置:
#
dsctl instance_name restart
警告checkAllStateAttrs
设置设计为仅在 alternate state 属性设置为passwordExpiratontime
时工作。将它设置为createTimestamp
可能会导致不必要的结果,条目可能会被锁定。
第 18 章 重新启用达到不活跃限制的帐户
如果 Directory Server 在激活帐户中因为已达到不活跃限制而被激活,管理员可以重新启用该帐户。
18.1. 在帐户策略插件中重新启用帐户
您可以使用 dsconf account unlock
命令重新启用帐户,或者通过手动更新activated 用户的 lastLoginTime
属性来重新启用帐户。
前提条件
- 激活的用户帐户。
流程
使用以下方法之一重新激活帐户:
使用
dsconf 帐户解锁
命令:#
dsidm -D "cn=Directory manager" ldap://server.example.com -b "dc=example,dc=com" account unlock "uid=example,ou=People,dc=example,dc=com"
通过将用户的
lastLoginTime
属性设置为最新的时间戳:#
ldapmodify -H ldap://server.example.com -x -D "cn=Directory Manager" -W
dn: uid=example,ou=People,dc=example,dc=com changetype: modify replace: lastLoginTime lastLoginTime: 20210901000000Z
验证
以您重新激活的用户身份进行身份验证。例如,执行搜索:
#
ldapsearch -H ldap://server.example.com -x -D "uid=example,ou=People,dc=example,dc=com" -W -b "dc=example,dc=com -s base"
如果用户可以成功验证,则帐户被重新激活。
第 19 章 在不设置锁定策略的情况下跟踪最后的登录时间
您可以使用帐户策略插件来跟踪用户登录时间,而不设置过期时间或不活跃的时间。在本例中,插件将 lastLoginTime
属性添加到用户条目。
19.1. 配置帐户策略插件以记录最后的登录时间
按照以下步骤在用户条目的 lastLoginTime
属性中记录用户的最后登录时间。
流程
启用帐户策略插件:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
创建插件配置条目来记录登录时间:
#
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy config-entry set "cn=config,cn=Account Policy Plugin,cn=plugins,cn=config" --always-record-login yes --state-attr lastLoginTime
这个命令使用以下选项:
-
--always-record-login yes
: 启用日志记录时间。 -
--state-attr lastLoginTime
:配置帐户策略插件将最后登录时间存储在用户的lastLoginTime
属性中。
-
重启实例:
#
dsctl instance_name restart
验证
以某一用户身份登录 Directory 服务器。例如,运行搜索:
#
ldapsearch -H ldap://server.example.com -x -D "uid=example,ou=People,dc=example,dc=com" -W -b "dc=example,dc=com"
显示您在上一步中使用的用户的
lastLoginTime
属性:#
ldapsearch -H ldap://server.example.com -x -D "cn=Directory Manager" -W -b "uid=example,ou=people,dc=example,dc=com" lastLoginTime
... dn: uid=example,ou=People,dc=example,dc=com lastLoginTime: 20210913091435Z如果
lastLoginTime
属性存在,并且 Directory 服务器更新了其值,则最后一次登录时间记录可以正常工作。
第 20 章 在 Directory Manager 帐户上设置访问控制
从维护的角度来说,拥有不受限制的管理用户有意义。Directory Manager 需要高级别的访问权限,才能执行维护任务并响应事件。
但是,由于 Directory Manager 用户的力量,建议您对一定程度的访问控制进行,防止以管理员用户身份执行攻击。
20.1. 关于 Directory Manager 帐户的访问控制
目录服务器仅对目录树应用常规访问控制指令。Directory Manager 帐户的权限被硬编码,您不能在绑定规则中使用此帐户。要限制对 Directory Manager 帐户的访问,请使用 RootDN Access Control
插件。
这个插件的功能与标准访问控制指令(ACI)不同。例如,某些信息(如目录管理器条目)和允许的权限(所有信息)被简化。RootDN Access Control
插件的目的是通过限制谁根据其位置或时间登录为 Directory Manager 来提供安全性,而不限制这个用户可以执行的操作。
因此,插件的设置仅支持:
- 基于时间的访问控制,在一定天数和特定时间范围内允许或拒绝访问
- IP 地址规则,允许或拒绝访问定义的 IP 地址、子网和域
- 主机访问规则,允许或拒绝来自特定主机、域和子域的访问
只能为 Directory Manager 设置的一个访问控制规则。它在插件条目中,它应用到整个目录。
与在常规 ACI 中相同,拒绝规则的优先级高于允许规则。
确保 Directory Manager 帐户具有适当的访问级别。此管理用户可能需要在非小时内执行维护操作,或者响应故障。在这种情况下,设置太严格的时间或日期规则可能会阻止 Directory Manager 用户足够地管理该目录。
20.2. 使用命令行配置 RootDN 访问控制插件
默认情况下,RootDN Access Control
插件被禁用。要限制 Directory Manager 帐户的权限,请启用并配置插件。
流程
启用
RootDN Access Control
插件:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin root-dn enable
设置绑定规则。例如,要允许 Directory Manager 帐户仅从 IP 地址为
192.0.2.1
的主机登录 6am 和 9pm,请输入:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin root-dn set --open-time=0600 --close-time=2100 --allow-ip="192.0.2.1"
有关您可以设置的参数及其描述的完整列表,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin root-dn set --help
重启实例:
#
dsctl instance_name restart
验证
从不允许或者超过允许的时间范围的主机执行来自
cn=Directory Manager
的查询:[user@192.0.2.2]$ ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b "dc=example,dc=com" Enter LDAP Password: ldap_bind: Server is unwilling to perform (53) additional info: RootDN access control violation
如果 Directory Server 拒绝访问,则插件可以正常工作。
20.3. 使用 Web 控制台配置 RootDN 访问控制插件
默认情况下,RootDN Access Control
插件被禁用。要限制 Directory Manager 帐户的权限,请启用并配置插件。
前提条件
- 在 web 控制台中登录到实例。
流程
- 导航到 Plugins → RootDN Access Control。
- 启用插件。
根据您的要求填写字段。
- 点 Save。
-
点击右上角的 Actions,然后选择
Restart Instance
。
验证
从不允许或者超过允许的时间范围的主机执行来自
cn=Directory Manager
的查询:[user@192.0.2.2]$ ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b "dc=example,dc=com" Enter LDAP Password: ldap_bind: Server is unwilling to perform (53) additional info: RootDN access control violation
如果 Directory Server 拒绝访问,则插件可以正常工作。
第 21 章 管理属性加密
目录服务器提供了许多保护访问目录中敏感数据的机制。但是,默认情况下,服务器会在数据库中以未加密的方式存储数据。对于高度敏感信息,攻击者可以访问数据库的潜在风险可能会带来巨大风险。
借助属性加密功能,管理员可以利用敏感数据来存储特定的属性,如政府识别号在数据库中加密。当为后缀启用时,这些属性的每个实例(甚至索引数据)都会为存储在数据库中的每个条目进行加密。请注意,您可以为后缀启用属性加密。要为整个服务器启用此功能,您必须在服务器上为每个后缀启用属性加密。属性加密与 eq
和 pres
索引完全兼容。
您在条目中使用的任何属性均可有效地加密名称(DN)。例如,如果您配置为加密 uid
属性,则该值会在条目中加密,但不在 DN 中加密:
dn: uid=demo_user,ou=People,dc=example,dc=com ... uid::Sf04P9nJWGU1qiW9JJCGRg==
21.1. 密钥目录服务器使用 进行属性加密
要使用属性加密,您必须使用 TLS 配置加密连接。目录服务器使用服务器的 TLS 加密密钥以及相同的 PIN 输入法进行属性加密。
服务器使用随机生成的对称密码密钥来加密和解密属性数据。服务器使用这些密钥,使用来自服务器的 TLS 证书的公钥。因此,属性加密的有效强度不能高于服务器的 TLS 密钥的强度。
如果没有访问服务器的私钥,无法从嵌套的副本中恢复对称密钥。因此,定期备份服务器的证书数据库。如果丢失了密钥,您将不再能够解密并加密数据库中存储的数据。
21.2. 使用命令行启用属性加密
此流程演示了如何使用命令行在 userRoot
数据库中为 phone Number
属性启用属性加密。执行流程后,服务器会存储此属性 AES- 加密的现有和新值。
前提条件
- 您已在 Directory 服务器中启用了 TLS 加密。
流程
导出
userRoot
数据库:# dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot
服务器将导出存储在
/var/lib/dirsrv/slapd-instance_name/ldif/
目录中。e选项
解密导出过程中已加密的属性。为
telephoneNumber
属性启用 AES 加密:# dsconf -D "cn=Directory Manager" ldap://server.example.com backend attr-encrypt --add-attr telephoneNumber dc=example,dc=com
停止实例:
# dsctl instance_name stop
导入 LDIF 文件:
# dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
--encrypted
参数可让脚本加密导入期间为加密配置的属性。启动实例:
# dsctl instance_name start
其他资源
21.3. 使用 Web 控制台启用属性加密
此流程演示了如何使用 Web 控制台为 userRoot
数据库中 phone Number
属性启用属性加密。执行流程后,服务器会存储此属性 AES- 加密的现有和新值。
请注意,Web 控制台中的导出和导入功能不支持加密的属性。因此,您必须在命令行中执行这些步骤。
前提条件
- 您已在 Directory 服务器中启用了 TLS 加密。
- 在 web 控制台中登录到实例。
流程
导出
userRoot
数据库:# dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot
服务器将导出存储在
/var/lib/dirsrv/slapd-instance_name/ldif/
目录中。e选项
解密导出过程中已加密的属性。- 在 web 控制台中,进入到 Database → Suffixes → suffix_entry → Encrypted Attributes。
- 输入要加密的属性,然后单击 Add Attribute。
-
在 Actions 菜单中,选择
Stop Instance
。 在命令行中导入 LDIF 文件:
# dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
--encrypted
参数可让脚本加密导入期间为加密配置的属性。-
在 Web 控制台中,打开 Actions 菜单,然后选择
Start Instance
。
其他资源
21.4. 启用属性加密后的常规注意事项
为数据库中的数据启用加密后请考虑以下几点:
在服务器的数据库页面池支持文件中可以保留未加密的数据。删除此数据:
停止实例:
# dsctl instance_name stop
删除
/var/lib/dirsrv/slapd-instance_name/db/guardian
文件:# **rm /var/lib/dirsrv/slapd-instance_name/db/guardian``
启动实例:
# dsctl instance_name start
- 启用加密并成功导入数据后,使用未加密的数据删除 LDIF 文件。
- 目录服务器不加密复制日志文件。为保护这些数据,将复制日志存储在加密的磁盘上。
- 服务器内存(RAM)中的数据是未加密的,可以临时存储在交换分区中。为保护这些数据,请配置加密的交换空间。
即使您删除了包含未加密数据的文件,在某些情况下也可以恢复这些数据。
21.5. 更新用于属性加密的 TLS 证书
属性加密基于服务器的 TLS 证书。按照以下步骤,在续订或替换 TLS 证书后防止属性加密失败。
前提条件
- 您已经配置的属性加密。
- TLS 证书将在不久的将来过期。
流程
导出
userRoot
数据库:# dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot
服务器将导出存储在
/var/lib/dirsrv/slapd-instance_name/ldif/
目录中。e选项
解密导出过程中已加密的属性。创建私钥和证书签名请求(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" server.example.com server.example.net
如果将主机名指定为最后一个参数,该命令会通过
DNS:server.example.com 添加 Subject Alternative Name (SAN)扩展,DNS:server.example.net
条目到 CSR。
根据 RFC 1485,在
-s subject
参数中指定的字符串必须是有效的主题名称。subject 中的CN
字段是必需的,且您必须将它设置为服务器的完全限定域名(FQDN)。命令将 CSR 存储在/etc/dirsrv/slapd-instance_name/Server-Cert.csr
文件中。- 将 CSR 提交到证书颁发机构(CA)以获取签发的证书。详情请查看您的 CA 文档。
将 CA 发布的服务器证书导入到 NSS 数据库:
如果使用
dsctl tls generate-server-cert-csr
命令创建私钥,请输入:# dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate add --file /root/instance_name.crt --name "server-cert" --primary-cert
请记住在
--name _certificate_nickname
参数中设置的证书名称。后续步骤中需要用到它。如果您使用外部实用程序创建了私钥,请导入服务器证书和私钥:
# dsctl instance_name tls import-server-key-cert /root/server.crt /root/server.key
请注意,命令要求您首先指定服务器证书的路径,然后再指定私钥的路径。这个方法始终将证书的 nickname 设置为
Server-Cert
。
将 CA 证书导入到 NSS 数据库:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate add --file /root/ca.crt --name "Example CA"
设置 CA 证书的信任标记:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "CT,,"
这会将 Directory 服务器配置为信任 TLS 加密和基于证书的身份验证的 CA。
停止实例:
# dsctl instance_name stop
编辑
/etc/dirsrv/slapd-instance_name/dse.ldif
文件,并删除以下条目,包括它们的属性:-
cn=AES,cn=encrypted 属性 keys,cn=database_name,cn=ldbm database,cn=plugins,cn=config
-
cn=3DES,cn=encrypted 属性 key,cn=database_name,cn=ldbm database,cn=plugins,cn=config
重要删除所有数据库的条目。如果包含
nsSymmetricKey
属性的任何条目都保留在 '/etc/dirsrv/slapd-instance_name/dse.ldif 文件中,Directory 服务器将无法启动。-
导入 LDIF 文件:
# dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
--encrypted
参数可让脚本加密导入期间为加密配置的属性。启动实例:
# dsctl instance_name start