深入探究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 解决的关键问题:

  1. 简化的凭据管理:

通过利用 Azure Active Directory (Azure AD) 和 OpenID Connect (OIDC),Workload Identity 简化了凭据管理流程。开发人员不再需要手动管理、轮换或存储密钥,从而减少了管理开销和潜在的人为错误。

  1. 增强的安全性:

工作负载身份通过使用短期令牌而非长期密钥,提供更安全的身份验证机制。这种方法最大限度地减少了凭据被盗用时潜在攻击者的可乘之机。

  1. 与 Azure 服务无缝集成:

工作负载身份可以与现有的 Azure 服务无缝集成,并轻松融入 CI/CD 流水线,使其成为现代云原生架构的理想之选。

  1. 可扩展性:

工作负载身份旨在在 Kubernetes 环境中常见的复杂多服务架构中有效扩展,为云原生应用程序提供更易于管理的身份和访问管理方法。

5.从旧系统过渡:

工作负载身份为组织提供了一种摆脱较旧、安全性较低的身份验证方法(例如 AKS 中现已弃用的 Pod Identity)的途径。

工作负载身份的工作原理

工作原理如下:

  1. 启用 OIDC 颁发者:创建或更新 AKS 集群时,需要启用 OIDC 颁发者。在使用 Azure CLI 时,可以使用 --enable-oidc-issuer 和 --enable-workload-identity 标志来完成此操作。
  2. 创建托管身份:您需要在 Azure 中创建一个用户分配的托管身份,您的应用程序将使用它来访问 Azure 资源。
  3. 配置服务帐户:在您的 Kubernetes 集群中,创建一个服务帐户,并使用托管身份的客户端 ID 对其进行注释。
  4. 设置 Pod 配置:将您的 Pod 配置为使用服务帐户,并添加必要的标签 azure.workload.identity/use: "true" 以启用 Workload Identity。
  5. 身份验证和使用:更新您的应用程序以使用支持 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 westus2

export 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_id
  name: "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-identity
  namespace: default
  labels:
    azure.workload.identity/use: "true"  # Required. Only pods with this label can use workload identity.
spec:
  serviceAccountName: workload-identity-sa
  containers:
    - image: mcr.microsoft.com/azure-cli
      name: azure-cli
      command: ["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环境中的安全性和管理效率。

相关推荐
谷隐凡二9 小时前
Kubernetes主从架构简单解析:基于Python的模拟实现
python·架构·kubernetes
陈陈CHENCHEN10 小时前
SuperMap iManager for K8s 离线环境镜像仓库 Containerd 部署
kubernetes
会飞的小蛮猪12 小时前
Ubuntu24.04 基于Containerd部署K8s1.34(私服部署)
docker·云原生·kubernetes
间彧1 天前
Kubernetes滚动发布详解
kubernetes
间彧1 天前
在实际生产环境中,Kubernetes声明式API如何实现蓝绿部署、金丝雀发布等高级部署策略?
kubernetes
间彧1 天前
Kubernetes声明式API相比传统命令式API在故障恢复场景下的具体优势有哪些?
kubernetes·github
间彧1 天前
为什么说Kubernetes的API设计是其成功的关键因素之一?
kubernetes
间彧1 天前
Kubernetes Deployment 配置简化实战:从复杂到高效
kubernetes
可爱的小小小狼1 天前
k8s:服务网格Service Mesh(服务网格)istio和envoy
kubernetes·istio·service_mesh
q***d1731 天前
C在物联网中的Azure IoT Solution Accelerators
物联网·microsoft·azure