AKS Pod基于Workload Identity生成IMDS访问令牌问题及权限隔离需求
问题解决:AKS Workload Identity Pod中令牌使用与权限隔离
一、为什么直接使用azure-identity-token无法调用Azure API?
你挂载的/var/run/secrets/azure/tokens/azure-identity-token令牌受众(audience)为api://AzureADTokenExchange,这个令牌仅用于向Azure AD交换目标资源的访问令牌,不能直接用于调用Azure Management API或其他Azure服务API。
正确的令牌交换方法
在Pod内部,使用以下命令将挂载的令牌交换为目标资源(比如Azure管理API)的访问令牌:
# 读取挂载的联邦令牌 FED_TOKEN=$(cat /var/run/secrets/azure/tokens/azure-identity-token) # 向Azure AD请求目标资源的访问令牌 ACCESS_TOKEN=$(curl -X POST "https://login.microsoftonline.com/${AZURE_TENANT_ID}/oauth2/v2.0/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "client_id=${AZURE_CLIENT_ID}" \ -d "grant_type=client_credentials" \ -d "client_assertion=${FED_TOKEN}" \ -d "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer" \ -d "scope=https://management.azure.com/.default" | grep -Po '"access_token": *\K"[^"]*"' | sed 's/"//g') # 使用令牌调用API curl https://management.azure.com/subscriptions/${SUBSCRIPTION}/resourcegroups?api-version=2023-07-01 -H "Authorization: Bearer ${ACCESS_TOKEN}"
说明:
${AZURE_TENANT_ID}和${AZURE_CLIENT_ID}会自动注入到Pod环境变量中,无需手动配置- 将
scope参数替换为你需要访问的Azure服务对应范围(比如Blob Storage用https://storage.azure.com/.default)
二、如何阻止Pod使用Agentpool Managed Identity,实现权限隔离?
要彻底隔离Pod与Agentpool身份的权限,从以下两个层面入手:
1. 禁用Pod对IMDS的访问
AKS节点的IMDS服务(http://169.254.169.254)默认允许所有Pod访问,这会导致Pod获取Agentpool身份的令牌。通过Network Policy禁止普通Pod访问IMDS地址:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: block-imds-access namespace: default spec: podSelector: {} policyTypes: - Egress egress: - to: - ipBlock: cidr: 0.0.0.0/0 except: - 169.254.169.254/32 ports: - protocol: TCP port: 80 - protocol: TCP port: 443
应用该策略后,所有Pod将无法访问IMDS,只能通过Workload Identity挂载的令牌获取权限。
2. 最小化Agentpool身份的权限
确保Agentpool的Managed Identity仅拥有AKS集群运行所需的最小权限(如节点管理、日志收集等),不要授予额外的订阅级权限(如Contributor),从根源上避免Pod误用Agentpool身份。
3. 验证权限隔离效果
在Pod内尝试访问IMDS,若返回Connection refused或超时则说明隔离生效:
curl http://169.254.169.254/metadata/identity/oauth2/token?api-version=2023-07-01&resource=https%3A%2F%2Fmanagement.azure.com -H Metadata:true
总结
- 不要直接使用
azure-identity-token调用API,必须通过Azure AD令牌交换获取目标资源的访问令牌 - 通过Network Policy阻止Pod访问IMDS,结合最小化Agentpool权限,实现Pod与节点身份的完全权限隔离
内容的提问来源于stack exchange,提问作者Ga-M
相关产品推荐
相关产品推荐

