深入探究AKS Workload Identity
Azure Kubernetes 服务 (AKS) 提供了一项名为 Workload Identity 的强大功能,它可以增强安全性并简化在 Kubernetes 集群中运行的应用程序的身份验证。以下是 Workload Identity 在 AKS 环境中的工作原理概述:
AKS 中的 Workload Identity 允许 Pod 无需使用集群中存储的密钥或凭据即可针对 Azure 资源进行身份验证。相反,它利用 Entra ID (Azure AD) 和 OpenID Connect (OIDC) 来提供更安全、更易于管理的身份验证机制。
AKS Workload Identity 解决的问题
Azure Workload Identity 解决了云身份验证和安全方面的几个关键问题,尤其是在 Azure Kubernetes 服务 (AKS) 环境中。以下是 Workload Identity 解决的关键问题:
- 简化的凭据管理:
通过利用 Azure Active Directory (Azure AD) 和 OpenID Connect (OIDC),Workload Identity 简化了凭据管理流程。开发人员不再需要手动管理、轮换或存储密钥,从而减少了管理开销和潜在的人为错误。
2. 增强的安全性:
工作负载身份通过使用短期令牌而非长期密钥,提供更安全的身份验证机制。这种方法最大限度地减少了凭据被盗用时潜在攻击者的可乘之机。
3. 与 Azure 服务无缝集成:
工作负载身份可以与现有的 Azure 服务无缝集成,并轻松融入 CI/CD 流水线,使其成为现代云原生架构的理想之选。
4. 可扩展性:
工作负载身份旨在在 Kubernetes 环境中常见的复杂多服务架构中有效扩展,为云原生应用程序提供更易于管理的身份和访问管理方法。
5.从旧系统过渡:
工作负载身份为组织提供了一种摆脱较旧、安全性较低的身份验证方法(例如 AKS 中现已弃用的 Pod Identity)的途径。
工作负载身份的工作原理
工作原理如下:
- 启用 OIDC 颁发者:创建或更新 AKS 集群时,需要启用 OIDC 颁发者。在使用 Azure CLI 时,可以使用 --enable-oidc-issuer 和 --enable-workload-identity 标志来完成此操作。
- 创建托管身份:您需要在 Azure 中创建一个用户分配的托管身份,您的应用程序将使用它来访问 Azure 资源。
- 配置服务帐户:在您的 Kubernetes 集群中,创建一个服务帐户,并使用托管身份的客户端 ID 对其进行注释。
- 设置 Pod 配置:将您的 Pod 配置为使用服务帐户,并添加必要的标签 azure.workload.identity/use: "true" 以启用 Workload Identity。
- 身份验证和使用:更新您的应用程序以使用支持 Workload Identity 身份验证的 Azure SDK 库。最新版本的 Azure CLI 也支持使用工作负载身份进行身份验证。
分步演示:在 AKS 中实现工作负载身份
先决条件:
- 已安装并登录 Azure CLI
- 已安装并配置 kubectl
- 现有 AKS 集群(版本 1.22 或更高版本)
步骤 1:在 AKS 集群上启用 OIDC issuer
首先,在 AKS 集群上启用 OpenID Connect (OIDC) 颁发器,以允许工作负载身份验证。
az aks update -g aks-workload-identity-rg-01 -n my-aks-cluster-01 \
--enable-oidc-issuer --enable-workload-identity
设置 OIDC issuer URL变量:
export AKS_OIDC_ISSUER="$(az aks show -g aks-workload-identity-rg-01 \-n my-aks-cluster-01 --query "oidcIssuerProfile.issuerUrl" -otsv)"
第 2 步:创建用户分配的托管身份
如果你不熟悉托管身份,请参考我的另外一篇博文:Azure 应用的托管身份与服务主体
创建用户分配的托管身份,您的工作负载将使用该身份访问 Azure 资源并导出其 CLIENT_ID
az identity create --name aks-user-assigned-ma \
--resource-group aks-workload-identity-rg-01 --location westus2export USER_ASSIGNED_CLIENT_ID="$(az identity show \
--name aks-user-assigned-ma --resource-group aks-workload-identity-rg-01 --query 'clientId' -otsv)"
步骤 3:创建 Kubernetes 服务帐号
创建一个 Kubernetes 服务帐号,并使用托管身份的客户端 ID 进行注释。创建一个名为 service-account.yaml 的文件
apiVersion: v1
kind: ServiceAccount
metadata:annotations:azure.workload.identity/client-id: "5cee0ff9-0208-4555-93b8-b37eb6f239a9" #Update with your client_idname: "workload-identity-sa"namespace: "default"
步骤 4:创建 Entra ID 联合身份凭证
创建联合身份凭证,以在 Entra ID 和 Kubernetes 服务帐户之间建立信任。
export SERVICE_ACCOUNT_NAMESPACE="default"
export SERVICE_ACCOUNT_NAME="workload-identity-sa"az identity federated-credential create --name aks-user-assigned-ma-fed-identity \
--identity-name aks-user-assigned-ma --resource-group aks-workload-identity-rg-01 \
--issuer "${AKS_OIDC_ISSUER}" --subject system:serviceaccount:"${SERVICE_ACCOUNT_NAMESPACE}":"${SERVICE_ACCOUNT_NAME}" \
--audience api://AzureADTokenExchange
步骤 5:创建具有工作负载身份的 Pod
部署一个使用已配置工作负载身份的服务帐户的 Pod。创建一个名为 azure-cli.yaml 的文件:
apiVersion: v1
kind: Pod
metadata:name: azure-cli-workload-identitynamespace: defaultlabels:azure.workload.identity/use: "true" # Required. Only pods with this label can use workload identity.
spec:serviceAccountName: workload-identity-sacontainers:- image: mcr.microsoft.com/azure-cliname: azure-clicommand: ["sleep"]args: ["3600"]
步骤 6:检查工作负载身份环境变量
设置工作负载身份并部署 Pod 后,我们可以检查自动注入到 Pod 中的环境变量。这些变量对于工作负载身份认证过程至关重要。
kubectl exec -it azure-cli-workload-identity -- /bin/bash
以下环境变量对于工作负载身份认证过程至关重要:
- AZURE_TENANT_ID:与工作负载身份关联的 Azure Active Directory 租户 ID。
- AZURE_FEDERATED_TOKEN_FILE:包含用于身份验证的联合令牌的文件路径。
- AZURE_AUTHORITY_HOST:用于身份验证的 Azure AD 授权主机 URL。
- AZURE_CLIENT_ID:与工作负载关联的托管身份的客户端 ID。
这些变量由工作负载身份系统自动注入到 Pod 中,使应用程序能够无缝地进行身份验证,而无需直接管理凭据。这些变量的存在表明已为 Pod 正确配置了工作负载身份。
步骤 7:添加角色分配并测试身份验证/授权
让我们向托管身份添加“读取者”角色分配并测试 Azure CLI 身份验证。
az role assignment create --assignee $USER_ASSIGNED_CLIENT_ID --role Reader \--scope /subscriptions/xxxx-xxxx-xxxx
让我们登录到 Pod,并使用 Azure CLI 向 Azure 进行身份验证。您可以使用 az login --federated-token 通过工作负载身份进行身份验证。
az login --federated-token "$(cat $AZURE_FEDERATED_TOKEN_FILE)" \
--service-principal -u $AZURE_CLIENT_ID -t $AZURE_TENANT_ID
总结
Azure Kubernetes服务(AKS)的WorkloadIdentity功能通过利用Azure Active Directory(Azure AD)和OpenID Connect(OIDC),提供了一种更安全、更简化的身份验证机制,允许Pod无需存储密钥或凭据即可访问Azure资源。该功能解决了凭据管理复杂、安全性不足、与Azure服务集成困难、可扩展性差以及从旧系统过渡的问题。实现WorkloadIdentity的步骤包括启用OIDC颁发者、创建托管身份、配置Kubernetes服务账户、设置Pod配置、创建EntraID联合身份凭证、部署Pod并检查环境变量,最后进行角色分配和身份验证测试。这一过程显著提升了AKS环境中的安全性和管理效率。