AD FS 2.0 中的客户端访问控制策略

借助 Active Directory 联合身份验证服务 2.0 中的客户端访问策略,你可以限制或授予用户对资源的访问权限。 本文档介绍如何在 AD FS 2.0 中启用客户端访问策略,以及如何配置最常见的方案。

在 AD FS 2.0 中启用客户端访问策略

若要启用客户端访问策略,请执行以下步骤。

步骤 1:在 AD FS 服务器上安装适用于 AD FS 2.0 的更新汇总 2 程序包

下载适用于 Active Directory 联合身份验证服务 (AD FS) 2.0 的更新汇总 2 程序包,并将其安装在所有联合服务器和联合服务器代理上。

步骤 2:向 Active Directory 声明提供方信任添加五个声明规则

在所有 AD FS 服务器和代理上安装更新汇总 2 后,使用以下过程添加一组声明规则,使新的声明类型可供策略引擎使用。

为此,你将使用以下过程为每个新的请求上下文声明类型添加五个接受转换规则。

在 Active Directory 声明提供方信任上,创建新的接受转换规则,以传递每个新的请求上下文声明类型。

若要为这五种上下文声明类型中的每个类型在 Active Directory 声明提供方信任中添加声明规则,请执行以下步骤:

  1. 单击“开始”,依次指向“程序”、“管理工具”,然后单击“AD FS 2.0 管理”。

  2. 在控制台树的“AD FS 2.0\信任关系”下,单击“声明提供方信任”,右键单击“Active Directory”,然后单击“编辑声明规则”。

  3. 在“编辑声明规则”对话框中,选择“接受转换规则”选项卡,然后单击“添加规则”以启动规则向导。

  4. 在“选择规则模板”页上的“声明规则模板”下,从列表中选择“传递或筛选传入声明”,然后单击“下一步”。

  5. 在“配置规则”页上的“声明规则名称”下,键入此规则的显示名称;在“传入声明类型”中,键入以下声明类型 URL,然后选择“传递所有声明值”。
    https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-forwarded-client-ip

  6. 若要验证规则,请在列表中选择该规则,并单击“编辑规则”,然后单击“查看规则语言”。 声明规则语言应如下所示:c:[Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-forwarded-client-ip"] => issue(claim = c);

  7. 单击“完成”。

  8. 在“编辑声明规则”对话框中,单击“确定”保存规则。

  9. 重复步骤 2 到 6,为下面显示的其余四种声明类型各创建一个额外的声明规则,直到创建完所有五个规则。

    https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-client-application

    https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-client-user-agent

    https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-proxy

    https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-endpoint-absolute-path

步骤 3:更新 Microsoft Office 365 标识平台信赖方信任

选择以下示例方案之一,在 Microsoft Office 365 标识平台信赖方信任上配置最符合组织需求的声明规则。

AD FS 2.0 的客户端访问策略方案

以下部分将介绍 AD FS 2.0 存在的方案

方案 1:阻止对 Office 365 的所有外部访问

使用此客户端访问策略方案,可以从所有内部客户端进行访问,并基于外部客户端的 IP 地址阻止所有外部客户端。 该规则集基于默认的颁发授权规则“允许所有用户访问”。 可以使用以下过程将颁发授权规则添加到 Office 365 信赖方信任。

创建规则以阻止对 Office 365 的所有外部访问

  1. 单击“开始”,依次指向“程序”、“管理工具”,然后单击“AD FS 2.0 管理”。
  2. 在控制台树的“AD FS 2.0\信任关系”下,单击“信赖方信任”,右键单击“Microsoft Office 365 标识平台信任”,然后单击“编辑声明规则”。
  3. 在“编辑声明规则”对话框中,选择“颁发授权规则”选项卡,然后单击“添加规则”以启动声明规则向导。
  4. 在“选择规则模板”页上的“声明规则模板”下,选择“使用自定义规则发送声明”,然后单击“下一步”。
  5. 在“配置规则”页上的“声明规则名称”下,键入此规则的显示名称。 在“自定义规则”下,键入或粘贴以下声明规则语言语法:exists([Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-proxy"]) && NOT exists([Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-forwarded-client-ip", Value=~"customer-provided public ip address regex"]) => issue(Type = "https://schemas.microsoft.com/authorization/claims/deny", Value = "true");
  6. 单击“完成”。 验证新规则是否立即出现在“颁发授权规则”列表中“允许所有用户访问”规则的下方。
  7. 若要保存规则,请在“编辑声明规则”对话框中,单击“确定”。

注意

必须将上述“公共 IP 地址正则表达式”的值替换为有效的 IP 表达式;请参阅“生成 IP 地址范围表达式”了解详细信息。

方案 2:阻止对 Office 365 的所有外部访问(Exchange ActiveSync 除外)

以下示例允许从包括 Outlook 在内的内部客户端访问所有 Office 365 应用程序,包括 Exchange Online。 它按照客户端 IP 地址指示,阻止从位于公司网络外部的客户端进行访问,但 Exchange ActiveSync 客户端(如智能手机)除外。 该规则集基于默认的颁发授权规则“允许所有用户访问”。 按照以下步骤,使用声明规则向导将颁发授权规则添加到 Office 365 信赖方信任:

创建规则以阻止对 Office 365 的所有外部访问

  1. 单击“开始”,依次指向“程序”、“管理工具”,然后单击“AD FS 2.0 管理”。
  2. 在控制台树的“AD FS 2.0\信任关系”下,单击“信赖方信任”,右键单击“Microsoft Office 365 标识平台信任”,然后单击“编辑声明规则”。
  3. 在“编辑声明规则”对话框中,选择“颁发授权规则”选项卡,然后单击“添加规则”以启动声明规则向导。
  4. 在“选择规则模板”页上的“声明规则模板”下,选择“使用自定义规则发送声明”,然后单击“下一步”。
  5. 在“配置规则”页上的“声明规则名称”下,键入此规则的显示名称。 在“自定义规则”下,键入或粘贴以下声明规则语言语法:exists([Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-proxy"]) && NOT exists([Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-client-application", Value=="Microsoft.Exchange.Autodiscover"]) && NOT exists([Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-client-application", Value=="Microsoft.Exchange.ActiveSync"]) && NOT exists([Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-forwarded-client-ip", Value=~"customer-provided public ip address regex"]) => issue(Type = "https://schemas.microsoft.com/authorization/claims/deny", Value = "true");
  6. 单击“完成”。 验证新规则是否立即出现在“颁发授权规则”列表中“允许所有用户访问”规则的下方。
  7. 若要保存规则,请在“编辑声明规则”对话框中,单击“确定”。

注意

必须将上述“公共 IP 地址正则表达式”的值替换为有效的 IP 表达式;请参阅“生成 IP 地址范围表达式”了解详细信息。

方案 3:阻止对 Office 365 的所有外部访问(基于浏览器的应用程序除外)

该规则集基于默认的颁发授权规则“允许所有用户访问”。 按照以下步骤,使用声明规则向导将颁发授权规则添加到 Microsoft Office 365 标识平台信赖方信任:

注意

由于被动(基于 Web)请求的客户端访问策略标头存在限制,因此第三方代理不支持此方案。

创建规则以阻止对 Office 365 的所有外部访问(基于浏览器的应用程序除外)

  1. 单击“开始”,依次指向“程序”、“管理工具”,然后单击“AD FS 2.0 管理”。
  2. 在控制台树的“AD FS 2.0\信任关系”下,单击“信赖方信任”,右键单击“Microsoft Office 365 标识平台信任”,然后单击“编辑声明规则”。
  3. 在“编辑声明规则”对话框中,选择“颁发授权规则”选项卡,然后单击“添加规则”以启动声明规则向导。
  4. 在“选择规则模板”页上的“声明规则模板”下,选择“使用自定义规则发送声明”,然后单击“下一步”。
  5. 在“配置规则”页上的“声明规则名称”下,键入此规则的显示名称。 在“自定义规则”下,键入或粘贴以下声明规则语言语法:exists([Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-proxy"]) && NOT exists([Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-forwarded-client-ip", Value=~"customer-provided public ip address regex"]) && NOT exists([Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-endpoint-absolute-path", Value == "/adfs/ls/"]) => issue(Type = "https://schemas.microsoft.com/authorization/claims/deny", Value = "true");
  6. 单击“完成”。 验证新规则是否立即出现在“颁发授权规则”列表中“允许所有用户访问”规则的下方。
  7. 若要保存规则,请在“编辑声明规则”对话框中,单击“确定”。

方案 4:阻止指定 Active Directory 组对 Office 365 的所有外部访问

以下示例基于 IP 地址启用从内部客户端进行的访问。 它阻止从位于公司网络外部、具有外部客户端 IP 地址的客户端进行访问,但指定的 Active Directory 组中的个人除外。该规则集基于默认的颁发授权规则“允许所有用户访问”。 按照以下步骤,使用声明规则向导将颁发授权规则添加到 Microsoft Office 365 标识平台信赖方信任:

创建规则以阻止指定 Active Directory 组对 Office 365 的所有外部访问

  1. 单击“开始”,依次指向“程序”、“管理工具”,然后单击“AD FS 2.0 管理”。
  2. 在控制台树的“AD FS 2.0\信任关系”下,单击“信赖方信任”,右键单击“Microsoft Office 365 标识平台信任”,然后单击“编辑声明规则”。
  3. 在“编辑声明规则”对话框中,选择“颁发授权规则”选项卡,然后单击“添加规则”以启动声明规则向导。
  4. 在“选择规则模板”页上的“声明规则模板”下,选择“使用自定义规则发送声明”,然后单击“下一步”。
  5. 在“配置规则”页上的“声明规则名称”下,键入此规则的显示名称。 在“自定义规则”下,键入或粘贴以下声明规则语言语法:exists([Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-proxy"]) && exists([Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid", Value =~ "Group SID value of allowed AD group"]) && NOT exists([Type == "https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-forwarded-client-ip", Value=~"customer-provided public ip address regex"]) => issue(Type = "https://schemas.microsoft.com/authorization/claims/deny", Value = "true");
  6. 单击“完成”。 验证新规则是否立即出现在“颁发授权规则”列表中“允许所有用户访问”规则的下方。
  7. 若要保存规则,请在“编辑声明规则”对话框中,单击“确定”。

上述方案中使用的声明规则语言语法的说明

说明 声明规则语言语法
允许所有用户访问的默认 AD FS 规则。 此规则应已存在于 Microsoft Office 365 标识平台信赖方信任颁发授权规则列表中。 => issue(Type = "<https://schemas.microsoft.com/authorization/claims/permit>", Value = "true");
将此子句添加到新的自定义规则可指定请求来自联合服务器代理(即,它具有 x-ms-proxy 标头)
建议所有规则都包括此子句。 exists([Type == "<https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-proxy>"])
用于确定请求来自其 IP 在定义的可接受范围内的客户端。 NOT exists([Type == "<https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-forwarded-client-ip>", Value=~"customer-provided public ip address regex"])
此子句用于指定如果正在访问的应用程序不是 Microsoft.Exchange.ActiveSync,应拒绝请求。 NOT exists([Type == "<https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-client-application>", Value=="Microsoft.Exchange.ActiveSync"])
此规则用于确定调用是否通过 Web 浏览器,并且不会被拒绝。 NOT exists([Type == "<https://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-endpoint-absolute-path>", Value == "/adfs/ls/"])
此规则指出,应拒绝特定 Active Directory 组中的唯一用户(基于 SID 值)。 在此语句中添加 NOT 意味着将允许一组用户,而不考虑其位置。 exists([Type == "<https://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid>", Value =~ "{Group SID value of allowed AD group}"])
这是在满足上述所有条件时发出拒绝的必需子句。 => issue(Type = "<https://schemas.microsoft.com/authorization/claims/deny>", Value = "true");

生成 IP 地址范围表达式

x-ms-forwarded-client-ip 声明是从当前仅由 Exchange Online 设置的 HTTP 标头填充的,在将身份验证请求传递给 AD FS 时填充标头。 声明的值可以是下列值之一:

注意

Exchange Online 目前仅支持 IPV4,不支持 IPV6 地址。

单个 IP 地址:直接连接到 Exchange Online 的客户端的 IP 地址

注意

公司网络上客户端的 IP 地址将显示为组织的出站代理或网关的外部接口 IP 地址。

通过 VPN 或 Microsoft DirectAccess (DA) 连接到公司网络的客户端可能会显示为内部公司客户端或外部客户端,具体取决于 VPN 或 DA 的配置。

一个或多个 IP 地址:当 Exchange Online 无法确定连接的客户端的 IP 地址时,它将基于 x-forwarded-for 标头的值进行设置,这是一个非标准标头,可以包含在基于 HTTP 的请求中,并且受市场上许多客户端、负载均衡器和代理的支持。

注意

多个 IP 地址(指示客户端 IP 地址和传递请求的每个代理的地址)将用逗号分隔。

与 Exchange Online 基础结构相关的 IP 地址不会显示在列表中。

“正则表达式”

必须匹配 IP 地址的范围时,有必要构造正则表达式来执行比较。 在接下来的一系列步骤中,我们将提供有关如何构造匹配以下地址范围的此类表达式的示例(请注意,必须更改这些示例以匹配公共 IP 范围):

  • 192.168.1.1 - 192.168.1.25
  • 10.0.0.1 - 10.0.0.14

首先,能够匹配单个 IP 地址的基本模式如下所示:\b###.###.###.###\b

此外,我们还可以将两个不同的 IP 地址与 OR 表达式匹配,如下所示:\b###.###.###.###\b|\b###.###.###.###\b

因此,仅匹配两个地址的示例(例如 192.168.1.1 或 10.0.0.1)将为:\b192.168.1.1\b|\b10.0.0.1\b

这样你就可以通过这一方法输入任意数量的地址。 如果需要允许一个地址范围,例如 192.168.1.1 - 192.168.1.25,则必须逐个字符完成匹配:\b192.168.1.([1-9]|1[0-9]|2[0-5])\b

注意

IP 地址被视为字符串而不是数字。

该规则按如下所示进行细分:\b192.168.1。

这与以 192.168.1 开头的任何值匹配。

以下内容与最后一位小数点之后的地址部分所需的范围匹配:

  • ([1-9] 匹配以 1-9 结尾的地址
  • |1[0-9] 匹配以 10-19 结尾的地址
  • |2[0-5]) 匹配以 20-25 结尾的地址

注意

圆括号的位置必须正确,这样才不会开始匹配 IP 地址的其他部分。

匹配 192 块后,就可以为 10 块编写类似的表达式:\b10.0.0.([1-9]|1[0-4])\b

然后将它们放在一起,以下表达式应能匹配“192.168.1.1~25”和“10.0.0.1~14”的所有地址:\b192.168.1.([1-9]|1[0-9]|2[0-5])\b|\b10.0.0.([1-9]|1[0-4])\b

测试表达式

正则表达式可能会变得非常棘手,因此强烈建议使用正则表达式验证工具。 如果通过 Internet 搜索“联机正则表达式生成器”,将找到一些不错的联机实用工具,这样就可以针对示例数据尝试使用这些表达式。

测试表达式时,必须了解需要匹配的内容。 Exchange Online 系统可能会发送许多 IP 地址,用逗号分隔。 上面提供的表达式将适用于此。 但是,测试正则表达式时,请务必考虑这一点。 例如,可以使用以下示例输入来验证上面的示例:

192.168.1.1, 192.168.1.2, 192.169.1.1. 192.168.12.1, 192.168.1.10, 192.168.1.25, 192.168.1.26, 192.168.1.30, 1192.168.1.20

10.0.0.1, 10.0.0.5, 10.0.0.10, 10.0.1.0, 10.0.1.1, 110.0.0.1, 10.0.0.14, 10.0.0.15, 10.0.0.10, 10,0.0.1

验证部署

安全审核日志

若要验证新请求上下文声明是否正在发送并且可供 AD FS 声明处理管道使用,请在 AD FS 服务器上启用审核日志记录。 然后发送一些身份验证请求,并检查标准安全审核日志条目中的声明值。

若要启用将审核事件记录到 AD FS 服务器上的安全日志,请按照“为 AD FS 2.0 配置审核”中的步骤操作。

事件日志记录

默认情况下,失败的请求将记录到“应用程序和服务日志 \ AD FS 2.0 \ 管理员”下的应用程序事件日志。有关 AD FS 事件日志记录的详细信息,请参阅设置 AD FS 2.0 事件日志记录

配置详细 AD FS 跟踪日志

AD FS 跟踪事件将记录到 AD FS 2.0 调试日志。 若要启用跟踪,请参阅为 AD FS 2.0 配置调试跟踪

启用跟踪后,通过以下命令行语法启用详细日志记录级别:wevtutil.exe sl “AD FS 2.0 Tracing/Debug” /l:5

有关新声明类型的详细信息,请参阅 AD FS 声明类型