4.7. 管理属性加密
目录服务器提供许多机制来保护对目录中敏感数据的访问。但是,默认情况下,服务器会将未加密数据存储在数据库中。对于高度敏感信息,攻击者可能访问数据库的潜在风险可能是一个重大风险。
属性加密功能使管理员能够存储具有敏感数据的特定属性,如政府身份识别号,在数据库中加密。为后缀启用后,这些属性的每个实例(即使索引数据)对于数据库中存储此属性的每个条目都加密。请注意,您可以为后缀启用属性加密。要为整个服务器启用此功能,您必须在服务器上为每个后缀启用属性加密。属性加密与 eq
和 预
索引完全兼容。
您在条目中使用的任何属性都无法有效地加密。例如,如果您已配置为加密 uid
属性,则该值在条目中加密,但没有在 DN 中加密:
dn: uid=demo_user,ou=People,dc=example,dc=com ... uid::Sf04P9nJWGU1qiW9JJCGRg==
dn: uid=demo_user,ou=People,dc=example,dc=com
...
uid::Sf04P9nJWGU1qiW9JJCGRg==
4.7.1. 密钥目录服务器用于属性加密 复制链接链接已复制到粘贴板!
要使用属性加密,您必须使用 TLS 配置加密连接。目录服务器使用服务器的 TLS 加密密钥和相同的 PIN 输入法进行属性加密。
服务器使用随机生成的对称加密密钥来加密和解密属性数据。服务器使用服务器 TLS 证书中的公钥嵌套这些密钥。因此,属性加密的有效强度不能高于服务器的 TLS 密钥的强度。
在无法访问服务器的私钥的情况下,无法从嵌套的副本恢复对称密钥。因此,定期备份服务器的证书数据库。如果您丢失了密钥,您将无法解密和加密存储在数据库中的数据。
4.7.2. 使用命令行启用属性加密 复制链接链接已复制到粘贴板!
此流程演示了如何使用命令行为 userRoot
数据库中的 telephoneNumber
属性启用属性加密。执行此流程后,服务器会存储此属性 AES-encrypted 的现有和新值。
前提条件
- 您已在目录服务器中启用了 TLS 加密。
流程
导出
userRoot
数据库:dsconf <instance_name> backend export -E userRoot
# dsconf <instance_name> backend export -E userRoot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 服务器将导出存储在
/var/lib/dirsrv/slapd-instance_name/ldif/
目录中的 LDIF 文件中。-E
选项解密在导出期间已加密的属性。为
telephoneNumber
属性启用 AES 加密:dsconf <instance_name> backend attr-encrypt --add-attr telephoneNumber dc=example,dc=com
# dsconf <instance_name> backend attr-encrypt --add-attr telephoneNumber dc=example,dc=com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 停止实例:
dsctl <instance_name> stop
# dsctl <instance_name> stop
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 导入 LDIF 文件:
dsctl <instance_name> ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
# dsctl <instance_name> ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 加密的参数
可让脚本加密在导入过程中为加密配置的属性。启动实例:
dsctl <instance_name> start
# dsctl <instance_name> start
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.7.3. 使用 Web 控制台启用属性加密 复制链接链接已复制到粘贴板!
此流程演示了如何使用 Web 控制台为 userRoot
数据库中的 telephoneNumber
属性启用属性加密。执行此流程后,服务器会存储此属性 AES-encrypted 的现有和新值。
请注意,Web 控制台中的导出和导入功能不支持加密属性。因此,您必须在命令行中执行这些步骤。
前提条件
- 您已在目录服务器中启用了 TLS 加密。
- 在 web 控制台中登录到实例。
流程
导出
userRoot
数据库:dsconf <instance_name> backend export -E userRoot
# dsconf <instance_name> backend export -E userRoot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 服务器将导出存储在
/var/lib/dirsrv/slapd-instance_name/ldif/
目录中的 LDIF 文件中。-E
选项解密在导出期间已加密的属性。-
在 web 控制台中,进入到
。 - 输入要加密的属性,然后单击 。
- 在 菜单中,选择 Stop Instance。
在命令行中导入 LDIF 文件:
dsctl <instance_name> ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
# dsctl <instance_name> ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 加密的参数
可让脚本加密在导入过程中为加密配置的属性。-
在 Web 控制台中,打开 菜单,然后选择
Start Instance
。
4.7.4. 启用属性加密后的一般注意事项 复制链接链接已复制到粘贴板!
在为数据库中已存在的数据启用加密后,请考虑以下点:
未加密的数据可以保留在服务器的数据库页面池后备文件中。删除此数据:
停止实例:
dsctl <instance_name> stop
# dsctl <instance_name> stop
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除
/var/lib/dirsrv/slapd- <instance_name> /db/guardian
文件:rm /var/lib/dirsrv/slapd-<instance_name>/db/guardian
# rm /var/lib/dirsrv/slapd-<instance_name>/db/guardian
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动实例:
dsctl <instance_name> start
# dsctl <instance_name> start
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- 启用加密并成功导入数据后,使用未加密的数据删除 LDIF 文件。
- 目录服务器不加密复制日志文件。要保护此数据,请将复制日志存储在加密磁盘上。
- 服务器内存(RAM)中的数据是未加密的,并可临时存储在交换分区中。要保护这些数据,请配置加密的交换空间。
即使您删除包含未加密的数据的文件,在某些情况下也可以恢复此数据。
4.7.5. 更新用于属性加密的 TLS 证书 复制链接链接已复制到粘贴板!
属性加密基于服务器的 TLS 证书。按照以下步骤防止在续订或替换 TLS 证书后属性加密失败。
前提条件
- 您配置的属性加密。
- TLS 证书将在不久的将来过期。
流程
导出
userRoot
数据库:dsconf <instance_name> backend export -E userRoot
# dsconf <instance_name> backend export -E userRoot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 服务器将导出存储在
/var/lib/dirsrv/slapd-instance_name/ldif/
目录中的 LDIF 文件中。-E
选项解密在导出期间已加密的属性。创建私钥和证书签名请求(CSR)。如果要使用外部实用程序创建它们,请跳过这一步。
如果您的主机只能通过一个名称访问,请输入:
dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization"
# dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的主机可以通过多个名称访问:
dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization" server.example.com server.example.net
# dsctl <instance_name> tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization" server.example.com server.example.net
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您将主机名指定为最后一个参数,命令将使用 DNS:server.example.
com、DNS:server.example.net
条目将 Subject Alternative Name (SAN)扩展添加到 CSR。
在
-s subject
参数中指定的字符串必须是根据 RFC 1485 的有效主题名称。主题中的CN
字段是必需的,您必须将其设置为服务器的完全限定域名(FQDN)。命令会将 CSR 存储在/etc/dirsrv/slapd- <instance_name>/Server-Cert.csr
文件中。- 将 CSR 提交到证书颁发机构(CA)以获取签发的证书。详情请查看您的 CA 文档。
将 CA 发布的服务器证书导入到 NSS 数据库:
如果您使用
dsctl tls generate-server-cert-csr
命令创建私钥,请输入:dsconf <instance_name> security certificate add --file /root/instance_name.crt --name "server-cert" --primary-cert
# dsconf <instance_name> security certificate add --file /root/instance_name.crt --name "server-cert" --primary-cert
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 记住您在 -name
_certificate_nickname
参数中设置的证书的名称。在后续步骤中,您需要它。如果您使用外部实用程序创建私钥,请导入服务器证书和私钥:
dsctl <instance_name> tls import-server-key-cert /root/server.crt /root/server.key
# dsctl <instance_name> tls import-server-key-cert /root/server.crt /root/server.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,命令要求您首先指定服务器证书的路径,然后指定私钥的路径。这个方法始终将证书的 nickname 设置为
Server-Cert
。
将 CA 证书导入到 NSS 数据库:
dsconf <instance_name> security ca-certificate add --file /root/ca.crt --name "Example CA"
# dsconf <instance_name> security ca-certificate add --file /root/ca.crt --name "Example CA"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置 CA 证书的信任标记:
dsconf <instance_name> security ca-certificate set-trust-flags "Example CA" --flags "CT,,"
# dsconf <instance_name> security ca-certificate set-trust-flags "Example CA" --flags "CT,,"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这会将目录服务器配置为信任用于 TLS 加密和基于证书的身份验证的 CA。
停止实例:
dsctl <instance_name> stop
# dsctl <instance_name> stop
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/dirsrv/slapd- <instance_name> /dse.ldif
文件,并删除以下条目,包括其属性:-
cn=AES,cn=encrypted attribute keys,cn=database_name,cn=ldbm database,cn=plugins,cn=config
-
cn=3DES,cn=encrypted attribute keys,cn=database_name,cn=ldbm database,cn=plugins,cn=config
重要删除所有数据库的条目。如果包含
nsSymmetricKey
属性的条目保留在 '/etc/dirsrv/slapd- <instance_name> /dse.ldif 文件中,则目录服务器将无法启动。-
导入 LDIF 文件:
dsctl <instance_name> ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
# dsctl <instance_name> ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 加密的参数
可让脚本加密在导入过程中为加密配置的属性。启动实例:
dsctl <instance_name> start
# dsctl <instance_name> start
Copy to Clipboard Copied! Toggle word wrap Toggle overflow