深入探究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环境中的安全性和管理效率。

相关推荐
Leinwin11 小时前
借助Azure AI Foundry 如何打造语音交互新体验
人工智能·microsoft·azure
MarkHD17 小时前
第八天 搭建车辆状态监控平台(Docker+Kubernetes) OTA升级服务开发(差分升级、回滚机制)
docker·容器·kubernetes
Akamai中国1 天前
GPU加速Kubernetes集群助力音视频转码与AI工作负载扩展
人工智能·云原生·容器·kubernetes·云计算·音视频
云攀登者-望正茂2 天前
Azure 应用服务中的异常处理、日志记录和通知:综合指南
azure
jmsail2 天前
Dynamics 365 Business Central Azure application registration
microsoft·azure·dynamics 365·d365 bc erp
Access开发易登软件2 天前
Access链接Azure SQL
数据库·后端·sql·flask·vba·azure·access
安顾里2 天前
什么是endpoints?
运维·容器·kubernetes
运维小文2 天前
fluentd采集K8S日志
云原生·容器·kubernetes·fluentd·efk
ManageEngine卓豪2 天前
选择合适的Azure数据库监控工具
azure·数据库性能·数据库监控