保护红帽目录服务器

Red Hat Directory Server 12

提高目录服务器的安全性

Red Hat Customer Content Services

摘要

使用红帽目录服务器提高 LDAP 服务的安全性。例如,您可以加密客户端与 Directory 服务器之间的连接,并将加密属性存储在目录服务器数据库中。您还可以加密复制更改日志、配置身份验证并执行其他安全任务。

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。要做到这一点:

  • 要通过 JIRA 提交反馈(需要帐户):

    1. 登录到 Jira 网站。
    2. 在顶部导航栏中点 Create
    3. Summary 字段中输入描述性标题。
    4. Description 字段中输入您对改进的建议。包括到文档相关部分的链接。
    5. 点对话框底部的 Create
  • 要通过 Bugzilla 提交反馈(需要帐户):

    1. 进入 Bugzilla 网站。
    2. 在 Component 中选择 Documentation
    3. Description 中输入您要提供的信息。包括文档相关部分的链接。
    4. Submit Bug

第 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 or dsctl 实用程序启动 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 进程没有由 systemctldsctl 程序启动,并且进程从终端分离时,N ns-slapd 使用 wall 命令将消息发送到所有终端:

    Broadcast message from root@server (Fri 2021-01-01 06:00:00 CET):
    
    Password entry required for 'Enter PIN for Internal (Software) Token:' (PID 1234).
    Please enter password with the systemd-tty-ask-password-agent tool!

    要输入密码:

    # systemd-tty-ask-password-agent
    Enter PIN for Internal (Software) Token:

1.3. 使用命令行启用与目录服务器的 TLS 加密连接

要使用 TLS 加密或基于证书的身份验证,您必须在网络安全服务(NSS)数据库中管理证书。当您创建实例时,dscreate 工具会在 /etc/dirsrv/slapd-instance_name/ 目录中自动创建此数据库,并使用强密码对其进行保护。

流程

  1. 创建私钥和证书签名请求(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 文件中。

  2. 将 CSR 提交到证书颁发机构(CA)以获取签发的证书。详情请查看您的 CA 文档。
  3. 将 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

  4. 将 CA 证书导入到 NSS 数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate add --file /root/ca.crt --name "Example CA"
  5. 设置 CA 证书的信任标记:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "CT,,"

    这会将 Directory 服务器配置为信任 TLS 加密和基于证书的身份验证的 CA。

  6. 启用 TLS 并设置 LDAPS 端口:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-securePort=636 nsslapd-security=on
  7. firewalld 服务中打开 LDAPS 端口:

    # firewall-cmd --permanent --add-port=636/tcp
    # firewall-cmd --reload
  8. 启用 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 数据库中安全设备的名称 为内部(软件)

  9. 可选:禁用纯文本 LDAP 端口:

    # dsconf inst security disable_plain_port
  10. 重启实例

    # 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 控制台中登录到实例。

流程

  1. 导航到 ServerSecurityCertificate ManagementCertificate Signing Request,再单击 Create Certificate Signing Request
  2. 为证书签名请求(CSR)、通用名称(CN)和机构(O)设置名称:

    添加 csr

    如果您的主机可以被多个名称访问,请在 Subject Alternative Names 文件中设置替代名称。

  3. 单击 Create Certificate Signing Request
  4. 查看 CSR 文本并复制它:

    1. 单击您要查看的 CSR 的 Node options 图标,然后选择 View CSR
    2. 复制 CSR 内容。
  5. 将 CSR 文件提交到证书颁发机构(CA)以获取签发证书。详情请查看您的 CA 文档。
  6. 从 CA 获取证书时,导航到 ServerSecurityCertificate ManagementTLS Certificates,然后单击 Add Server Certificate
  7. 为服务器证书设置唯一 nickname,上传发布的证书,然后点 Add Certificate

    请记住证书别名,因为后续步骤需要它。

  8. 导航到 ServerSecurityCertificate ManagementTrusted Certificate Authorities,然后单击 Add CA 证书
  9. 为 CA 证书设置唯一 nickname,上传 CA 证书文件,然后点 Add Certificate
  10. 可选:如果您在 Directory Server 实例安装过程中没有启用 TLS 加密,请启用它:

    1. 导航到 ServerSecurity Settings,再启用安全交换机。
    2. 在弹出窗口中点 Enable Security
    3. Security Setting 页面上,单击 Save Configuration
  11. 安全配置页面中的配置服务器证书名称

    1. 导航到 ServerSecuritySecurity Configuration
    2. Server Certificate Name 下拉列表中选择服务器证书 nickname,然后点 Save Configuration
    3. 可选: 如果您在下拉列表中没有看到证书 nickname,请刷新 Security Settings 页面并再次执行上一步。
  12. 可选: 如果要使用 636 以外的 LDAPS 端口,请导航到 ServerServer Settings,设置 LDAPS 端口,然后点 Save
  13. firewalld 服务中打开 LDAPS 端口:

    # firewall-cmd --permanent --add-port=636/tcp
    # firewall-cmd --reload
  14. 可选:进入到 ServerSecuritySecurity Configuration,选择 Require Secure Connections,点 Save Configuration

    目录服务器禁用纯文本 LDAP 端口。

  15. 点右上角的 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 文件中。

流程

  1. 使用以下命令更改 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.
  2. 如果您使用密码文件自动启动 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 数据库密码。

流程

  1. 使用以下内容创建 /etc/dirsrv/slapd-instance_name/pin.txt 文件:

    • 如果您使用 NSS 软件加密模块,这是默认设置:

      Internal (Software) Token:password
    • 如果您使用硬件安全模块(HSM):

      name_of_the_token:password
  2. 设置文件权限:

    # 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 文件中找到此密码。

流程

  1. 如果您没有 Directory 服务器使用的 CA 证书的本地副本:

    1. 列出服务器网络安全服务(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
    2. 使用 NSS 数据库中 CA 证书的别名导出 CA 证书:

      # certutil -d /etc/dirsrv/slapd-instance_name/ -L -n "Example CA" -a > /tmp/ds-ca.crt
  2. 将 CA 证书复制到 /etc/pki/ca-trust/source/anchors/ 目录中:

    # cp /tmp/ds-ca.crt /etc/pki/ca-trust/source/anchors/
  3. 重建 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 加密。

流程

  1. 可选:显示 Directory 服务器中当前启用的 TLS 协议:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security get | egrep -i "sslVersionMin|sslVersionMax"
    sslversionmin: TLS1.2
    sslversionmax: TLS1.3
  2. 设置最小 TLS 协议。例如,要将它设置为 TLS 1.3,请输入:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-protocol-min="TLS1.3"

    请注意,您无法将参数设置为比 TLS 1.2 低的值,这是所有 RHEL 系统范围的加密策略配置集的最低值。

  3. 不建议:设置支持最高的 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

  4. 重启实例:

    # dsctl instance_name restart

验证

  1. 显示支持的 TLS 协议:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security get | egrep -i "sslVersionMin|sslVersionMax"
    sslversionmin: TLS1.3
    sslversionmax: TLS1.3
  2. 使用 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 实例。

流程

  1. 导航到 ServerSecurity
  2. Minimum TLS Version 字段中设置最小 TLS 协议。
  3. 不建议:在 Maximum TLS Version 字段中设置支持最高的 TLS 协议。
  4. Save Settings
  5. 点击右上角的 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 服务器配置为在向服务器进行身份验证时需要加密的连接。

注意

绑定操作需要安全连接仅适用于经过身份验证的绑定。在没有密码的情况下绑定操作(如匿名和未经身份验证的绑定)可以继续进行标准连接。

前提条件

  • 您已经配置了服务器到服务器的连接,如复制协议,以使用安全绑定。

流程

  1. nsslapd-require-secure-binds 配置参数设置为 on:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-require-secure-binds=on
  2. 可选: 如果要使用 LDAPS,请禁用纯文本 LDAP 端口:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security disable_plain_port
  3. 重启实例:

    # dsctl instance_name restart
重要

当您启用此功能时,所有连接都需要它。例如,这包括复制协议、同步和数据库链。

3.2. 使用 Web 控制台配置 Directory 服务器来接受使用 LDAPS 或 STARTTLS 加密的连接

默认情况下,Directory 服务器允许使用绑定 DN 和密码进行未加密的连接进行身份验证,这是一个安全风险。假设您不能使用其他安全机制,如基于证书的身份验证或 SASL。在这种情况下,您可以使用 TLS 或 STARTTLS 将 Directory 服务器配置为在向服务器进行身份验证时需要加密的连接。

注意

绑定操作需要安全连接仅适用于经过身份验证的绑定。在没有密码的情况下绑定操作(如匿名和未经身份验证的绑定)可以继续进行标准连接。

前提条件

  • 您已经配置了服务器到服务器的连接,如复制协议,以使用安全绑定。
  • 在 web 控制台中登录到实例。

流程

  1. 进入到 ServerSecuritySecurity Configuration,选择 Require Secure Connections 选项,点 Save Configuration
  2. 可选:如果要使用 LDAPS,进入到 ServerServer SettingsGeneral Settings,将 LDAP Port 设置为 0 来禁用明文 LDAP 端口。点 Save
  3. 点击右上角的 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 加密。

流程

  1. 显示启用的密码列表:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list
    default

    default 关键字表示只启用网络安全服务(NSS)中启用的密码。

  2. 如果您需要启用弱密码,请输入:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security set --allow-insecure-ciphers on
  3. 更新 nsSSL3Ciphers 参数。例如:要仅启用 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384TLS_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,因为它可能会出错,这会导致不同的密码选择。

  4. 重启实例:

    # 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 控制台中登录到实例。

流程

  1. 如果您需要启用弱密码:

    1. 进入到 ServerSecuritySecurity Configuration
    2. 选择 Allow Weak Ciphers
    3. Save Settings
  2. 导航到 ServerSecurityCipher Preferences
  3. 更新密码设置。例如,仅启用 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 密码:

    1. Cipher Suite 字段中选择 No Ciphers
    2. Allow Specific Ciphers 字段中输入 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  4. Save Settings
  5. ActionsRestart Instance

验证

  • 导航到 ServerSecurityCipher PreferencesEnabled 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)数据库。

流程

  1. 使用以下命令更改 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)数据库。

流程

  1. 导航到 ServerSecurityCertificate ManagementTrusted Certificate Authorities
  2. 点 CA 证书旁边的 …​ 图标,然后选择 Edit Trust Flags
  3. 选择信任标志。

    CA cert set trust 标记
  4. Save

验证

  1. 导航到 ServerSecurityCertificate ManagementTrusted Certificate Authorities
  2. CA 证书旁的 > 显示信任标记。

第 6 章 续订 TLS 证书

TLS 证书具有过期日期和时间。要持续提供安全连接,请在 Directory Server 过期前更新服务器证书。

6.1. 使用命令行更新 TLS 证书

在 TLS 服务器证书过期以续订它前按照以下步骤操作。

前提条件

  • 未配置属性加密。
  • TLS 证书将在不久的将来过期。

流程

  1. 创建私钥和证书签名请求(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 文件中。

  2. 将 CSR 提交到证书颁发机构(CA)以获取签发的证书。详情请查看您的 CA 文档。
  3. 将 CA 证书和服务器证书存储在 /root/ 目录中。
  4. 使用以下选项之一将 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

  5. 将 CA 证书导入到 NSS 数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate add --file /root/ca.crt --name "Example CA"
  6. 设置 CA 证书的信任标记:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "CT,,"

    这会将 Directory 服务器配置为信任 TLS 加密和基于证书的身份验证的 CA。

  7. 停止实例:

    # dsctl instance_name stop
  8. 编辑 /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 服务器将无法启动。

  9. 启动实例:

    # dsctl instance_name start

第 7 章 配置基于证书的身份验证

目录服务器支持 LDAP 客户端和服务器到服务器连接(如复制拓扑)的基于证书的身份验证。

根据配置,客户端可以或必须使用证书进行身份验证。在验证证书后,根据证书的主题字段中的属性,服务器将搜索 目录中的用户。如果搜索只返回一个用户条目,Directory 服务器会将此用户用于所有进一步的操作。另外,您可以配置用于身份验证的证书必须与用户条目的 userCertificate 属性中存储的证书匹配。

使用基于证书的身份验证的好处:

  • 提高了效率:与证书数据库密码进行身份验证,然后为所有后续绑定或身份验证操作使用该证书比重复提供可分辨的名称(DN)和密码更有效。
  • 提高安全性:由于基于证书的验证使用公钥加密,因此基于证书的身份验证更为安全,而非certificate 绑定操作。攻击者无法通过网络拦截绑定凭证。如果证书或设备丢失,则在没有 PIN 的情况下使用,因此很容易与第三方的干扰,比如网络攻击。

7.1. 设置基于证书的身份验证

前提条件

  • 您在 Directory 服务器中启用了 TLS 加密。
  • 您在网络安全服务(NSS)数据库中为证书颁发机构(CA)证书设置 CT 标志。

流程

  1. 创建 /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 参数为此签发者设置了空的。另外,FilterCompsVerifyCert 的设置从默认条目继承。

    带有与 cn=Example CA 不同的签发者 DN 的证书将使用 default 条目中的设置,并根据证书主体中的 cn 属性生成基本 DN。这可让 Directory Server 在特定 DN 下启动搜索,而不搜索整个目录。

    对于所有证书,Directory 服务器使用证书主体中的 mailcn 属性生成搜索过滤器。但是,如果主题中没有 mail 属性,Directory 服务器将自动使用主题中证书 e 属性的值。

  2. 启用基于证书的身份验证。例如,要将基于证书的身份验证配置为可选,请输入:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-client-auth="allowed"

    使用 --tls-client-auth=required 选项将基于证书的身份验证配置为强制性。

  3. 可选:如果您根据需要配置了基于证书的身份验证,请启用 nsslapd-require-secure-binds 参数:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-require-secure-binds=on

    此设置确保用户无法使用未加密的连接绕过基于证书的身份验证。

  4. 可选:如果 Directory 服务器应该使用证书中的身份而不是绑定请求中的凭证,请将 Directory 服务器配置为使用 EXTERNAL 简单验证和安全层(SASL)机制:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-force-sasl-external=on

    使用这个设置时,Directory 服务器会忽略与证书中身份以外的任何其他绑定方法。

  5. 重启实例:

    # dsctl instance_name restart

后续步骤:

  • 如果您配置了 Directory 服务器,以便身份验证证书必须与用户的 userCertificate 属性中存储的证书匹配,请将证书添加到用户条目。详情请查看 第 7.2 节 “将证书添加到用户”

7.2. 将证书添加到用户

当您设置基于证书的身份验证时,您可以配置服务器,以便用于身份验证的证书必须与用户 userCertificate 二进制文件中存储的证书匹配。如果您启用了这个功能,您必须将受影响用户的证书添加到其目录条目中。

前提条件

  • 在 Directory 服务器中启用了基于证书的身份验证。
  • 您有一个由服务器信任的证书颁发机构(CA)发布的客户端证书。
  • 客户端证书是可分辨的编码规则(DER)格式。
  • 客户端证书满足服务器上 /etc/dirsrv/slapd-instance_name/certmap.conf 中设置的要求。

流程

  1. 如果证书不是 DER 格式,请将其转换。例如,要将证书从隐私增强的邮件(PEM)转换为 DER,请输入:

    # openssl x509 -in /home/user_name/certificate.pem -out /home/user_name/certificate.der -outform DER
  2. 将证书添加到用户的 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

验证

  1. 使用基于证书的身份验证以用户身份进行身份验证:

    1. 将以下环境变量设置为 CA 证书、用户密钥和用户证书的对应路径:

      LDAPTLS_CACERT=/home/user_name/CA.crt
      LDAPTLS_KEY=/home/user_name/user.key
      LDAPTLS_CERT=/home/user_name/user.der

      另外,还可在当前用户的 ~/.ldaprc 文件中设置 TLS_CACERTTLS_KEYTLS_CERT 参数。

    2. 连接到服务器:

      # 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 文档。

流程

  1. 如果不存在,请创建 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
  2. 为两个服务器创建帐户,如 cn=server1,ou=services,dc=example,dc=comcn=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"
  3. 创建一个组,如 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"
  4. 将两个复制帐户作为成员添加到组中:

    # 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.comserver2.example.com 上的目录服务器中启用 TLS 加密。

流程

  1. 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 必须是 165534 之间的唯一整数,用于拓扑中的所有供应商的后缀。

  2. server1.example.com 上:

    1. 启用复制:

      # dsconf -D "cn=Directory Manager" ldaps://server1.example.com replication enable --suffix="dc=example,dc=com" --role="supplier" --replica-id="1"
    2. 创建一个临时复制协议,它使用上一步中的临时帐户进行身份验证:

      # 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

验证

  1. 验证初始化是否成功:

    # 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.comserver2.example.com 设置基于证书的身份验证。
  • 目录服务器信任发布客户端证书的证书颁发机构(CA)。
  • 客户端证书满足服务器上 /etc/dirsrv/slapd-instance_name/certmap.conf 中设置的要求。

流程

  1. server1.example.com 上:

    1. 删除临时复制协议:

      # dsconf -D "cn=Directory Manager" ldaps://server1.example.com repl-agmt delete --suffix="dc=example,dc=com" temporary_agreement
    2. 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"
    3. 配置 Directory 服务器,以自动检查绑定组中的更改:

      # dsconf -D "cn=Directory Manager" ldaps://server1.example.com replication set --suffix="dc=example,dc=com" --repl-bind-group-interval=0
  2. server2.example.com 上:

    1. 删除临时复制管理器帐户:

      # dsconf -D "cn=Directory Manager" ldaps://server2.example.com replication delete-manager --suffix="dc=example,dc=com" --name="Replication Manager"
    2. 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"
    3. 配置 Directory 服务器,以自动检查绑定组中的更改:

      # dsconf -D "cn=Directory Manager" ldap://server2.example.com replication set --suffix="dc=example,dc=com" --repl-bind-group-interval=0
    4. 使用基于证书的身份验证创建复制协议:

      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
  3. 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

验证

  1. 在每台服务器中验证初始化是否成功:

    # 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。

流程

  1. 将 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"
  2. dc=example,dc=com 后缀启用更改日志加密:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com replication --suffix "dc=example,dc=com" --encrypt
  3. /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
  4. 重启实例:

    # dsctl instance_name restart

验证

  1. 在 LDAP 目录中进行更改,例如更新条目。
  2. 停止实例:

    # dsctl instance_name stop
  3. 列出后缀及其对应的数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)

    记录启用 changelog 加密的数据库名称。

  4. 输入以下命令显示 changelog 的部分:

    # dbscan -f /var/lib/dirsrv/slapd-instance_name/db/userroot/replication_changelog.db | tail -50

    如果对更改日志进行加密,您只看到加密的数据。

  5. 启动该实例。

    # 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

流程

  1. 创建 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
  2. 添加一个访问控制指令(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";)
  3. 创建用户:

    1. 创建用户帐户:

      # 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"
    2. 在用户帐户上设置密码:

      # 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"
  4. 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 组,并启用此组的成员来创建导出任务。

流程

  1. 创建 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
  2. 添加访问控制指令(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";)
  3. 创建用户:

    1. 创建用户帐户:

      # 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"
    2. 在用户帐户上设置密码:

      # 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"
  4. 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=comou=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 可设置允许或拒绝权限,如 readwrite
  • 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 有用,例如 adddelete

要在使用 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 组的成员授予权限,修改该部门属性设置为 EngineeringSales 的所有条目:

# 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。这只适用于 ADDDEL 操作。您无法根据特定值限制搜索权利。

要创建基于值的 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 过滤器必须匹配。如果条目中已存在属性的不同值被替换,则 adddel 过滤器都必须匹配。

例 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_fromtarget_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_fromtarget_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 用户:

  • 可以创建必须包含 topgroupOfUniqueNames 对象类的对象。
  • 无法添加额外的对象类,如 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. 针对与过滤器匹配的条目的某些属性

如果您在两个目标规则中组合了 targetattrtargetfilter 关键字,您可以针对与过滤器匹配的条目的特定属性。

例 12.9. 针对与过滤器匹配的条目的某些属性

要允许 cn=Engineering Admins,dc=example,dc=com 组的成员修改 jpegPhotomanager 属性,并将 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. 以单一目录条目为目标

要针对单个目录条目为目标,请组合 targetattrtargetfilter 关键字。

例 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 中的搜索操作。

write

设定用户是否可以通过添加、修改或删除属性来修改条目。此权限适用于 LDAP 中的 修改和 modrdn 操作。

add

设定用户是否可以创建条目。这个权限只适用于 LDAP 中的 add 操作。

delete

设定用户是否能够删除条目。此权限仅适用于 LDAP 中的 删除操作。

search

设定用户是否可以搜索目录数据。要查看作为搜索结果的一部分返回的数据,分配 searchread 权限。此权限只适用于 LDAP 中的搜索操作。

compare

设置用户是否可以比较他们提供的数据与 目录中存储的数据。通过 比较 权限,目录会返回一个成功或失败信息以响应请求,但用户无法看到条目或属性值。此权限仅适用于 LDAP 中的比较操作。

selfwrite

设置用户是否可以向组中添加或删除自己的可分辨名称(DN)。右键仅用于组管理。

proxy

设置指定的 DN 是否可以通过另一个条目的访问权限来访问目标。右侧的 代理 在 ACL 的范围内授权,作为授权权限的用户或组可以作为任何 Directory Server 用户运行命令。您无法限制特定用户的 代理 权限。为安全起见,请设置在目录最多目标级别使用代理的 ACI。

all

设置所有权限,但 代理 除外。

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 设置为:

注意

不要在 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. 授予匿名访问

启用没有身份验证的任何人读取和搜索 sngivenName电话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,如果经过身份验证的用户是这些组的成员,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。您可以在目标条目的下面包括五个级别(01234)。零( 0)表示目标条目。
  • attribute_name :由 userattrgroupattr 关键字目标的属性。
  • 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; (少于)
  • &gt; (而不是greater)
  • & lt;.> (不代表或等于)
  • &gt;=(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; (少于)
  • &gt; (而不是greater)
  • & lt;.> (不代表或等于)
  • &gt;=(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,comcn=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_2bind_rule_3 秒:

    (bind_rule_1) OR ((bind_rule_2) AND (bind_rule_3))
  • 不允许在 ANDOR 运算符前。

    在以下示例中,首先评估 bind_rule_2

    (bind_rule_1) AND NOT (bind_rule_2)

    ANDOR 运算符没有优先级顺序。

第 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 模式。

流程

  1. 为网络安全服务(NSS)数据库启用 FIPS 模式:

    # modutil -dbdir /etc/dirsrv/slapd-instance_name/ -fips true
  2. 重启实例:

    # 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 :存储 reset passwordRetryCount 属性的时间。用户第一次绑定后会存在此属性。
  • 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

验证

  1. 显示 passwordmaxfailure 设置的值:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy get passwordmaxfailure
    passwordmaxfailure: 2
  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 服务器在到达或超过配置的最大尝试时锁定帐户的行为取决于旧的密码策略设置。

流程

  1. 可选:识别是否启用或禁用旧密码策略:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com config get passwordLegacyPolicy
    passwordLegacyPolicy: on
  2. 启用 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 控制台中登录到实例。

流程

  1. 可选:识别是否启用或禁用旧密码策略:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com config get passwordLegacyPolicy
    passwordLegacyPolicy: on

    此设置在 web 控制台中不可用。

  2. 导航到 DatabasePassword PoliciesGlobal PolicyAccount Lockout
  3. 选择 "启用帐户锁定 "。
  4. 配置锁定设置:

    • 锁出帐户的失败登录 数:设置在目录服务器锁定帐户前允许的最大绑定尝试次数。
    • Time Until Failure Count Resets: 在 Directory Server 重置用户条目中的 passwordRetryCount 属性前的时间(以秒为单位)。
    • 时间未锁定 :设置帐户锁定的时间(以秒为单位)。如果您禁用 Do Not Lockout account Forever,则忽略此参数
    • 不锁定帐户 :启用或禁用锁定的帐户在一定时间后是否应该被解锁,直到管理员手动解锁它们为止。
  5. 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 控制台中登录到实例。

流程

  1. 导航到 ServerServer SettingsAdvanced Settings
  2. Allow Anonymous Access 参数设置为 off
  3. 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、RetryCountResetTimeaccountUnlockTime 属性,将 Directory Server 配置为复制这些属性,以便它们的值在所有服务器中相同。

对复制拓扑中的所有供应商执行此步骤。

前提条件

  • 您已经配置了帐户锁定策略或密码策略,用于更新一个或多个上述属性。
  • 您可以在复制环境中使用 Directory 服务器。

流程

  1. 启用密码策略属性复制:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdisglobal="on"
  2. 如果使用部分复制,显示复制中排除的属性列表:

    # 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

    在本例中,帐户UnlockTimepasswordRetryCountretryCountResetTime lockout 策略属性不包括在复制中,以及其他属性。

  3. 如果上一命令的输出列出了任何帐户锁定属性,请更新部分复制设置,使其只包含 lockout 策略属性以外的属性:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt set --suffix "dc=example,dc=com" --frac-list "example1 example2" example-agreement

验证

  1. 尝试以具有无效密码的用户身份执行搜索:

    # 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)
  2. 显示用户的 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
  3. 在复制拓扑的不同服务器中运行上一命令。如果 passwordRetryCount 属性的值相同,Directory 服务器会复制 属性。

第 17 章 配置基于时间的帐户锁定策略

您可以使用帐户策略插件配置不同的基于时间的锁定策略,例如:

17.1. 在最后成功登录后自动禁用帐户一定时间

按照此流程,配置在 dc=example,dc=com 条目下激活的基于时间的锁定策略,该策略没有登录 21 天。

这个帐户不活动功能可确保员工离开公司,并且管理员忘记删除帐户,该目录服务器在一定时间后停用帐户。

流程

  1. 启用帐户策略插件:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
  2. 配置插件配置条目:

    # 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 属性存储不活跃的时间。
  3. 重启实例:

    # dsctl instance_name restart
  4. 创建 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 Policy

    accountInactivityLimit 属性中的值在最后一次登录后将 Directory 服务器配置为激活帐户 1814400 秒(21 天)。

  5. 创建 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

    此模板条目引用帐户处于激活策略。

  6. 创建 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

验证

  1. 将用户的 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
  2. 尝试以这个用户身份连接到该目录:

    # 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 的帐户在创建后锁定一定时间。

流程

  1. 启用帐户策略插件:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
  2. 配置插件配置条目:

    # 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 属性存储最大期限。
  3. 重启实例:

    # dsctl instance_name restart
  4. 创建帐户过期策略条目:

    # 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 Policy

    accountInactivityLimit 属性中的值配置该帐户在创建后 5184000 秒(60 天)过期。

  5. 创建 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

    此模板条目引用帐户到期策略。

  6. 创建 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 属性。

流程

  1. 启用密码过期功能:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace passwordExp=on
  2. 启用帐户策略插件:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
  3. 配置插件配置条目:

    # 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 属性会在帐户上次密码更改后被激活时保存时间。
  4. 重启实例:

    # dsctl instance_name restart
  5. 创建 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 Policy

    accountInactivityLimit 属性中的值在更改密码后将 Directory 服务器配置为激活帐户 2419200 秒(28 天)。

  6. 创建 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

    此模板条目引用帐户处于激活策略。

  7. 创建 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

验证

  1. 将用户的 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
  2. 尝试以这个用户身份连接到该目录:

    # 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 属性,以及帐户是否微调,然后检查备用状态属性。

这与密码策略的密码过期不同,因为如果密码过期时间超过不活跃的限制,则帐户策略插件会完全禁用帐户。使用密码策略过期时,用户仍然可以登录并更改其密码。帐户策略插件完全阻止用户进行任何操作,管理员必须重置帐户。

流程

  1. 创建插件配置条目并启用设置:

    # 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
  2. 重启服务器以载入新的插件配置:

    # 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 属性中记录用户的最后登录时间。

流程

  1. 启用帐户策略插件:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
  2. 创建插件配置条目来记录登录时间:

    # 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 属性中。
  3. 重启实例:

    # dsctl instance_name restart

验证

  1. 以某一用户身份登录 Directory 服务器。例如,运行搜索:

    # ldapsearch -H ldap://server.example.com -x -D "uid=example,ou=People,dc=example,dc=com" -W -b "dc=example,dc=com"
  2. 显示您在上一步中使用的用户的 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 帐户的权限,请启用并配置插件。

流程

  1. 启用 RootDN Access Control 插件:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin root-dn enable
  2. 设置绑定规则。例如,要允许 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
  3. 重启实例:

    # 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 控制台中登录到实例。

流程

  1. 导航到 PluginsRootDN Access Control
  2. 启用插件。
  3. 根据您的要求填写字段。

    RootDN 访问控制
  4. Save
  5. 点击右上角的 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 章 管理属性加密

目录服务器提供了许多保护访问目录中敏感数据的机制。但是,默认情况下,服务器会在数据库中以未加密的方式存储数据。对于高度敏感信息,攻击者可以访问数据库的潜在风险可能会带来巨大风险。

借助属性加密功能,管理员可以利用敏感数据来存储特定的属性,如政府识别号在数据库中加密。当为后缀启用时,这些属性的每个实例(甚至索引数据)都会为存储在数据库中的每个条目进行加密。请注意,您可以为后缀启用属性加密。要为整个服务器启用此功能,您必须在服务器上为每个后缀启用属性加密。属性加密与 eqpres 索引完全兼容。

重要

您在条目中使用的任何属性均可有效地加密名称(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 加密。

流程

  1. 导出 userRoot 数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot

    服务器将导出存储在 /var/lib/dirsrv/slapd-instance_name/ldif/ 目录中。e 选项 解密导出过程中已加密的属性。

  2. telephoneNumber 属性启用 AES 加密:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend attr-encrypt --add-attr telephoneNumber dc=example,dc=com
  3. 停止实例:

    # dsctl instance_name stop
  4. 导入 LDIF 文件:

    # dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif

    --encrypted 参数可让脚本加密导入期间为加密配置的属性。

  5. 启动实例:

    # dsctl instance_name start

21.3. 使用 Web 控制台启用属性加密

此流程演示了如何使用 Web 控制台为 userRoot 数据库中 phone Number 属性启用属性加密。执行流程后,服务器会存储此属性 AES- 加密的现有和新值。

请注意,Web 控制台中的导出和导入功能不支持加密的属性。因此,您必须在命令行中执行这些步骤。

前提条件

  • 您已在 Directory 服务器中启用了 TLS 加密。
  • 在 web 控制台中登录到实例。

流程

  1. 导出 userRoot 数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot

    服务器将导出存储在 /var/lib/dirsrv/slapd-instance_name/ldif/ 目录中。e 选项 解密导出过程中已加密的属性。

  2. 在 web 控制台中,进入到 DatabaseSuffixessuffix_entryEncrypted Attributes
  3. 输入要加密的属性,然后单击 Add Attribute
  4. Actions 菜单中,选择 Stop Instance
  5. 在命令行中导入 LDIF 文件:

    # dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif

    --encrypted 参数可让脚本加密导入期间为加密配置的属性。

  6. 在 Web 控制台中,打开 Actions 菜单,然后选择 Start Instance

21.4. 启用属性加密后的常规注意事项

为数据库中的数据启用加密后请考虑以下几点:

  • 在服务器的数据库页面池支持文件中可以保留未加密的数据。删除此数据:

    1. 停止实例:

      # dsctl instance_name stop
    2. 删除 /var/lib/dirsrv/slapd-instance_name/db/guardian 文件:

      # **rm /var/lib/dirsrv/slapd-instance_name/db/guardian``
    3. 启动实例:

      # dsctl instance_name start
  • 启用加密并成功导入数据后,使用未加密的数据删除 LDIF 文件。
  • 目录服务器不加密复制日志文件。为保护这些数据,将复制日志存储在加密的磁盘上。
  • 服务器内存(RAM)中的数据是未加密的,可以临时存储在交换分区中。为保护这些数据,请配置加密的交换空间。
重要

即使您删除了包含未加密数据的文件,在某些情况下也可以恢复这些数据。

21.5. 更新用于属性加密的 TLS 证书

属性加密基于服务器的 TLS 证书。按照以下步骤,在续订或替换 TLS 证书后防止属性加密失败。

前提条件

  • 您已经配置的属性加密。
  • TLS 证书将在不久的将来过期。

流程

  1. 导出 userRoot 数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot

    服务器将导出存储在 /var/lib/dirsrv/slapd-instance_name/ldif/ 目录中。e 选项 解密导出过程中已加密的属性。

  2. 创建私钥和证书签名请求(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 文件中。

  3. 将 CSR 提交到证书颁发机构(CA)以获取签发的证书。详情请查看您的 CA 文档。
  4. 将 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

  5. 将 CA 证书导入到 NSS 数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate add --file /root/ca.crt --name "Example CA"
  6. 设置 CA 证书的信任标记:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "CT,,"

    这会将 Directory 服务器配置为信任 TLS 加密和基于证书的身份验证的 CA。

  7. 停止实例:

    # dsctl instance_name stop
  8. 编辑 /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 服务器将无法启动。

  9. 导入 LDIF 文件:

    # dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif

    --encrypted 参数可让脚本加密导入期间为加密配置的属性。

  10. 启动实例:

    # dsctl instance_name start

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.