将 Microsoft Entra 工作负载 ID 与 Azure Kubernetes 服务 (AKS) 配合使用

部署在 AKS 群集上的工作负荷需要Microsoft Entra 应用程序凭据或托管标识才能访问 Microsoft Entra 保护的资源,例如 Azure Key Vault 和 Microsoft Graph。 Microsoft Entra Workload ID 与 Kubernetes 原生功能集成,来联合外部身份验证提供者,使你能够将工作负载身份分配给工作负载,用于身份验证和访问其他服务和资源。

Microsoft Entra 工作负荷 ID 使用 服务帐户令牌卷投影 (或服务 帐户),使 Pod 能够使用 Kubernetes 标识。 颁发 Kubernetes 令牌, OpenID Connect (OIDC) 联合身份验证 使 Kubernetes 应用程序能够基于带批注的服务帐户通过 Microsoft Entra ID 安全地访问 Azure 资源。

可以将 Microsoft Entra 工作负荷 ID 与 Azure 标识客户端库Microsoft身份验证库 (MSAL) 集合一起使用,以及 应用程序注册,以便无缝地进行身份验证和访问 Azure 云资源。

注意

可以使用服务连接器自动配置某些步骤。 有关详细信息,请参阅 什么是服务连接器?

先决条件

  • AKS 支持版本 1.22 及更高版本的 Microsoft Entra 工作负载 ID。
  • Azure CLI 版本 2.47.0 或更高版本。 可通过运行 az --version 查找版本,运行 az upgrade 升级版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

限制

Azure 标识客户端库

在 Azure 标识客户端库中,选择以下方法之一:

  • 使用 DefaultAzureCredential,它会尝试使用 WorkloadIdentityCredential
  • 创建包含 ChainedTokenCredentialWorkloadIdentityCredential 实例。
  • 直接使用 WorkloadIdentityCredential

下表提供了每个语言生态系统的客户端库所需的 最低 包版本:

生态系统 图书馆 最低版本
.NET Azure.Identity 1.9.0
C++ azure-identity-cpp 1.6.0
Go azidentity 1.3.0
Java azure-identity 1.9.0
Node.js @azure/identity 3.2.0
Python azure-identity 1.13.0

Azure 标识客户端库代码示例

以下代码示例使用 DefaultAzureCredential. 此凭据类型使用负载身份变更 webhook 注入的环境变量,与 Azure Key Vault 进行身份验证。 若要查看使用其他方法之一的示例,请参阅 特定于生态系统的客户端库

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;

string keyVaultUrl = Environment.GetEnvironmentVariable("<key-vault-url>");
string secretName = Environment.GetEnvironmentVariable("<secret-name>");

var client = new SecretClient(
    new Uri(keyVaultUrl),
    new DefaultAzureCredential());

KeyVaultSecret secret = await client.GetSecretAsync(secretName);

Microsoft 身份验证库 (MSAL)

以下客户端库是所需的 最低 版本:

生态系统 图书馆 图像 示例 具有 Windows
.NET 适用于 .Net 的 Microsoft 身份验证库 ghcr.io/azure/azure-workload-identity/msal-net:latest 链接
Go 适用于 Go 的 Microsoft 身份验证库 ghcr.io/azure/azure-workload-identity/msal-go:latest 链接
Java Microsoft身份验证库适用于Java ghcr.io/azure/azure-workload-identity/msal-java:latest 链接
JavaScript 用于 JavaScript 的 Microsoft 身份验证库 ghcr.io/azure/azure-workload-identity/msal-node:latest 链接
Python Microsoft身份验证库-适用于Python ghcr.io/azure/azure-workload-identity/msal-python:latest 链接

工作原理

在此安全模型中,AKS 群集充当令牌颁发者。 Microsoft Entra ID 会使用 OIDC 发现公共签名密钥,并在用它交换 Microsoft Entra 令牌前验证服务帐户令牌的真实性。 工作负荷可以使用 Azure 标识客户端库或 MSAL,将投影到其卷的服务帐户令牌交换为 Microsoft Entra 令牌。

AKS Microsoft Entra 工作负荷 ID 安全模型图。

下表描述了 Microsoft Entra 工作负载 ID 所需的 OIDC 颁发者终结点:

终结点 说明
{IssuerURL}/.well-known/openid-configuration 也称为 OIDC 发现文档。 其中包含有关颁发者配置的元数据。
{IssuerURL}/openid/v1/jwks 这包含 Microsoft Entra 用于验证服务帐户令牌真实性的公共签名密钥。

下图总结了使用 OIDC 的身份验证序列:

AKS Microsoft Entra Workload ID OIDC 身份验证序列的示意图。

Webhook 证书自动轮换

与其他 Webhook 加载项类似,群集证书自动轮换操作自动更新证书。

服务帐户标签和批注

Microsoft Entra 工作负载 ID 支持与服务帐户相关的以下映射:

  • 一对一,其中服务帐户引用 Microsoft Entra 对象。
  • 多个服务帐户引用同一 Microsoft Entra 对象的多对一映射
  • 一对多,在这种情况下,服务帐户通过更改客户端 ID 注释来引用多个 Microsoft Entra 对象。 有关详细信息,请参阅如何将多个标识与 Kubernetes 服务帐户联合

注意

如果更新服务帐户批注,则必须重启 Pod 才能使更改生效。

如果你已使用 Microsoft Entra Pod 托管标识,则可将服务帐户视为 Azure 安全主体,只不过服务帐户是核心 Kubernetes API 的一部分,而不是自定义资源定义 (CRD)。 以下部分介绍可用标签和注释的列表,可用于在交换服务帐户令牌以获取 Microsoft Entra 访问令牌时配置行为。

服务帐户批注

所有注释都是可选的。 如果未指定批注,则使用默认值。

注释 说明 默认
azure.workload.identity/client-id 表示 Microsoft Entra 应用程序
Azure AD 应用程序客户端 ID。
azure.workload.identity/tenant-id 表示在其中注册了 Azure AD 应用程序的
Microsoft Entra 应用程序已注册。
AZURE_TENANT_ID 环境变量,从
azure-wi-webhook-config ConfigMap 提取。
azure.workload.identity/service-account-token-expiration 表示投影的服务帐户令牌的 expirationSeconds 字段。 这是一个可选字段,可以配置它以防止在服务帐户令牌刷新期间因出错而导致停机。 Kubernetes 服务帐户令牌过期时间与 Microsoft Entra 令牌无关。 Microsoft Entra 令牌将在颁发后的 24 小时内过期。 3600
支持的范围为 3600-86400。

Pod 标签

注意

对于使用 Microsoft Entra 工作负荷身份的应用程序,需要将标签 azure.workload.identity/use: "true" 添加到 AKS 的 Pod 规范中,以便将工作负荷身份移动到 “Fail Close” 方案,为需要使用工作负荷身份的 Pod 提供一致且可靠的行为。 否则,Pod 在重启后会失败。

标签 说明 建议的值 必须
azure.workload.identity/use Pod 模板规格中需要使用此标签。只有带有此标签的 Pod 才会由 azure-workload-identity 突变准入 Webhook 进行突变,以注入 Azure 特定环境变量和投影的服务帐户令牌卷。

Pod 批注

所有注释都是可选的。 如果未指定批注,则使用默认值。

注释 说明 默认
azure.workload.identity/service-account-token-expiration 有关详细信息 ,请参阅服务帐户注释Pod 注释优先于服务帐户注释 3600
支持的范围为 3600-86400。
azure.workload.identity/skip-containers 表示要跳过添加已投影服务帐户令牌卷步骤的容器的分号分隔列表。 例如,container1;container2 默认情况下,如果 Pod 带有 azure.workload.identity/use: true 标签,则投影的服务帐户令牌卷将添加到所有容器。
azure.workload.identity/inject-proxy-sidecar 将代理 init 容器和代理挎斗注入 Pod。 代理挎斗用于拦截对 IMDS 的令牌请求,并代表具有联合标识凭据的用户获取 Microsoft Entra 令牌。
azure.workload.identity/proxy-sidecar-port 表示代理挎斗的端口。 8,000

迁移到 Microsoft Entra 工作负荷 ID

可以通过以下两种方式之一配置已运行 Pod 托管标识的群集,以使用 Microsoft Entra 工作负荷 ID:

  • 使用为 Pod 托管标识实现的相同配置。 你可以在命名空间中使用标识批注服务帐户,以启用 Microsoft Entra Workload ID 并将批注注入 Pod。
  • 重写应用程序以使用最新版本的 Azure 标识客户端库。

为了帮助简化和加快迁移过程,我们开发了一个迁移sidecar,用于将应用程序创建的实例元数据服务(IMDS)事务转换为OIDC。 迁移辅助程序并不是一种长期解决方案,而是一种能够快速启动和运行 Microsoft Entra 负载 ID 的方法。 在应用程序中运行迁移挎斗会将应用程序 IMDS 事务中转到 OIDC。 另一种方法是升级到支持 OIDC 身份验证的受支持 Azure 标识客户端库版本。

下表汇总了 AKS 群集的迁移或部署建议:

方案 说明
新的或现有群集部署运行受支持版本的 Azure 标识客户端库 无需执行迁移步骤。
示例部署资源: 在新群集上部署和配置 Microsoft Entra 工作负荷 ID
新的或现有群集部署运行不受支持版本的 Azure 标识客户端库 更新容器映像以使用受支持版本的 Azure 标识 SDK,或使用迁移挎斗

后续步骤