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. 若要保存规则,请在“编辑声明规则”对话框中,单击“确定”。

Note

必须使用有效的 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. 若要保存规则,请在“编辑声明规则”对话框中,单击“确定”。

Note

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

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

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

Note

由于被动(基于 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. 若要保存规则,请在“编辑声明规则”对话框中,单击“确定”。

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

Description 声明规则语言语法
允许所有用户访问的默认 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 时填充标头。 声明的值可以是下列值之一:

Note

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

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

Note

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

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

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

Note

多个 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

Note

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

规则按如下方式细分:\b192.168.1。

这与从 192.168.1 开始的任何值匹配。

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

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

Note

圆括号的位置必须正确,这样才不会开始匹配 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 声明类型