RPC over HTTP Security

除了标准 RPC 安全性之外,RPC over HTTP 还提供三种类型的安全性,这会导致 RPC 上的 HTTP 流量受到 RPC 保护一次,然后由 RPC 通过 HTTP 提供的隧道机制进行双重保护。 有关标准 RPC 安全机制的说明,请参阅 安全。 通过 HTTP 隧道机制的 RPC 以下列方式添加到正常的 RPC 安全性:

  • 通过 IIS 提供安全性(仅适用于通过 HTTP v2 的 RPC)。
  • 提供 SSL 加密和 RPC 代理验证(相互身份验证)。 也可通过 HTTP v2 在 RPC 中使用。
  • 提供对 RPC 代理级别的限制,用于指示允许服务器网络上哪些计算机通过 HTTP 调用接收 RPC。

以下各节将更详细地介绍这三项安全功能。

IIS 身份验证

RPC over HTTP 可以利用 IIS 的正常身份验证机制。 可以使用 IIS MMC 管理单元中默认网站下的 Rpc 节点配置 RPC 代理的虚拟目录:

显示 IIS MMC 管理单元中默认网站下 Rpc 节点的屏幕截图。

IIS 可配置为禁用匿名访问,并要求对 RPC 代理的虚拟目录进行身份验证。 为此,请右键单击 Rpc 节点并选择 属性。 选择“目录安全性”选项卡,然后单击 身份验证和访问控制 组中的“编辑”按钮,如下所示:

显示“RPC 属性”对话框的屏幕截图。

尽管即使 RPC 代理虚拟目录允许匿名访问,也可以使用 RPC over HTTP,但Microsoft强烈建议出于安全原因禁用对该虚拟目录的匿名访问。 相反,对于通过 HTTP 的 RPC 启用基本身份验证、Windows 集成身份验证或两者。 请记住,只有基于 HTTP v2 的 RPC 才能针对需要基本身份验证或 Windows 集成身份验证的 RPC 代理进行身份验证;如果禁用 禁止匿名访问,则通过 HTTP v1 的 RPC 将无法连接。 由于 RPC over HTTP v2 是更安全可靠的实现,因此使用支持它的 Windows 版本可提高安装的安全性。

注意

默认情况下,RPC 代理虚拟目录被标记为允许匿名访问。 但是,基于 HTTP v2 的 RPC 代理会拒绝默认情况下未进行身份验证的请求。

 

流量加密

通过 HTTP 的 RPC 可以通过 HTTP 客户端加密 RPC 与使用 SSL 的 RPC 代理之间的流量。 RPC 代理与通过 HTTP 服务器的 RPC 之间的流量使用正常的 RPC 安全机制进行加密,并且不使用 SSL(即使选择了客户端和 RPC 代理之间的 SSL)。 这是因为该部分流量在组织的网络和防火墙后面传输。

通过 HTTP 客户端的 RPC 与通常通过 Internet 传输的 RPC 代理之间的流量,除了为 RPC 选择加密机制之外,还可以使用 SSL 加密。 在这种情况下,路由的 Internet 部分中的流量将进行双重加密。 通过 RPC 代理加密流量可提供辅助防御,以防外围网络中的 RPC 代理或其他计算机遭到入侵。 由于 RPC 代理无法解密辅助加密层,因此 RPC 代理无权访问要发送的数据。 有关详细信息,请参阅 RPC over HTTP 部署建议。 SSL 加密仅适用于通过 HTTP v2 的 RPC。

限制对特定计算机的 HTTP 调用的 RPC

IIS 安全配置基于允许的计算机和端口范围。 通过 HTTP 使用 RPC 的功能由运行 IIS 和 RPC 代理的计算机上的两个注册表项控制。 第一个条目是切换 RPC 代理功能的标志。 第二个是代理可以向其转发 RPC 调用的计算机的可选列表。

默认情况下,与 RPC 代理联系以通过 HTTP 调用隧道进行 RPC 的客户端无法访问任何 RPC 服务器进程,但 RPC 通过 HTTP 服务器进程在 RPC 代理所在的同一台计算机上运行。 如果未定义 ENABLED 标志或设置为零值,IIS 将禁用 RPC 代理。 如果定义 ENABLED 标志并将其设置为非零值,则客户端可以通过运行 IIS 的计算机上的 HTTP 服务器连接到 RPC。 若要使客户端能够在另一台计算机上通过 HTTP 服务器进程隧道连接到 RPC,必须将注册表项添加到 IIS 计算机的 RPC over HTTP 服务器列表中。

RPC 服务器无法接受基于 HTTP 的 RPC 调用,除非他们专门请求 RPC 通过 HTTP 侦听 RPC。

以下示例演示如何配置注册表以允许客户端通过 Internet 连接到服务器:

HKEY_LOCAL_MACHINE\
   Software\Microsoft\Rpc\RpcProxy\Enabled:REG_DWORD
   Software\Microsoft\Rpc\RpcProxy\ValidPorts:REG_SZ

ValidPorts 条目是一个REG_SZ条目,其中包含允许 IIS RPC 代理转发 RPC 调用的计算机列表,以及它应用于连接到 RPC 服务器的端口。 REG_SZ条目采用以下形式:Rosco:593;Rosco:2000-8000;Data*:4000-8000。

在此示例中,IIS 可以通过 HTTP 调用将 RPC 转发到端口 593 和 2000 到 8000 上的服务器“Rosco”。 它还可以将调用发送到名称以“Data”开头的任何服务器。 它将在端口 4000 到 8000 上连接。 此外,在通过 HTTP 服务器将流量转发到 RPC 上的给定端口之前,RPC 代理会与侦听该端口的 RPC 服务执行特殊的数据包交换,以验证它是否愿意接受通过 HTTP 的请求。

对于基于这些示例设置的示例,如果 RPC 服务侦听服务器“Data1”上的端口 4500,但尚未调用其中一个具有 ncacn_httpRpcServerUseProtseq* 函数,它将拒绝请求。 此行为为因配置错误侦听打开的端口的服务器提供额外的保护;除非服务器专门请求通过 HTTP 侦听 RPC,否则不会接收源自防火墙外部的调用。

ValidPorts 密钥中的条目必须与客户端请求的 HTTP 服务器上的 RPC 完全匹配(不区分大小写)。 为了简化处理,RPC 代理不会对 RPC 通过 HTTP 客户端提供的名称执行规范化。 因此,如果客户端要求 rosco.microsoft.com,并且 ValidPorts 仅包含 Rosco,则 RPC 代理将不匹配名称,即使这两个名称可能引用同一台计算机。 此外,如果 Rosco 的 IP 地址为 66.77.88.99,并且客户端请求 66.77.88.99,但 ValidPorts 密钥仅包含 Rosco,RPC 代理将拒绝连接。 如果客户端可以按名称或 IP 地址请求通过 HTTP 服务器进行 RPC,请在 ValidPorts 密钥中插入两者。

注意

虽然 RPC 已启用 IPv6,但 RPC 代理不支持 ValidPorts 密钥中的 IPv6 地址。 如果使用 IPv6 连接 RPC 代理和通过 HTTP 服务器进行 RPC,则只能使用 DNS 名称。

 

IIS 在启动时读取已启用 ValidPorts 注册表项。 此外,HTTP 上的 RPC 会大约每 5 分钟重新读取 ValidPorts 密钥的内容。 如果 ValidPorts 条目发生更改,则更改将在 5 分钟内实现。

HTTP v1 上的 RPC: 必须使用 Internet Service Manager 来停止和重启 WEB 服务,才能实现注册表项中的新值。