灵活联合标识凭据(预览版)

灵活联合标识凭据是 Microsoft Entra Workload ID 的高级功能,可增强现有的联合标识凭据模型。 本文会介绍这些凭据的工作原理、优点和当前限制。

灵活联合标识凭据允许使用受限的表达式语言来匹配传入的 subject 声明,且允许包含自定义声明,从而减少管理开销,解决工作负载联合身份验证中的缩放限制。 如果希望利用 Microsoft Entra 简化外部工作负载的身份验证,本指南会提供使用此强大功能所需的见解和步骤。

为何使用灵活联合标识凭据?

在将联合标识凭据中定义的 subjectissueraudience 与发送到 Microsoft Entra 的令牌中包含的 subjectissueraudience 进行比较时,工作负载联合身份验证中联合标识凭据的当前行为需要显式匹配。 当与给定应用程序或用户分配的托管标识的当前 20 个联合身份凭据限制相结合时,很快就会达到缩放限制。

灵活联合标识凭据允许在与传入的 subject 声明匹配时,使用受限的表达式语言来扩展现有的联合标识凭据模型。 其还允许在联合标识凭据中包含某些允许的自定义声明,将联合标识凭据授权模型扩展到 subjectissueraudience 声明之外。

在尝试使用 Microsoft Entra 对外部工作负载进行身份验证时,灵活联合标识凭据有助于减少管理开销,解决工作负载联合身份验证实现中的缩放限制。

灵活联合标识凭据是如何工作的?

灵活联合标识凭据不会更改联合标识凭据提供的基线功能。 这些信任关系仍用于指示应用程序应信任来自外部 IdP 的哪个令牌。 这些关系通过启用以前需要多个联合标识凭据的方案来扩展联合标识凭据的功能,而不是在单个灵活联合标识凭据下进行管理。 一些示例包括:

  • 具有多种工作流的 GitHub 存储库,每个工作流在不同的分支上运行(或跨分支使用)。 以前,每个可以运行工作流的分支都需要唯一的联合标识凭据。 使用灵活联合标识凭据,即可在单个联合标识凭据下管理此方案。
  • Terraform Cloud run_phases 计划,每个计划都需要唯一的联合标识凭据。 使用灵活联合标识凭据,即可在单个灵活联合标识凭据下管理此计划。
  • 可重用的 GitHub Actions 工作流,可在其中对 GitHub 的自定义 job_workflow_ref 声明使用通配符。

注意

目前提供了灵活联合标识凭据支持,以便与 GitHub、GitLab 和 Terraform Cloud 颁发的令牌进行匹配。 此支持仅适用于当前在应用程序对象上配置的联合标识凭据。 只能通过 Microsoft Graph 或 Azure 门户创建和管理灵活联合标识凭据。

灵活联合标识凭据语言结构

灵活联合标识凭据表达式由声明查找、运算符和比较数三个部分组成。 有关每个部分的分解,请参阅下表:

名称 步骤 示例
声明查找 声明查找必须遵循以下模式:claims[‘<claimName>’] claims['sub']
操作员 运算符部分必须只是运算符名称,由单个空格将之与声明查找和比较数分隔 matches
Comparand 比较数包含要与查找中指定的声明进行比较的内容,且必须包含在单引号中 'repo:contoso/contoso-repo:ref:refs/heads/*'

组合起来后,灵活联合标识凭据表达式类似于以下 JSON 对象:

"claims['sub'] matches 'repo:contoso/contoso-repo:ref:refs/heads/*'."

通过 Microsoft Graph 设置联合标识凭据

为了适应灵活联合标识凭据功能,federatedIdentityCredentials 资源正使用新属性 claimsMatchingExpression 进行扩展。 除此之外,该 subject 属性现在也可为 Null。 属性 claimsMatchingExpressionsubject 互相排斥,因此不能在联合标识凭据中定义这两者。

  • audiences:必须在外部令牌中显示的受众。 此为必填字段,应设置为 api://AzureADTokenExchange Microsoft Entra ID。 它表示 Microsoft 标识平台应接受传入令牌中的 aud 声明。 此值表示外部标识提供者中的 Microsoft Entra ID,且在标识提供者中没有固定值。你可能需要在 IdP 中创建新应用程序注册,以用作此令牌的受众。
  • issuer:外部标识提供者的 URL。 必须与正交换的外部令牌的颁发者声明匹配。
  • subject:外部标识提供者中外部软件工作负载的标识符。 与受众值类似,该值没有固定格式,因为每个 IdP 都使用自己的格式,格式有时是 GUID,有时是冒号分隔的标识符,有时是任意字符串。 此处的值必须与提供给 Microsoft Entra ID 的令牌中的 sub 声明匹配。 如果 subject 已定义,claimsMatchingExpression 必须设置为 Null。
  • name:用于标识凭据的唯一字符串。 此属性是备用键,其值可用于通过 GETUPSERT 操作引用联合标识凭据。
  • claimsMatchingExpression:包含 valuelanguageVersion 这两个属性的新复杂类型。 其值用于定义表达式,languageVersion 用于定义所使用的灵活联合标识凭据表达式语言 (FFL) 的版本。 languageVersion 应始终设置为 1。 如果 claimsMatchingExpression 已定义,subject 必须设置为 Null。

灵活联合标识凭据表达式语言功能

灵活联合标识凭据目前支持在启用的颁发者中使用几个运算符。 在灵活联合标识凭据表达式语言中,单引号被解释为转义字符。

运算符 说明 示例
matches 支持对指定声明使用单字符(表示为 ?)和多字符(表示 *)通配符匹配 “claims[‘sub’] matches ‘repo:contoso/contoso-repo:ref:refs/heads/*’”
“claims[‘sub’] matches ‘repo:contoso/contoso-repo-*:ref:refs/heads/????’”
eq 用于显式匹配指定的声明 “claims[‘sub’] eq ‘repo:contoso/contoso-repo:ref:refs/heads/main’”
and 用于针对多个声明组合表达式的布尔运算符 “claims[‘sub’] eq ‘repo:contoso/contoso-repo:ref:refs/heads/main’ and claims[‘job_workflow_ref’] matches ‘foo-org/bar-repo /.github/workflows/*@refs/heads/main’”

按平台列出的颁发者 URL、支持的声明和运算符

根据所使用的平台,必须实现不同的颁发者 URL、声明和运算符。 使用以下选项卡选择所选的平台。

支持的颁发者 URL:https://token.actions.githubusercontent.com

每个声明支持的声明和运算符:

  • 声明 sub 支持运算符 eqmatches
  • 声明 job_workflow_ref 支持运算符 eqmatches

Azure CLI、Azure PowerShell 和 Terraform 提供程序

Azure CLI、Azure PowerShell 或 Terraform 提供程序中尚不存在显式的灵活联合标识凭据支持。 如果尝试使用其中任何一种工具配置灵活联合标识凭据,则会看到错误。 此外,如果通过 Microsoft Graph 或 Azure 门户 配置灵活联合标识凭据,并尝试使用其中任何一种工具读取该灵活联合标识凭据,则会看到错误。

可以使用 Azure CLI az rest 方法发出 REST API 请求来创建和管理灵活联合标识凭据。

az rest --method post \
    --url https://microsoftgraph.chinacloudapi.cn/beta/applications/{objectId}/federatedIdentityCredentials
    --body "{'name': 'FlexFic1', 'issuer': 'https://token.actions.githubusercontent.com', 'audiences': ['api://AzureADTokenExchange'], 'claimsMatchingExpression': {'value': 'claims[\'sub\'] matches \'repo:contoso/contoso-org:ref:refs/heads/*\'', 'languageVersion': 1}}"