属性加密可保护存储在目录中的敏感数据。属性加密允许您指定以加密格式存储条目的某些属性。这可防止读取存储在数据库文件、备份文件和导出的 LDIF 文件中的数据。
使用此功能,将属性值存储到目录服务器数据库之前会对其进行加密,并在返回给客户端之前解密回原始值。您必须使用访问控制来阻止没有权限的客户端访问此类属性,并在客户端和目录服务器之间传输属性值时使用 SSL 对属性值进行加密。有关一般情况下的数据安全性和特殊情况下的属性加密的结构性概述,请参见《Sun Java System Directory Server Enterprise Edition 6.3 Reference》。
只有在服务器上配置和启用 SSL 之后,属性加密才处于活动状态。但在默认情况下,任何属性都未加密。属性加密是在后缀级别上配置的,这意味着会在后缀包含该属性的每个条目中加密该属性。如果您要在整个目录中加密属性,则必须在每个后缀中为该属性启用加密。
属性加密将影响与后缀关联的所有数据和索引文件。如果修改现有后缀的加密配置,则必须先导出该后缀的内容,再更改配置,然后重新导入内容。DSCC 可以帮助您执行这些步骤。有关使用 DSCC 的详细信息,请参见目录服务控制中心界面。
为了更加安全,在为任何属性启用加密时,都应手动删除可能仍包含未加密值的数据库缓存文件和数据库日志文件。配置属性加密中介绍了删除这些文件的过程。
在新后缀中装入或创建数据之前,应该启用所有加密属性。
如果选择加密被某些条目用作命名属性的属性,则 DN 中显示的值将不会被加密。存储在条目中的值将被加密。
即使可以在配置加密时选择 userPassword 属性,也不会实际提高安全性,除非需要以明文形式存储密码。DIGEST-MD5 SASL 验证就是这种情况。如果密码已在密码策略中定义了加密机制,则进一步加密只能使安全性略为提高,且反而会影响每个绑定操作的性能。
在存储时,加密的属性前会加上一个表示所用加密算法的密码标记。使用 DES 加密算法的加密属性将显示为如下形式:
{CKM_DES_CBC}3hakc&jla+=snda% |
当您考虑到数据加密而联机导入数据时,就已经提供了用于通过服务器验证的密钥数据库密码,系统不会再出现此提示。如果要脱机导入数据,目录服务器会先提示您输入密码,然后才允许您加密要导入的数据。解密数据(此操作需要更高的安全性)时,无论联机还是脱机执行导出操作,目录服务器都会自动提示您输入密钥数据库密码。这可进一步提高安全性。
只要证书或私钥不发生更改,服务器将继续生成相同的密钥。因此,如果两个服务器实例使用相同的证书,则可以将数据从一个服务器实例传输到另一个服务器实例(先导出然后再导入)。
虽然属性加密提供了增强的数据安全性,但也会影响系统性能。请仔细考虑哪些属性需要加密,并且只加密您认为特别敏感的那些属性。
由于可以通过索引文件直接访问敏感数据,因此必须加密与加密属性相对应的索引键,以确保属性受到完整保护。如果索引已对目录服务器性能造成影响(尚未包括加密索引键所造成的影响),请在第一次将数据导入或添加到数据库之前配置属性加密。此过程可确保对加密属性的索引就像从头开始编制一样。
执行属性加密功能时请考虑以下事项:
一般而言,在修改属性加密配置时,最佳做法是先导出数据,再更改配置,然后导入新配置的数据。
这可确保整体考虑所有配置更改,而不会丢失任何功能。否则,某些功能可能会丢失,从而破坏数据的安全性。
在现有数据库上修改属性加密配置可能会对系统性能造成严重影响。
例如,假定您有一个包含现有数据的数据库实例。该数据库包含以前存储的具有 mySensitiveAttribute 属性的条目。此属性的值以明文形式存储在数据库和索引文件中。如果您以后决定加密 mySensitiveAttribute 属性,则必须导出该数据库实例中的所有数据,然后将其重新导入数据库,以确保服务器使用属性加密配置更新数据库和索引文件。如果一开始就对属性进行加密,则可避免由此造成的性能影响。
以解密格式导出数据时,如果使用错误的密码,则导出将被拒绝。
作为一种安全措施,服务器会在用户以解密格式导出数据时提示用户输入密码。如果用户提供了错误的密码,服务器将拒绝解密导出操作。可以直接输入密码,也可以提供密码所在文件的路径。请注意,此文件与 SSL 密码文件具有相同的语法。请参见配置证书数据库密码。
要配合使用 dsconf 命令及其 -–decrypt-attr 选项,必须将 set password prompt 设置为 on,并且还必须按配置证书数据库密码所述选择了证书数据库密码。
可以对加密算法进行更改,但如果更改过程有误,则结果可能会丢失索引功能。
要更改用于加密数据的算法,请导出数据,再修改属性加密配置,然后导入数据。如果不按此过程操作,则根据初始加密算法创建的索引将不再有效。
由于加密的属性前添加了表示所用加密算法的密码标记,内部服务器操作将负责导入数据。因此,目录服务器允许您在更改算法前以加密格式导出数据。
更改服务器的 SSL 证书将导致您无法解密已加密的数据。
属性加密功能会使用服务器的 SSL 证书生成自己的密钥,以用于执行加密和解密操作。因此,解密已加密的数据时需要使用 SSL 证书。如果更改证书之前未解密数据,将无法解密数据。要避免出现这种情况,请以解密格式导出数据,再更改证书,然后重新导入数据。
要以加密格式传输数据,也就是说,要将数据从一个服务器实例导出,然后再导入另一个服务器实例,则这两个服务器实例必须使用相同的证书。
有关信息,请参见《Sun Java System Directory Server Enterprise Edition 6.3 管理指南》中的“加密属性值”。
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
如果要配置属性加密的后缀中包含任何条目,都必须先将该后缀的内容导出到 LDIF 文件。
如果后缀包含加密的属性,并且您计划使用导出的 LDIF 文件重新初始化该后缀,则可以使这些属性在导出的 LDIF 文件中保持加密状态。
要启用属性加密,请使用以下命令:
$ dsconf create-encrypted-attr -h host -p port suffix-DN attr-name cipher-name |
其中 cipher-name 可为以下任一选项:
des - DES 块密码
des3 - 3DES 块密码
rc2 - RC2 块密码
rc4 - RC4 流密码
例如:
$ dsconf create-encrypted-attr -h host1 -p 1389 dc=example,dc=com uid rc4 |
要将加密的属性还原为原始状态,请使用以下命令:
$ dsconf delete-encrypted-attr -h host -p port suffix-DN attr-name |
如果更改了配置以加密一个或多个属性,并且在执行导入操作前这些属性已具有值,请清除数据库缓存并删除日志。
在数据库缓存和数据库日志中不会显示任何未加密的值。
如果删除这些文件,将丢失某些跟踪信息。此外,在删除这些文件之后,服务器将处于恢复模式,可能需要很长时间才能重新启动。
清除数据库缓存和删除日志:
停止目录服务器,如启动、停止和重新启动目录服务器实例所述。
以超级用户或具有管理员权限的用户身份从文件系统中删除数据库缓存文件。
# rm instance-path/db/__db.* |
从文件系统中删除数据库日志文件。
# rm instance-path/db/log.0000000001 |
重新启动目录服务器。
服务器将自动创建新的数据库缓存文件。在重新填充缓存之前,此后缀中的操作性能可能会略受影响。
使用 LDIF 文件初始化后缀,如初始化后缀所述。
装入文件并创建相应索引之后,指定属性的所有值都将被加密。