使用 DsAddSidHistory

DsAddSidHistory 函数会从一个域(源域)获取安全主体的主要帐户安全标识符 (SID),并将其添加到其他林中另一个(目标)域中的安全主体的 sIDHistory 属性。 当源域处于 Windows 2000 本机模式时,此函数还会检索源主体的 sIDHistory 值,并将其添加到目标主体的 sIDHistory

将 SID 添加到安全主体的 sIDHistory 是一项安全敏感操作,可有效地向目标主体授予对源主体可访问的所有资源的访问权限,前提是从适用的资源域到目标域之间存在信任。

在本机模式下 Windows 2000 域中,用户登录会创建一个访问令牌,其中包含用户主要帐户 SID 和组 SID,以及用户所属组的 user sIDHistorysIDHistory。 在用户的令牌中包含这些前 SID(sIDHistory 值)时,可授予用户对包含前 SID 的访问控制列表 (ACL) 保护的资源的访问权限。

此操作有助于某些 Windows 2000 部署方案。 具体而言,它支持为 Windows NT 4.0 生产环境中已存在的用户和组创建新 Windows 2000 林中的帐户的方案。 通过将 Windows NT 4.0 帐户 SID 置于 Windows 2000 帐户 sIDHistory 中,将保留对网络资源的访问权限,以便用户登录到新的 Windows 2000 帐户。

DsAddSidHistory 还支持将 Windows NT 4.0 备份域控制器 (BDC) 资源服务器(或本机模式 Windows 2000 域中的成员服务器)迁移到 Windows 2000 域作为成员服务器。 此迁移需要在目标 Windows 2000 域中创建在其 sIDHistory 中包含源域中 BDC 上定义的本地组的主要 SID 的域本地组(或 Windows 2000 服务器上的 ACL 中引用的域本地组)。 通过创建包含 sIDHistory 的目标本地组和源本地组的所有成员,将为所有成员保留对已迁移的服务器资源(由引用源本地组的 ACL 保护)的访问权限。

注意

在这些和其他方案中使用 DsAddSidHistory,需要了解其更广泛的管理和安全影响。 有关详细信息,请参阅白皮书“规划从 Windows NT 迁移到 Microsoft Windows 2000”,该白皮书在 Windows 2000 支持工具中作为 Dommig.doc 提供。 还可以在 \support\tools 下的产品 CD 上找到此文档。

授权要求

DsAddSidHistory 在源域和目标域中需要管理员特权。 具体而言,此 API 的调用方必须是目标域中域管理员组的成员。 执行此成员身份的硬编码检查。 此外,SrcDomainCreds 参数中提供的帐户必须为源域中管理员或域管理员组的成员。 如果在 SrcDomainCreds 中传递了 NULL,此 API 的调用方则须为源域中管理员或域管理员组的成员。

域和信任要求

DsAddSidHistory 要求目标域处于 Windows 2000 本机模式或更高版本,因为只有此域类型支持 sIDHistory 属性。 源域可以是 Windows NT 4.0 或 Windows 2000、混合模式或本机模式。 源域和目标域不得位于同一林中。 按定义,Windows NT 4.0 域不在林中。 此林间约束可确保不会在同一林中创建重复的 SID(无论是显示为主要 SID 还是 sIDHistory 值)。

在下表中列出的情况下,DsAddSidHistory 需要从源域到目标域的外部信任。

案例 说明
源域为 Windows 2000。
sIDHistory 属性仅在 Windows 2000 源域中可用,只能使用 LDAP 读取,这需要此信任才能进行完整性保护。
源域为 Windows NT 4.0,SrcDomainCredsNULL
使用调用方凭据支持源域操作所需的模拟取决于此信任。 模拟还要求目标域控制器默认在域控制器上启用“信任委派”。

但是,如果源域为 Windows NT 4.0 且 SrcDomainCreds 不是 NULL,则源域和目标域之间不需要信任。

源域控制器要求

DsAddSidHistory 要求选择域控制器作为源域中操作的目标,即 Windows NT 4.0 域中的 PDC 或 Windows 2000 域中的 PDC 模拟器。 源域审核是通过写入操作生成的,因此,在 Windows NT 4.0 源域中需要 PDC,而仅 PDC 限制可确保在一台计算机上生成 DsAddSidHistory 审核。 这减少了查看所有 DC 的审核日志以监视此操作的使用的需要。

注意

在 Windows NT 4.0 源域中,PDC(源域中的操作目标)必须运行 Service Pack 4 (SP4) 及更高版本,才能确保适当的审核支持。

必须将以下注册表值创建为 REG_DWORD 值,并在 Windows NT 4.0 和 Windows 2000 源 DC 的源域控制器上设置为 1。

HKEY_LOCAL_MACHINE
   System
      CurrentControlSet
         Control
            Lsa
               TcpipClientSupport

设置此值可启用通过 TCP 传输进行 RPC 调用。 这是必需的,因为默认情况下,SAMRPC 接口仅在命名管道上可远程处理。 使用命名管道会导致凭据管理系统适合以交互方式登录的用户进行网络调用,但对于使用用户提供的凭据进行网络调用的系统进程并不灵活。 RPC over TCP 更适合用于该目的。 设置此值不会降低系统安全性。 如果创建或更改了此值,则必须重启源域控制器才能使此设置生效。

必须在源域中创建一个新的本地组“<SrcDomainName>$$$”,才能进行审核。

审核

将审核 DsAddSidHistory 操作,以确保源域和目标域管理员能够检测此函数何时运行。 在源域和目标域中都必须进行审核。 DsAddSidHistory 验证审核模式是否位于每个域中,以及成功/失败事件的帐户管理审核是否处于启用状态。 在目标域中,为每个成功或失败的 DsAddSidHistory 操作生成唯一的“添加 Sid 历史记录”审核事件。

Windows NT 4.0 系统上不提供唯一的“添加 Sid 历史记录”审核事件。 若要生成明确反映对源域使用 DsAddSidHistory 的审核事件,它会对名称为审核日志中唯一标识符的特殊组执行操作。 本地组“<SrcDomainName>$$$”的名称由追加三美元符号 ($)(ASCII 代码 = 0x24 和 Unicode = U+0024)的源域 NetBIOS 名称组成,必须在调用 DsAddSidHistory 之前在源域控制器上创建。 每个作为此操作目标的源用户和全局组都会添加到此组的成员身份,然后从该组的成员身份中删除。 这会在源域中生成“添加成员”和“删除成员”审核事件,这两个事件可以通过搜索引用组名称的事件进行监视。

注意

无法审核 Windows NT 4.0 或 Windows 2000 混合模式源域中针对本地组的 DsAddSidHistory 操作,因为本地组不能成为另一个本地组的成员,因此无法将其添加到特殊的“<SrcDomainName>$$$”本地组。 由于源域资源访问不受此操作影响,因此缺少审核不会对源域造成安全问题。 将源本地组的 SID 添加到目标本地组不会向任何其他用户授予对受该本地组保护的源资源的访问权限。 将成员添加到目标本地组时,不会向其授予对源资源的访问权限。 添加的成员仅有权访问从源域迁移的目标域中的服务器,该服务器可能具有受源本地组 SID 保护的资源。

数据传输安全性

DsAddSidHistory 强制实施以下安全措施:

  • 从 Windows 2000 工作站调用,调用方凭据用于对目标域控制器的 RPC 调用进行身份验证和保护隐私。 如果 SrcDomainCreds 不是 NULL,则工作站和目标 DC 都必须支持 128 位加密,才能保护凭据隐私。 如果 128 位加密不可用,并且提供了 SrcDomainCreds,则必须在目标 DC 上进行调用。
  • 目标域控制器使用 SrcDomainCreds 或调用方凭据与源域控制器通信,以对源帐户 SID 的读取(使用 SAM 查找)和 sIDHistory(使用 LDAP 读取)进行相互身份验证和完整性保护。

威胁模型

下表列出了与 DsAddSidHistory 调用关联的潜在威胁,并提出与特定威胁相关的安全措施。

潜在威胁 安全措施
中间人攻击
未经授权的用户截获源对象的查找 SID 返回调用,将源对象 SID 替换为任意 SID,以插入到目标对象 SIDhistory 中。
源对象的查找 SID 是一个经过身份验证的 RPC,其中使用调用方管理员凭据和数据包完整性消息保护。 这可确保在不检测的情况下无法修改返回调用。 目标域控制器会创建唯一的“添加 SID 历史记录”审核事件,该事件反映添加到目标帐户 sIDHistory 的 SID。
特洛伊木马源域
未经授权的用户在专用网络上创建一个“特洛伊木马”源域,其与合法源域具有相同的域 SID 和某些相同的帐户 SID。 然后,未经授权的用户尝试在目标域中运行 DsAddSidHistory,才能获取源帐户的 SID。 无需实际源域管理员服务器凭据,并且无需在实际源域中留下审核线索即可完成此操作。 未经授权的用户用于创建特洛伊木马源域的方法可能是以下方法之一:
  • 获取源域 SAM 的副本(BDC 备份)。
  • 创建新域,更改磁盘上的域 SID 以匹配合法源域 SID,然后创建足够的用户来实例化具有所需 SID 的帐户。
  • 创建 BDC 副本。 这需要源域管理员凭据。 然后,未经授权的用户将副本带到专用网络来实现攻击。

尽管未经授权的用户可以通过多种方式检索或创建所需的源对象 SID,但在未成为目标域管理员组的成员的情况下,未经授权的用户不能使用它来更新帐户的 sIDHistory。 由于目标域控制器上针对域管理员成员身份的检查为硬编码,因此在目标 DC 上,无法执行磁盘修改来更改保护此函数的访问控制数据。 在目标域中审核克隆特洛伊木马源帐户的尝试。 仅为高度受信任的个人保留域管理员组中的成员身份可缓解此攻击。
SID 历史记录的磁盘上修改
具有域管理员服务器凭据以及目标域中 DC 的物理访问权限的复杂未经授权的用户可以在磁盘上修改帐户 sIDHistory 值。
未使用 DsAddSidHistory 启用此尝试。 通过阻止对除高度受信任的管理员以外的所有域控制器的物理访问,可以缓解此攻击。
用于删除保护的恶意代码
具有目录服务代码物理访问权限的未经授权的用户或恶意管理员可能会创建如下恶意代码:
  1. 删除代码中域管理员组中成员身份的检查。
  2. 更改源域控制器上的调用,该调用将 SID 指向未审核的 LookupSidFromName。
  3. 删除审核日志调用。

具有 DS 代码物理访问权限且知识足以创建恶意代码的人能够任意修改帐户的 sIDHistory 属性。 DsAddSidHistory API 不会增加此安全风险。
易受 SID 被盗影响的资源
如果未经授权的用户已成功使用此处所述的方法之一来修改帐户 sIDHistory,并且相关资源域信任未经授权的用户帐户域,则未经授权的用户可能可未经授权访问被盗的 SID 资源,这有可能不会在 SID 被盗的帐户域中留下审核线索。
资源域管理员通过仅设置从安全角度有意义的信任关系来保护其资源。 在受信任的目标域中,DsAddSidHistory 的使用仅限于已在其职责范围内拥有广泛权限的域管理员组的成员。
恶意目标域
未经授权的用户使用其 sIDHistory 包含从源域被盗的 SID 的帐户创建 Windows 2000 域。 未经授权的用户使用此帐户对资源进行未经授权的访问。
未经授权的用户需要源域的管理员凭据才能使用 DsAddSidHistory,并且会在源域控制器上留下审核线索。 恶意目标域仅在信任恶意域的其他域中获得未经授权的访问权限,这需要在这些资源域中具有管理员权限。

操作约束

本部分介绍使用 DsAddSidHistory 函数的操作约束。

目标林中不得已存在 SrcPrincipal 的 SID(作为主要帐户 SID 或帐户的 sIDHistory)。 例外情况是,当尝试将 SID 添加到包含相同 SID 的 sIDHistory 时,DsAddSidHistory 不会生成错误。 此行为使 DsAddSidHistory 可以使用相同的输入多次运行,从而成功且结束状态一致,以便工具开发人员易于使用。

注意

全局目录复制延迟可能会提供一个窗口,在此期间可能会创建重复的 SID。 但是,管理员可以轻松删除重复的 SID。

SrcPrincipalDstPrincipal 必须是以下类型之一:

  • 用户

  • 已启用安全性的组,包括:

    本地组 全局组 域本地组(仅限 Windows 2000 本机模式)通用组(仅限 Windows 2000 本机模式)

SrcPrincipalDstPrincipal 的对象类型必须匹配。

  • 如果 SrcPrincipal 是用户,则 DstPrincipal 必须是用户。
  • 如果 SrcPrincipal 是本地组或域本地组,则 DstPrincipal 必须是域本地组。
  • 如果 SrcPrincipal 是全局组或通用组,则 DstPrincipal 必须是全局组或通用组。

SrcPrincipalDstPrincipal 不能是以下类型之一:(DsAddSidHistory 在这些情况下会失败并出现错误)

  • 计算机(工作站或域控制器)

  • 域间信任

  • 临时重复帐户(几乎未使用的功能,LANman 的旧版)

  • 具有已知 SID 的帐户。 每个域中的已知 SID 相同;因此,将它们添加到 sIDHistory 会违反 Windows 2000 林的 SID 唯一性要求。 具有已知 SID 的帐户包括以下本地组:

    帐户操作员 管理员 备份操作员 来宾 打印操作员 复制器服务器操作员 用户

如果 SrcPrincipal 具有已知的相对标识符 (RID) 和特定于域的前缀,即域管理员、域用户和域计算机,则 DstPrincipal 必须拥有相同的已知 RID,DsAddSidHistory 才会成功。 具有已知 RID 的帐户包括以下用户和全局组:

  • 管理员
  • 来宾
  • 域管理员
  • 域来宾
  • 域用户

设置注册表值

以下过程演示如何设置 TcpipClientSupport 注册表值。

设置 TcpipClientSupport 注册表值

  1. 在源域控制器上创建以下注册表值作为 REG_DWORD 值,并将其值设置为 1。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\TcpipClientSupport

  2. 然后,重启源域控制器。 此注册表值会导致 SAM 侦听 TCP/IP。 如果未在源域控制器上设置此值,DsAddSidHistory 将失败。

启用用户/组管理事件的审核

以下过程演示如何在 Windows 2000 或 Windows Server 2003 源或目标域中启用用户/组管理事件的审核。

在 Windows 2000 或 Windows Server 2003 源或目标域中启用用户/组管理事件的审核

  1. 在 Active Directory 用户和计算机 MMC 管理单元中,选择目标域域控制器容器。
  2. 右键单击“域控制器”,然后选择“属性”。
  3. 单击“组策略”选项卡。
  4. 选择“默认域控制器策略”,然后单击“编辑”。
  5. 计算机配置\Windows 设置\安全性设置\本地策略\审核策略下,双击“审核帐户管理”。
  6. 在“审核帐户管理”窗口中,选择“成功”和“失败”审核。 策略更新在重启或刷新后生效。
  7. 通过查看组策略 MMC 管理单元中的有效审核策略来验证是否启用了审核。

以下过程演示如何在 Windows NT 4.0 域中启用用户/组管理事件的审核。

在 Windows NT 4.0 域中启用用户/组管理事件的审核

  1. 在“域的用户管理器”中,单击“策略”菜单,然后选择“审核”。
  2. 选择“审核这些事件”。
  3. 对于“用户和组管理”,选中“成功和失败”。

以下过程演示如何在 Windows NT 4.0、Windows 2000 或 Windows Server 2003 源域中启用用户/组管理事件的审核。

在 Windows NT 4.0、Windows 2000 或 Windows Server 2003 源域中启用用户/组管理事件的审核

  1. 在“域的用户管理器”中,单击“用户”菜单,然后选择“新建本地组”。
  2. 输入一个组名称,由源域 NetBIOS 名称加上三美元符号 ($),例如 FABRIKAM$$$$。 描述字段应指示此组用于审核 DsAddSidHistory 或克隆操作的使用。 确保组中没有成员。 单击确定

如果未按此处所述启用源和目标审核,DsAddSidHistory 操作将失败。

设置信任(如果需要)

如果以下情况之一为 true,则必须从源域建立信任到目标域(这必须在其他林中发生):

  • 源域是 Windows Server 2003。
  • 源域为 Windows NT 4.0,SrcDomainCredsNULL