本文介绍如何在 Windows Server 2003 Service Pack 1 中将属性标记为机密。
适用于: Windows Server 2003原始 KB 数: 922836
总结
在 Microsoft Windows Server 2000 和 Microsoft Windows Server 2003 的 Active Directory 目录服务中,很难阻止经过身份验证的用户读取属性。 通常,如果用户请求READ_PROPERTY属性或其属性集的权限,则会授予读取访问权限。 已设置 Active Directory 中的默认安全性,以便经过身份验证的用户具有对所有属性的读取访问权限。 本文介绍如何防止对 Windows Server 2003 Service Pack 1(SP1)中的属性进行读取访问。
详细信息
Windows Server 2003 SP1 引入了将属性标记为机密的方法。 为此,请修改架构中的 searchFlags 属性的值。 searchFlags 属性值包含表示属性的各种属性的多个位。 例如,如果设置了位 1,则为属性编制索引。 位 7 (128) 将属性指定为机密属性。
要求和约束
只有运行 Windows Server 2003 SP1 或更高版本的域控制器才会强制对机密属性进行读取访问检查。 机密属性功能与 Windows Server 2003 SP1 或更高版本的安装相关联。 此功能不取决于是否启用了域或林功能级别。
除非满足以下条件,否则不要使用机密属性功能:
- 所有基于 Windows Server 2003 的域控制器都安装了 Windows Server 2003 SP1 或更高版本。
- 所有基于 Windows 2000 的域控制器都已升级或删除。 如果域包含运行 Windows 2000 Server 的域控制器的组合,则 Windows Server 2003 和 Windows Server 2003 SP1 的原始版本可能会发生以下情况:
- 如果未经授权的客户端查询基于 Windows 2000 Server 的域控制器和基于 Windows Server 2003 的域控制器以获取机密属性数据,客户端可以读取数据。
- 如果未经授权的客户端查询基于 Windows Server 2003 SP1 的域控制器以获取机密属性数据,则客户端无法读取数据。 不能将基本架构属性标记为机密。 员工 ID 是基本架构属性的示例。 此属性不能标记为机密,因为它的 systemsFlags 属性值设置为0x10(基本架构)。 有关详细信息,请参阅“如何确定属性是否为基本架构属性”部分和“如何使用现有属性时确定 searchFlags 属性值”部分。
测试
与测试对 Active Directory 和任何架构扩展的任何更改一样,我们建议在镜像生产林的实验室中全面测试属性更改。 测试有助于保证过程正常运行,并检测到问题。
访问控制检查
安装 Windows Server 2003 SP1 并在 Active Directory 执行读取访问检查后,Active Directory 会检查机密属性。 如果存在机密属性,并且为这些属性设置了READ_PROPERTY权限,Active Directory 还需要CONTROL_ACCESS属性或属性集的权限。
注意
完全控制权限设置包括CONTROL_ACCESS权限。
在以下情况下,Active Directory 对对象执行读取访问检查:
- 评估对象是否与搜索筛选器匹配。
- 返回与搜索筛选器匹配的对象的属性时。 默认情况下,只有管理员对所有对象具有CONTROL_ACCESS权限。 因此,只有管理员可以读取机密属性。 管理员可以将这些权限委派给任何用户或任何组。
泛型和特定于对象的访问控制条目
Active Directory 中的每个对象都有与其关联的访问控制信息。 此信息称为安全描述符。 安全描述符控制用户和组可用的访问类型。 创建对象时,会自动创建安全描述符。
安全描述符中的一组权限条目称为自由访问控制列表(DACL)。 DACL 中的每个权限条目称为访问控制项(ACE)。
可以通过对对象使用泛型或特定于对象的访问控制项授予对机密属性CONTROL_ACCESS权限。 可以通过在对象上显式标记权限或使用继承来授予权限。 继承意味着在容器层次结构中的较高容器上设置可继承的访问控制项。
泛型和特定于对象的访问控制条目基本相同。 区别在于访问控制条目通过继承和对象访问提供的控制程度。 泛型访问控制条目适用于整个对象。 特定于对象的访问控制条目可以更好地控制哪些对象继承了访问控制项。 使用特定于对象的访问控制项时,可以指定将继承访问控制项的对象的属性或属性集。
使用机密属性功能时,通过向用户分配通用访问控制条目来授予CONTROL_ACCESS权限。 如果通过分配特定于对象的访问控制项授予CONTROL_ACCESS权限,则用户将仅对机密属性具有CONTROL_ACCESS权限。
使用通用访问控制项时,会授予以下权限:
- 所有扩展权限
- 允许进行身份验证
- 更改密码
- 接收为
- 重置密码
- 发送为
使用泛型访问控制项时授予的权限可能会提供比整个对象所需的更多访问权限。 如果这是一个问题,则可以在对象上设置特定于对象的访问控制项,以便访问控制项仅适用于机密属性。 使用特定于对象的访问控制项时,可以控制访问控制项应用于的属性或属性集。
Windows Server 2003 中的用户界面不公开Control_Access权限。 可以使用Dsacls.exe工具通过分配泛型访问控制项来设置Control_Access权限。 但是,不能使用此工具分配特定于对象的访问控制项。 唯一可以通过分配特定于对象的访问控制项来设置Control_Access权限的工具是Ldp.exe工具。
注意
对访问控制的深入讨论超出了本文的范围。 有关访问控制的详细信息,请访问以下Microsoft网站:访问控制(授权)标识管理和访问控制
如何使用继承
在大型域中,对于具有机密属性的每个对象,手动分配对用户或组的控制访问权限并不可行。 解决方案是使用继承设置容器层次结构中更高级的可继承访问控制项。 此访问控制项适用于该容器的所有子对象。
默认情况下,除内置管理员帐户外,所有组织单位(OU)和所有用户帐户都启用了继承。 如果创建禁用继承的用户帐户,或者通过复制内置管理员帐户创建管理帐户,则必须为这些帐户启用继承。 否则,继承模型不适用于这些帐户。
如何创建机密属性
- 确定要标记为机密的属性,或添加要保密的属性。
- 授予相应的用户Control_Access权限,以便用户可以查看属性数据。
Ldp.exe工具和 Adsiedit.msc 工具等工具可用于创建机密属性。 .ldf 文件通常用于扩展架构。 这些文件还可用于将属性标记为机密。 应在测试阶段优化为实现创建的文件,以便在向生产推出时确切地了解要添加到架构的内容。 .ldf 文件有助于防止错误。
以下示例 .ldf 文件可用于执行以下操作:
- 将属性添加到架构
- 将属性标记为机密
- 将属性添加到用户类
注意
在使用 .ldf 文件之前,请确保阅读“对象标识符”和“属性语法”部分,了解有关如何将对象和属性添加到架构的重要信息。
示例 .ldf 文件
以下代码将属性添加到架构,然后将该属性标记为机密。
dn: CN=ConfidentialAttribute-LDF,CN=Schema,Cn=Configuration,DC=domain,DC=com changetype:add objectClass: attributeSchema lDAPDisplayName: ConfidentialAttribute adminDescription:此属性存储用户的机密数据 attributeID:1.2.840.113556.1.xxxx.xxxx.1.x attributeSyntax:2.5.5.12 oMSyntax:64 isSingleValued: TRUE showInAdvancedViewOnly: TRUE searchFlags:128
dn: changeType:modify add: schemaupdatenow schemaupdatenow: 1 -
以下代码将新属性添加到用户类。
dn: CN=User,CN=Schema,CN=Configuration,DC=domain,DC=com changetype: modify add: mayContain mayContain:ConfidentialAttribute -
dn: changeType:modify add: schemaupdatenow schemaupdatenow: 1 -
如何让非管理用户查看属性数据
注意
以下过程要求使用 Windows Server 2003 R2 Active Directory 应用程序模式(ADAM)附带的Ldp.exe工具。 Ldp.exe工具的其他版本无法设置权限。
如何手动设置对用户帐户Control_Access权限
- 打开 Windows Server 2003 R2 ADAM 随附的Ldp.exe工具。
- 连接并绑定到目录。
- 选择用户帐户,右键单击该帐户,单击“高级”,单击“安全描述符”,然后单击“确定”。
- 在 DACL** 框中,单击“添加 ACE”。**
- 在 “受托人 ”框中,键入要向其授予权限的组名或用户名。
- 在 “控制访问 ”框中,验证在步骤 5 中所做的更改。
如何使用继承来分配Control_Access权限
若要使用继承,请创建一个访问控制条目,该条目向容器层次结构中高于具有机密属性的对象授予Control_Access权限。 可以在域级别或容器层次结构中适用于企业的任意点设置此访问控制条目。 具有机密属性的子对象必须启用继承。
若要分配Control_Access权限,请执行以下步骤:
- 打开 Windows Server 2003 R2 ADAM 中包含的Ldp.exe文件。
- 连接并绑定到目录。
- 选择容器层次结构中高于具有机密属性的对象的 OU 或容器,右键单击 OU 或容器,单击“高级”,单击**“安全描述符”,然后单击“确定”。**
- 在 DACL** 框中,单击“添加 ACE”。**
- 在 “受托人 ”框中,键入要向其授予权限的组名或用户名。
- 在 “控制访问 ”框中,验证在步骤 5 中所做的更改。
- 在 “对象类型 ”框中,单击添加的机密属性。
- 请确保在目标对象上启用了继承。
使用现有属性时如何确定 systemFlags 属性值
如果使用现有对象,则必须验证当前 searchFlags 属性值是什么。 如果添加对象,可以在添加对象时定义值。 可通过多种方式获取 searchFlags 属性值。 使用最适合你的方法。
若要使用 Ldp.exe 工具获取 searchFlags 属性值,请执行以下步骤:
- 单击“开始”,单击“运行**”**,键入 LDP,然后单击“确定”。
- 单击“连接**”**,然后单击“绑定”。
- 作为根域的管理员绑定,或作为企业管理员的帐户进行绑定。
- 单击“视图**”**,然后单击“树”。
- 单击 CN=schema,cn=configuration,dc=rootdomain,然后单击“ 确定”。
- 在左窗格中,展开 CN=schema,cn=configuration,dc=rootdomain。
- 找到要标记为机密的属性的域名,然后展开它。
- 在为对象填充的属性列表中,查找 searchFlags 以确定该对象的当前 searchFlags 属性值。
注意
若要确定新的 searchFlags 属性值,请使用以下公式: 128 + currentsearchFlagsattribute 值 = newsearchFlagsattribute 值。
如何确定属性是否为基本架构属性
若要确定属性是否为基本架构属性,请使用Ldp.exe工具来检查 systemFlags 属性值。
Employee-ID 的 LDP 输出 - systemFlags:0x10 = (FLAG_SCHEMA_BASE_OBJECT)
在以下示例Ldp.exe输出中,Ldp.exe将 systemFlags 属性值标识为0x10和基本架构属性。 因此,不能将此属性标记为机密。
>> Dn:CN=Employee-ID,CN=Schema,CN=Configuration,DC=domain,DC=com 2> objectClass:top;attributeSchema; 1> cn:Employee-ID; 1> distinguishedName: CN=Employee-ID,CN=Schema,CN=Configuration,DC=domain,DC=com; 1> instanceType:0x4 = (IT_WRITE ); 1> whenCreated: <DateTime>; 1> whenChanged: <DateTime>; 1> uSNCreated: 220; 1> attributeID:1.2.840.113556.1.4.35; 1> attributeSyntax:2.5.5.12 = (SYNTAX_UNICODE_TYPE); 1> isSingleValued:TRUE; 1> rangeLower:0; 1> rangeUpper:16; 1> uSNChanged:220; 1> showInAdvancedViewOnly:TRUE; 1> adminDisplayName:Employee-ID; 1> adminDescription:Employee-ID; 1> oMSyntax: 64 = (OM_S_UNICODE_STRING ); 1> 个 searchFlags:0x0 = ( ); 1> lDAPDisplayName:employeeID; 1> 个名称:员工 ID; 1> objectGUID:64fb3ed1-338f-466e-a879-595bd3940ab7; 1> schemaIDGUID:bf967962-0de6-11d0-a285-00aa003049e2; 1> systemOnly:FALSE; 1> 个 systemFlags:0x10 = (FLAG_SCHEMA_BASE_OBJECT ); 1> objectCategory:CN=Attribute-Schema,CN=Schema,CN=Configuration,DC=domain,DC=com;
Employee-Number systemFlags 的 LDP 输出:0x0 = ()
在以下示例Ldp.exe输出中,Ldp.exe将 systemFlags 属性值标识为 0。 此属性可以标记为机密。
>> Dn:CN=Employee-Number,CN=Schema,CN=Configuration,DC=warrenw,DC=com 2> objectClass:top;attributeSchema; 1> cn:Employee-Number; 1> distinguishedName: CN=Employee-Number,CN=Schema,CN=Configuration,DC=warrenw,DC=com; 1> instanceType:0x4 = (IT_WRITE ); 1> whenCreated: <DateTime>; 1> whenChanged: <DateTime>; 1> uSNCreated: 221; 1> attributeID:1.2.840.113556.1.2.610; 1> attributeSyntax:2.5.5.12 = (SYNTAX_UNICODE_TYPE); 1> isSingleValued:TRUE; 1> rangeLower:1; 1> rangeUpper:512; 1> mAPIID:35943; 1> uSNChanged: 221; 1> showInAdvancedViewOnly:TRUE; 1> adminDisplayName:Employee-Number; 1> adminDescription:Employee-Number; 1> oMSyntax: 64 = (OM_S_UNICODE_STRING ); 1> 个 searchFlags:0x0 = ( ); 1> lDAPDisplayName: employeeNumber; 1> 个名称:员工编号; 1> objectGUID:2446d04d-b8b6-46c7-abbf-4d8e7e1bb6ec; 1> schemaIDGUID:a8df73ef-c5ea-11d1-bbcb-0080c76670c0; 1> systemOnly:FALSE; 1> 个 systemFlags:0x0 = ( ); 1> objectCategory:CN=Attribute-Schema,CN=Schema,CN=Configuration,DC=warrenw,DC=com;
对象标识符
将属性或类对象添加到架构时,所需属性之一是对象标识符(也称为 OID)。 对象标识符用于唯一定义对象类和属性。 确保公司获取唯一的对象标识符来标识其属性。 不支持生成对象标识符的工具,例如Oidgen.exe工具。 若要从Microsoft获取对象标识符,请访问以下Microsoft网站:从 Microsoft 获取对象标识符
属性语法
还需要 attributeSyntax 属性才能向架构添加新对象。 此属性定义用于比较属性类型的存储表示形式、字节排序和匹配规则。 语法定义属性值必须是字符串、数字还是时间单位。 每个对象的每个属性都与一个语法完全关联。 请确保为新属性选择正确的属性语法。 如果将轻型目录访问协议 (LDAP) 目录与其他 LDAP 目录同步,则这一点尤其重要。 将属性添加到架构后,无法更改其属性语法。
有关 attributeSyntax 属性的详细信息,请参阅 Attribute-Syntax 属性。