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

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

灵活的联合身份凭据允许使用受限的表达式语言来匹配传入的 subject 声明,并支持包含自定义声明,从而有助于降低管理开销,并应对工作负载身份联合中的可伸缩性限制。 如果希望利用 Microsoft Entra 简化外部工作负载的身份验证,本指南会提供使用此强大功能所需的见解和步骤。

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

在将联合标识凭据中定义的 subject、issuer 和 audience 与发送到 Microsoft Entra 的令牌中包含的 subject、issuer 和 audience 进行比较时,工作负载联合身份验证中联合标识凭据的当前行为需要显式匹配。 再考虑到特定应用程序或用户分配的托管标识当前最多只能有 20 个联合身份凭据这一限制,就很容易触及扩展限制。

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

在尝试使用 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/*'

组合在一起,GitHub灵活的联合标识凭据表达式的示例类似于以下 JSON 对象。 GitHub表达式必须匹配sub且至少有一个不可变声明:

"claims['sub'] matches 'repo:contoso/contoso-repo:ref:refs/heads/*' and claims['repository_id'] eq '456789'"

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

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

  • 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:用于标识凭据的唯一字符串。 此属性是备用键,其值可用于通过 GET 和 UPSERT 操作引用联合标识凭据。
  • claimsMatchingExpression:包含 value 和 languageVersion 这两个属性的新复杂类型。 其值用于定义表达式,languageVersion 用于定义所使用的灵活联合标识凭据表达式语言 (FFL) 的版本。 languageVersion 应始终设置为 1。 如果 claimsMatchingExpression 已定义,subject 必须设置为 Null。

灵活的联合身份凭据表达式语言功能

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

操作员 描述 示例
matches 支持对指定声明使用单字符(表示为 ?)和多字符(表示为 *)通配符进行匹配 • "claims['sub'] matches 'repo:contoso/contoso-repo:ref:refs/heads/*' and claims['repository_id'] eq '456789'"
• "claims['sub'] matches 'repo:contoso/contoso-repo-*:ref:refs/heads/????' and claims['repository_owner_id'] eq '123456'"
eq 用于显式地与指定声明进行匹配 • "claims['sub'] eq 'repo:contoso/contoso-repo:ref:refs/heads/main' and claims['repository_id'] eq '456789'"
and 用于组合针对多个声明的表达式的布尔运算符 • "claims['sub'] eq 'repo:contoso/contoso-repo:ref:refs/heads/main' and claims['repository_id'] eq '456789' and claims['job_workflow_ref'] matches 'foo-org/bar-repo/.github/workflows/*@refs/heads/main'"

按平台列出的签发者 URL、支持的声明和操作符

根据您使用的平台,需要使用不同的签发方 URL、声明和操作符。 使用以下选项卡选择所选的平台。

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

对于 GitHub,灵活的联合身份凭据必须与 sub 声明以及以下一个或两个不可变声明相匹配:

  • repository_id 标识工作流运行位置的存储库。
  • repository_owner_id 标识存储库所有者。

无论 sub 使用的是基于名称的、自定义的还是不可变的格式,这些声明都是必需的。 用于 repository_id 将凭据绑定到存储库。 此外,当存储库必须与特定所有者一起保留时匹配 repository_owner_id 。

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

  • 声明 sub 支持运算符 eq 和 matches。
  • 声明 job_workflow_ref 支持运算符 eq 和 matches。
  • 声明 repository_id 支持运算符 eq。
  • 声明 repository_owner_id 支持运算符 eq。

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-repo:ref:refs/heads/*\' and claims[\'repository_id\'] eq \'456789\'', 'languageVersion': 1}}"