模拟级别
如果模拟成功,则表示客户端已同意让服务器成为某个程度的客户端。 模拟级别 称为模拟级别,并指示模拟客户端时向服务器授予多少权限。
目前,有四个模拟级别:匿名、识别、模拟和 委托。 以下列表简要描述了每个模拟级别:
-
匿名 (RPC_C_IMP_LEVEL_ANONYMOUS)
-
客户端是服务器的匿名客户端。 服务器进程可以模拟客户端,但模拟令牌不包含有关客户端的任何信息。 仅本地进程间通信传输支持此级别。 所有其他传输以无提示方式提升此级别以识别。
-
标识(RPC_C_IMP_LEVEL_IDENTIFY)
-
系统默认级别。 服务器可以获取客户端的标识,服务器可以模拟客户端来执行 ACL 检查。
-
模拟(RPC_C_IMP_LEVEL_IMPERSONATE)
-
服务器可以模拟客户端的安全上下文,同时代表客户端执行作。 服务器可以作为客户端访问本地资源。 如果服务器是本地服务器,则可以以客户端身份访问网络资源。 如果服务器是远程服务器,则只能访问与服务器位于同一台计算机上的资源。
-
委托(RPC_C_IMP_LEVEL_DELEGATE)
-
最强大的模拟级别。 选择此级别后,服务器(无论是本地还是远程)可以在代表客户端执行作时模拟客户端的安全上下文。 在模拟期间,可以将客户端的凭据(本地和网络)传递给任意数量的计算机。
若要模拟在委托级别工作,必须满足以下要求:
- 客户端必须将模拟级别设置为RPC_C_IMP_LEVEL_DELEGATE。
- 客户端帐户不得在 Active Directory 服务中标记为“帐户敏感且无法委派”。
- 服务器帐户必须使用 Active Directory 服务中的“受信任委派”属性进行标记。
- 托管客户端、服务器和任何“下游”服务器的计算机都必须在域中运行。
通过选择模拟级别,客户端会告知服务器模拟客户端的距离。 客户端在用于与服务器通信的代理上设置模拟级别。
设置模拟级别
可通过两种方法设置模拟级别:
- 客户端可以通过调用 CoInitializeSecurity将其设置为进程范围。
- 客户端可以通过调用 IClientSecurity::SetBlanket(或 coSetProxyBlanket的帮助程序函数)在远程对象的接口上设置代理级安全性。
通过将适当的RPC_C_IMP_LEVEL_xxx值传递给 coInitializeSecurity或 CoSetProxyBlanketdwImpLevel 参数来设置模拟级别。
不同的身份验证服务支持不同范围的委托级模拟。 例如,NTLMSSP 支持跨线程和跨进程委托级模拟,但不支持跨计算机。 另一方面,Kerberos 协议支持跨计算机边界的委托级模拟,而 Schannel 不支持委托级别的任何模拟。 如果在模拟级别具有代理,并且想要将模拟级别设置为委托,则应调用 SetBlanket 使用除模拟级别以外的每个参数的默认常量。 COM 将在本地选择 NTLM,并远程选择 Kerberos 协议(Kerberos 协议何时正常工作)。
相关主题