You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过CLI测试EKS集群Web Identity跨账号角色假设?

EKS Web Identity跨账号角色假设的CLI测试方案

一、正确获取ServiceAccount的JWT令牌

EKS 1.21+版本中,ServiceAccount会自动生成并挂载JWT令牌到Pod的/var/run/secrets/eks.amazonaws.com/serviceaccount/token路径,无需手动创建Secret。集群外测试可通过两种方式获取令牌:

方式1:从运行中的Pod提取

  1. 定位绑定目标ServiceAccount的Pod:
kubectl get pods -n <命名空间> -l <ServiceAccount标签选择器>
  1. 将Pod内的令牌拷贝到本地:
kubectl cp <命名空间>/<Pod名称>:/var/run/secrets/eks.amazonaws.com/serviceaccount/token ./sa-token

方式2:通过K8s API直接获取

  1. 查询ServiceAccount关联的自动生成Secret名称:
kubectl get sa <ServiceAccount名称> -n <命名空间> -o jsonpath='{.secrets[0].name}'
  1. 从Secret中解码提取令牌:
kubectl get secret <Secret名称> -n <命名空间> -o jsonpath='{.data.token}' | base64 -d > ./sa-token

二、排查令牌的Issuer与Audience错误

拿到令牌后先解码验证核心字段,避免InvalidIdentityToken报错:

# 解码JWT Payload并查看关键信息
echo $(cut -d. -f2 ./sa-token) | base64 -d | jq .

需确认两个字段:

  • iss:必须是EKS OIDC提供商的完整URL(格式:https://oidc.eks.<区域>.amazonaws.com/id/<OIDC-ID>),否则会触发"Issuer must be a valid URL"错误
  • aud:必须设为sts.amazonaws.com,否则会触发"Incorrect token audience"错误

如果aud不符合要求,给ServiceAccount添加注解后重新生成令牌:

kubectl annotate sa <ServiceAccount名称> -n <命名空间> eks.amazonaws.com/audience=sts.amazonaws.com
# 删除旧Secret,EKS会自动生成带正确aud的新令牌
kubectl delete secret <Secret名称> -n <命名空间>

三、CLI执行AssumeRoleWithWebIdentity测试

  1. 确保Account B的IAM角色信任策略已配置:信任Account A的EKS OIDC提供商,且允许目标ServiceAccount的sub(格式:system:serviceaccount:<命名空间>:<ServiceAccount名称>)扮演该角色。

  2. 执行STS命令:

aws sts assume-role-with-web-identity \
  --role-arn arn:aws:iam::<AccountB-ID>:role/<跨账号角色名称> \
  --role-session-name test-session \
  --web-identity-token file://./sa-token

成功后会返回临时凭证,可通过环境变量加载凭证测试访问Account B资源:

# 从返回结果提取凭证并设置环境变量
export AWS_ACCESS_KEY_ID=$(jq -r '.Credentials.AccessKeyId' sts-response.json)
export AWS_SECRET_ACCESS_KEY=$(jq -r '.Credentials.SecretAccessKey' sts-response.json)
export AWS_SESSION_TOKEN=$(jq -r '.Credentials.SessionToken' sts-response.json)

# 示例:测试访问Account B的S3桶
aws s3 ls s3://<AccountB-存储桶名称>

四、关于“通用JWT令牌”的说明

不存在所谓的通用JWT令牌,每个ServiceAccount的令牌都是唯一的,且包含该账号、命名空间、ServiceAccount的身份标识(sub字段)。STS会验证令牌的签名、Issuer、Audience以及角色信任策略的匹配关系,必须使用对应ServiceAccount的合法令牌才能通过验证。


内容的提问来源于stack exchange,提问作者David Gard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:10:34