第 4 章 目录服务器条目
本章讨论如何管理目录中的数据条目。此外,还介绍如何设置引用以及如何加密属性值。
除非定义了相应的访问控制指令 (Access Control Instruction, ACI),否则将无法修改目录。有关详细信息,请参见第6章,目录服务器访问控制。
本章包含以下主题:
管理条目
管理条目的最佳方式取决于环境:
如果主要将 DSCC 用于管理,并且只需搜索或修改少量条目,请使用 DSCC。有关 DSCC 的详细信息,请参见目录服务控制中心界面。
如果不在目录服务器上执行任何管理任务,并且只需搜索或修改少量条目,请使用目录编辑器。有关目录编辑器的信息,请参见《Sun Java System Directory Editor 1 Q1 Installation and Configuration Guide》。
如果要搜索或修改大量条目,请使用命令行实用程序 ldapmodify 和 ldapdelete。
使用 DSCC 管理条目
DSCC 允许您查看条目的所有可读属性以及编辑其可写属性。此外,您还可以添加和删除属性、设置多值属性,以及管理条目的对象类。有关如何使用 DSCC 管理条目的详细信息,请参见 DSCC 联机帮助。有关 DSCC 的一般性信息,请参见目录服务控制中心界面。
使用目录编辑器管理条目
目录编辑器是一种易于使用的目录编辑工具,允许管理员和最终用户搜索、创建和编辑数据。此数据采用用户、组和容器的形式。
使用 ldapmodify 和 ldapdelete 管理条目
ldapmodify 和 ldapdelete 命令行实用程序提供了用于添加、编辑和删除目录内容的完整功能。可以使用这些实用程序管理服务器的配置条目和用户条目中的数据。还可以使用这些实用程序编写脚本,以便对一个或多个目录执行批量管理。
本书中的过程几乎都使用了 ldapmodify 和 ldapdelete 命令。以下部分介绍执行这些过程所需的基本操作。有关 ldapmodify 和 ldapdelete 命令的详细信息,请参见《Sun Java System Directory Server Enterprise Edition 6.2 Reference》。
命令行实用程序的输入始终采用 LDIF 格式,可以直接从命令行或通过输入文件提供此输入。以下部分提供了与 LDIF 输入有关的信息,后续部分将介绍适用于每种修改类型的 LDIF 输入。
以下部分介绍这些基本操作:
使用 ldapmodify 添加条目
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
可以使用 ldapmodify 的 -a 选项向目录中添加一个或多个条目。以下示例将创建包含用户的结构条目,然后再创建用户条目:
$ ldapmodify -a -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: ou=People,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
ou: People
description: Container for user entries
dn: uid=bjensen,ou=People,dc=example,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetorgPerson
uid: bjensen
givenName: Barbara
sn: Jensen
cn: Babs Jensen
telephoneNumber: (408) 555-3922
facsimileTelephoneNumber: (408) 555-4000
mail: bjensen@
userPassword: secret
-D 和 -w 选项分别提供用户的绑定 DN 和密码(该用户具有创建这些条目的权限)。-a 选项表示将添加 LDIF 中的所有条目。然后将按 DN 和属性值列出每个条目,各条目之间以空行分隔。ldapmodify 实用程序将在输入每个条目后创建该条目,并会报告任何错误。
按照约定,条目的 LDIF 将列出以下属性:
条目 DN。
对象类列表。
一个或多个命名属性。此属性是 DN 中使用的属性,它不一定属于必需属性。
所有对象类的必需属性列表。
要包含的所有允许的属性。
键入 userPassword 属性值时,请提供明文形式的密码。服务器将对此值进行加密,并且只存储加密的值。请务必限制读取权限以保护 LDIF 文件中出现的明文密码。
还可以使用另一种形式的 LDIF,它不要求在命令行中使用 -a 选项。此形式的优点是可以合并条目添加语句和条目修改语句,如以下示例所示。
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: ou=People,dc=example,dc=com
changetype: add
objectclass: top
objectclass: organizationalUnit
ou: People
description: Container for user entries
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: add
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetorgPerson
uid: bjensen
givenName: Barbara
sn: Jensen
cn: Barbara Jensen
telephoneNumber: (408) 555-3922
facsimileTelephoneNumber: (408) 555-4000
mail: bjensen@
userPassword: secret
changetype: add 关键字表示应该使用所有后续属性创建具有给定 DN 的条目。所有其他选项和 LDIF 约定都与本部分前面的叙述相同。
在这两个示例中,都可以使用 -f filename 选项从文件(而非终端输入)中读取 LDIF。LDIF 文件所包含的格式必须与终端输入使用的格式相同,这取决于您是否使用 -a 选项。
使用 ldapmodify 修改条目
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
可以使用 changetype: modify 关键字在现有条目中添加、替换或删除属性及属性值。指定 changetype: modify 时,还必须提供一个或多个更改操作,以表明将如何修改条目。以下示例中显示了三种可能的 LDIF 更改操作:
dn: entryDN
changetype: modify
add: attribute
attribute: value...
-
replace: attribute
attribute: newValue...
-
delete: attribute
[attribute: value]
...
可以使用独占一行的连字符 (-) 分隔相同条目上的操作,并可使用空行来分隔不同条目上的操作组。还可以为每个操作提供多个 attribute: value 对。
添加属性值
无法使用 DSCC 执行此任务。请使用命令行,如以下过程所述。
以下示例显示如何使用相同的 add LDIF 语法向现有多值属性和尚未存在的属性中添加值:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
add: cn
cn: Babs Jensen
-
add: mobile
mobile: (408) 555-7844
如果存在以下任一情况,则此操作可能会失败,并且服务器将返回错误:
属性中已存在给定的值。
值与为属性定义的语法不符。
条目的对象类不需要或不允许使用该属性类型。
属性类型不是多值类型,并且属性中已存在某个值。
使用二进制属性子类型
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
attribute;binary 子类型表示属性值必须作为二进制数据通过 LDAP 进行传输,而不考虑属性值的实际语法。此子类型适用于没有 LDAP 字符串表示的复杂语法,如 userCertificate。不应将二进制子类型用于其他目的。
在 ldapmodify 命令中使用时,可以将相应的子类型添加到任何 LDIF 语句的属性名称中。
要输入二进制值,可以在 LDIF 文本中直接键入或从其他文件读取。以下示例显示了用于从文件读取二进制值的 LDIF 语法:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
version: 1
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
add: userCertificate;binary
userCertificate;binary:< file:///local/cert-file
要使用 :< 语法指定文件名,必须将 version: 1 行作为 LDIF 语句的开头。当 ldapmodify 处理此语句时,它会将属性设置为从给定文件的全部内容中读取的值。
添加具有语言子类型的属性
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
属性的语言和发音子类型可指定本地化的值。为属性指定语言子类型时,该子类型将添加到属性名称中,如下所示:
attribute;lang-CC
其中 attribute 是现有属性类型,而 cc 是用于指定语言的双字母国家/地区代码。您还可以将发音子类型添加到语言子类型中,以便为本地化的值指定一个语音值。在本案例中,属性名称如下所示:
attribute;lang-CC;phonetic
要对具有子类型的属性执行操作,必须明确匹配其子类型。例如,如果要修改具有 lang-fr 语言子类型的属性值,则必须在修改操作中包含 lang-fr,如下所示:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
add: homePostalAddress;lang-fr
homePostalAddress;lang-fr: 34, rue de la Paix注 –
如果属性值包含非 ASCII 字符,则这些字符必须为 UTF-8 编码的字符。
修改属性值
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
以下示例说明如何通过使用 LDIF 中的 replace 语法更改属性值:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
replace: sn
sn: Morris
-
replace: cn
cn: Barbara Morris
cn: Babs Morris
将删除指定属性的所有当前值,并添加所有给定值。
更改属性值之后,您可以使用 ldapsearch 命令验证此更改。
属性值中的结尾空格
修改属性值时,请勿不小心在值的末尾包含空格。结尾空格可能会导致值以 base-64 编码格式显示(如 34xy57eg)。
如果属性值的末尾是空格,则此空格将作为属性值的一部分进行编码。在使用 DSCC 或 ldapsearch 命令验证更改时,所显示的值可能是纯文本,也可能是 base-64 编码的文本。这取决于您所使用的目录服务器客户端。
删除属性值
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
以下示例说明如何完整地删除属性,以及如何仅删除多值属性的一个值:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
delete: facsimileTelephoneNumber
-
delete: cn
cn: Babs Morris
使用 delete 语法时如果不指定 attribute: value 对,将删除该属性的所有值。如果指定 attribute: value 对,则只会删除该值。
修改多值属性的一个值
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
要使用 ldapmodify 命令修改多值属性的一个值,必须执行以下示例中显示的两个操作:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: modify
delete: mobile
mobile: (408) 555-7845
-
add: mobile
mobile: (408) 555-5487
使用 ldapdelete 删除条目
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
可以使用 ldapdelete 命令行实用程序从目录中删除条目。此实用程序将绑定到目录服务器,并根据条目 DN 删除一个或多个条目。必须提供具有删除指定条目的权限的绑定 DN。
您无法删除具有子条目的条目。LDAP 协议不允许出现子条目不再具有父条目的情形。例如,您无法删除组织单位条目,除非先删除了属于该组织单位的所有条目。
以下示例仅显示组织单位的一个条目。可以先后删除此条目及其父条目。
$ ldapdelete -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
uid=bjensen,ou=People,dc=example,dc=com
ou=People,dc=example,dc=com
使用 ldapmodify 删除条目
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
使用 ldapmodify 实用程序时,还可以使用 changetype: delete 关键字删除条目。使用 ldapdelete 时的所有限制此时同样适用,如上一部分所述。使用 LDIF 语法删除条目的优点在于,您可以在单个 LDIF 文件中执行混合操作。
以下示例执行与上一示例相同的删除操作:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: delete
dn: ou=People,dc=example,dc=com
changetype: delete
使用 ldapsearch 搜索条目
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
可以使用 ldapsearch 命令行实用程序查找和检索目录条目。请注意,ldapsearch 实用程序不是 Solaris 平台提供的实用程序,而是 Directory Server Resource Kit 的一部分。
使用 ldapmodify 移动或重命名条目
以下过程将使用修改 DN 操作。在开始此操作之前,请确保您已经熟悉使用修改 DN 操作的准则和限制部分的内容。
对于此过程的某些部分,可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。此过程的其他部分只能使用命令行完成。
注 –
在修改作为组 uniquemember 的条目 DN 时,必须启用引用完整性插件。引用完整性可确保在移动条目时调整组成员。有关如何启用和配置引用完整性插件的信息,请参见配置引用完整性插件。
如果要将条目从一个父条目移动到另一个父条目中,请在这些父条目上扩展 ACI 权限。
在要移动的条目的当前父条目上,确保 ACI 允许通过使用语法 allow (export ...) 执行导出操作
在要移动的条目的将来父条目上,确保 ACI 允许通过使用语法 allow (import ...) 执行导入操作
有关使用 ACI 的信息,请参见第6章,目录服务器访问控制。
确保全局启用修改 DN 操作,或至少为将受移动操作影响的后缀启用该操作。
为了确保与以前的目录服务器发行版兼容,默认情况下不启用修改 DN 操作。
如果以前启用了修改 DN 操作,请转至下一步。
要为服务器全局启用修改 DN 操作,请使用以下命令:
$ dsconf set-server-prop -h host -p port moddn-enabled:on
运行 ldapmodify 命令。
此步骤将使用修改 DN 操作。执行以下任一操作:
移动条目。
例如,以下命令可将条目uid=bjensen 从承包商的子树 ou=Contractors,dc=example,dc=com 移动到员工的子树 ou=People,dc=example,dc=com 中:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: uid=bjensen,ou=Contractors,dc=example,dc=com
changetype: modrdn
newrdn: uid=bjensen
deleteoldrdn: 0
newsuperior: ou=People,dc=example,dc=com
重命名条目。
例如,以下命令可将条目 uid=bbjensen 重命名为 uid=bjensen:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: uid=bbjensen,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=bjensen
deleteoldrdn: 1
编写 LDIF 语句时请注意以下属性:
dn - 指定要重命名或移动的条目。
changetype: modrdn - 指定要使用的修改 DN 操作。
newrdn - 提供新的命名属性。
deleteoldrdn - 表示是否应该从条目中删除以前的命名属性(1 表示是,0 表示否)。
请注意,如果命名属性是条目定义中必需的属性,则无法从条目中删除此属性。
newsuperior - 指定条目的新上级属性。
有关 ldapmodify 命令及其选项的信息,请参见 ldapmodify(1) 手册页。
如果在移动或重命名包含大量条目的子树时遇到资源限制错误,请增加数据库可以使用的锁定数。
$ dsconf set-server-prop -h host -p port db-lock-count:value
如果修改此属性,则必须重新启动服务器以使更改生效。
使用修改 DN 操作的准则和限制
使用修改 DN 操作时(如上一部分所述),请遵循以下部分介绍的准则。
使用修改 DN 操作的一般准则
不要使用修改 DN 操作将条目从一个后缀移动到另一个后缀中,也不要使用该操作重命名或移动根后缀。
确保正在运行 Directory Server 5.2 Q1 或更高版本。无法在 Directory Server 5.2 Q1 之前的目录服务器版本上使用修改 DN 操作。
不要在应用程序中使用 entryid 操作属性,因为该属性仅供内部使用。移动条目后,条目的 entryid 属性可能发生更改。
为服务器上的所有后缀全局启用修改 DN 操作,或者为要运行修改 DN 操作的每个后缀单独启用该操作。默认情况下,修改 DN 操作处于禁用状态。
在要运行修改 DN 操作的每个后缀上扩展 ACI 权限。导入访问权限允许将条目导入指定 DN。导出访问权限允许从指定 DN 导出条目。
在执行修改 DN 操作之前,请确保该操作不会中断客户端验证。如果移动引用客户端证书的条目,则客户端验证将会中断。请在移动条目后对证书进行验证。
在执行修改 DN 操作之前,请确保该操作不会中断应用程序。重命名或移动条目可能会影响多个后缀,或更改条目的以下特性:
条目的已过滤角色的范围。
条目的嵌套角色(此处的嵌套角色包含过滤角色)。
条目的动态组成员身份。
协同使用修改 DN 操作和复制时的准则
注意 –
使用修改 DN 操作时如果不符合以下要求,可能会中断复制并破坏目录服务。
确保复制拓扑中的所有服务器至少运行 Directory Server 5.2。在 Directory Server 5.2 之前的目录服务器版本中,无法使用修改 DN 操作。
在复制拓扑中的所有服务器上启用修改 DN 操作。如果主服务器支持修改 DN 操作而使用方服务器不支持此操作,则复制将会失败。将在提供方服务器的错误日志中写入类似以下内容的消息。
启用 MODDN 时无法启动复制会话
要重新启动复制,请重新配置复制拓扑以便在所有服务器上启用修改 DN 操作,然后使用以下任一方式启动复制会话:
按照强制执行复制更新中的说明进行操作。
更改提供方服务器上的条目。此更改将被复制到使用方服务器。
在拓扑中的所有主副本上启用并配置引用完整性插件。此操作可确保服务器维护组和角色的引用完整性。有关如何启用和配置引用完整性插件的信息,请参见配置引用完整性插件。
执行完修改 DN 操作之后,请为引用完整性插件留出复制更改的时间。
设置引用
可以使用引用通知客户端应用程序应该联系哪个服务器(如果无法在本地获取此信息)。引用是指向远程后缀或条目的指针,目录服务器将其代替结果返回给客户端。然后,客户端必须在引用中所指定的远程服务器上再次执行操作。
在以下三种情况下将发生重定向:
客户端应用程序请求本地服务器上不存在的条目,并且服务器已被配置为返回默认引用。
出于维护或安全原因已禁用整个后缀。
服务器将返回该后缀所定义的引用。设置引用并将后缀设置为只读中介绍了后缀级别的引用。客户端请求写入操作时,后缀的只读副本也会将引用返回给主服务器。
客户端专门访问智能引用。
智能引用是您创建的一个条目。服务器将返回智能引用所定义的引用。
在任何情况下,引用都是一个 LDAP URL,其中包含主机名、端口号以及其他服务器上的 DN(可选)。例如 ldap://:389。
以下部分介绍设置目录默认引用以及创建和定义智能引用的过程。
设置默认引用
客户端应用程序在某个 DN 上提交操作时,如果由目录服务器维护的任何后缀都不包含该 DN,则会将默认引用返回给该客户端应用程序。服务器将返回定义的所有引用,但不会定义返回引用的顺序。
设置默认引用
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
使用 dsconf 命令行实用程序设置一个或多个默认引用。
$ dsconf set-server-prop -h host -p port suffix-DN referral-url:referral-URL
例如:
$ dsconf set-server-prop -h host1 -p 1389 dc=example,dc=com \
referral-url:ldap://:1389
设置智能引用
智能引用允许您将目录条目或目录树映射到特定的 LDAP URL。使用智能引用时,可以将客户端应用程序引用到特定服务器或特定服务器上的特定条目。
智能引用通常指向另一个服务器上具有相同 DN 的实际条目。但是,您可以将智能引用定义为指向相同服务器或不同服务器上的任何条目。例如,您可以将具有以下 DN 的条目定义为智能引用:
uid=bjensen,ou=People,dc=example,dc=com
该智能引用指向服务器 上的另一个条目:
cn=Babs Jensen,ou=Sales,o=east,dc=example,dc=com
目录使用智能引用的方式应符合 RFC 4511 (/rfc/rfc4511.txt) 的 4.1.10 部分所指定的标准。
创建和修改智能引用
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
要创建智能引用,请使用 referral 和 extensibleObject 对象类来创建条目。
referral 对象类允许使用应包含 LDAP URL 的 ref 属性。extensibleObject 对象类允许您将任何模式属性用作命名属性,以便与目标条目相匹配。
例如,要定义以下可返回智能引用(而不是条目 uid=bjensen)的条目,请使用如下命令:
$ ldapmodify -a -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: uid=bjensen,ou=People,dc=example,dc=com
objectclass: top
objectclass: extensibleObject
objectclass: referral
uid: bjensen
ref: ldap:///cn=Babs%20Jensen,ou=Sales,o=east,dc=example,dc=com
注 –
服务器将忽略 LDAP URL 中位于空格后的所有信息。因此,在用作引用的任何 LDAP URL 中,都必须使用 %20 代替空格。其他特殊字符必须进行转义。
定义智能引用之后,对 uid=bjensen 条目的修改实际上将在其他服务器的 cn=Babs Jensen 条目上执行。ldapmodify 命令将自动跟踪引用,例如:
$ ldapmodify -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: replace
replace: telephoneNumber
telephoneNumber: (408) 555-1234
(可选的)要修改智能引用条目,请使用 ldapmodify 的 -M 选项:
$ ldapmodify -M -h host1 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: uid=bjensen,ou=People,dc=example,dc=com
changetype: replace
replace: ref
ref: ldap:///cn=Babs%20Jensen,ou=Marketing,o=east,dc=example,dc=com
检查有效的属性语法
只要执行以下操作,目录服务器都允许您检查属性的完整性:
使用 dsadm import 或 dsconf import 导入数据。
使用 LDAP 或 DSML 来添加条目、修改条目或修改条目 DN。
检查可确保属性值符合 IETF 建议。所有不符合的属性都将被拒绝并记录到错误日志中。日志消息包含连接和操作 ID(如果适用)。
默认情况下,服务器将自动检查上述操作的语法。如果要关闭语法检查,请使用以下过程。
注 –
语法检查与模式检查有所不同。有关模式检查的信息,请参见管理模式检查。
关闭自动语法检查
无法使用 DSCC 执行此任务。请使用命令行,如以下过程所述。
要关闭自动语法检查,请使用以下命令:
$ dsconf set-server-prop -h host -p port check-syntax-enabled:off
跟踪对目录条目的修改
默认情况下,服务器会为新创建或已修改的条目维护一些特殊属性,如 LDAP v3 规范中所指定的那样。这些特殊属性存储在后缀中的条目上,其中包括:
creatorsName — 最初创建条目的用户的 DN。
createTimestamp — 创建条目时的时间戳(GMT 格式)。
modifiersName — 最后修改条目的用户的 DN。
modifyTimestamp — 修改条目时的时间戳(GMT 格式)。
关闭条目修改跟踪
可使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
注意 –
关闭条目修改跟踪会导致不兼容的数据。由于许多应用程序都依赖于这些属性,并且禁用此功能只会使性能略为提高,因此建议您不要关闭条目修改跟踪。
关闭服务器的条目修改跟踪。
$ dsconf set-server-prop -h host -p port suffix-DN mod-tracking-enabled:off
加密属性值
属性加密可保护存储在目录中的敏感数据。属性加密允许您指定以加密格式存储条目的某些属性。这可防止读取存储在数据库文件、备份文件和导出的 LDIF 文件中的数据。
使用此功能,将属性值存储到目录服务器数据库之前会对其进行加密,并在返回给客户端之前解密回原始值。您必须使用访问控制来阻止没有权限的客户端访问此类属性,并在客户端和目录服务器之间传输属性值时使用 SSL 对属性值进行加密。有关一般情况下的数据安全性和特殊情况下的属性加密的结构性概述,请参见《Sun Java System Directory Server Enterprise Edition 6.2 Reference》。
只有在服务器上配置和启用 SSL 之后,属性加密才处于活动状态。但在默认情况下,任何属性都未加密。属性加密是在后缀级别上配置的,这意味着会在后缀包含该属性的每个条目中加密该属性。如果您要在整个目录中加密属性,则必须在每个后缀中为该属性启用加密。
注意 –
属性加密将影响与后缀关联的所有数据和索引文件。如果修改现有后缀的加密配置,则必须先导出该后缀的内容,再更改配置,然后重新导入内容。DSCC 可以帮助您执行这些步骤。有关使用 DSCC 的详细信息,请参见目录服务控制中心界面。
为了更加安全,在为任何属性启用加密时,都应手动删除可能仍包含未加密值的数据库缓存文件和数据库日志文件。配置属性加密中介绍了删除这些文件的过程。
在新后缀中装入或创建数据之前,应该启用所有加密属性。
如果选择加密被某些条目用作命名属性的属性,则 DN 中显示的值将不会被加密。存储在条目中的值将被加密。
即使可以在配置加密时选择 userPassword 属性,也不会实际提高安全性,除非需要以明文形式存储密码。DIGEST-MD5 SASL 验证就是这种情况。如果密码已在密码策略中定义了加密机制,则进一步加密只能使安全性略为提高,且反而会影响每个绑定操作的性能。
在存储时,加密的属性前会加上一个表示所用加密算法的密码标记。使用 DES 加密算法的加密属性将显示为如下形式:
{CKM_DES_CBC}3hakc&jla+=snda%
当您考虑到数据加密而联机导入数据时,就已经提供了用于通过服务器验证的密钥数据库密码,系统不会再出现此提示。如果要脱机导入数据,目录服务器会先提示您输入密码,然后才允许您加密要导入的数据。解密数据(此操作需要更高的安全性)时,无论联机还是脱机执行导出操作,目录服务器都会自动提示您输入密钥数据库密码。这可进一步提高安全性。
注 –
只要证书或私钥不发生更改,服务器将继续生成相同的密钥。因此,如果两个服务器实例使用相同的证书,则可以将数据从一个服务器实例传输到另一个服务器实例(先导出然后再导入)。
属性加密和性能
虽然属性加密提供了增强的数据安全性,但也会影响系统性能。请仔细考虑哪些属性需要加密,并且只加密您认为特别敏感的那些属性。
由于可以通过索引文件直接访问敏感数据,因此必须加密与加密属性相对应的索引键,以确保属性受到完整保护。如果索引已对目录服务器性能造成影响(尚未包括加密索引键所造成的影响),请在第一次将数据导入或添加到数据库之前配置属性加密。此过程可确保对加密属性的索引就像从头开始编制一样。
属性加密使用注意事项
执行属性加密功能时请考虑以下事项:
一般而言,在修改属性加密配置时,最佳做法是先导出数据,再更改配置,然后导入新配置的数据。
这可确保整体考虑所有配置更改,而不会丢失任何功能。否则,某些功能可能会丢失,从而破坏数据的安全性。
在现有数据库上修改属性加密配置可能会对系统性能造成严重影响。
例如,假定您有一个包含现有数据的数据库实例。该数据库包含以前存储的具有 mySensitiveAttribute 属性的条目。此属性的值以明文形式存储在数据库和索引文件中。如果您以后决定加密 mySensitiveAttribute 属性,则必须导出该数据库实例中的所有数据,然后将其重新导入数据库,以确保服务器使用属性加密配置更新数据库和索引文件。如果一开始就对属性进行加密,则可避免由此造成的性能影响。
以解密格式导出数据时,如果使用错误的密码,则导出将被拒绝。
作为一种安全措施,服务器会在用户以解密格式导出数据时提示用户输入密码。如果用户提供了错误的密码,服务器将拒绝解密导出操作。可以直接输入密码,也可以提供密码所在文件的路径。请注意,此文件与 SSL 密码文件具有相同的语法。请参见配置证书数据库密码。
可以对加密算法进行更改,但如果更改过程有误,则结果可能会丢失索引功能。
要更改用于加密数据的算法,请导出数据,再修改属性加密配置,然后导入数据。如果不按此过程操作,则根据初始加密算法创建的索引将不再有效。
由于加密的属性前添加了表示所用加密算法的密码标记,内部服务器操作将负责导入数据。因此,目录服务器允许您在更改算法前以加密格式导出数据。
更改服务器的 SSL 证书将导致您无法解密已加密的数据。
属性加密功能会使用服务器的 SSL 证书生成自己的密钥,以用于执行加密和解密操作。因此,解密已加密的数据时需要使用 SSL 证书。如果更改证书之前未解密数据,将无法解密数据。要避免出现这种情况,请以解密格式导出数据,再更改证书,然后重新导入数据。
要以加密格式传输数据,也就是说,要将数据从一个服务器实例导出,然后再导入另一个服务器实例,则这两个服务器实例必须使用相同的证书。
配置属性加密
可使用 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 文件初始化后缀,如初始化后缀中所述。
装入文件并创建相应索引之后,指定属性的所有值都将被加密。
服务器3个w目录文件夹 第 4 章 目录服务器条目 (Sun Java System Directory Server Enterprise Edition 6.2 管理指南)...