如何通过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提取
- 定位绑定目标ServiceAccount的Pod:
kubectl get pods -n <命名空间> -l <ServiceAccount标签选择器>
- 将Pod内的令牌拷贝到本地:
kubectl cp <命名空间>/<Pod名称>:/var/run/secrets/eks.amazonaws.com/serviceaccount/token ./sa-token
方式2:通过K8s API直接获取
- 查询ServiceAccount关联的自动生成Secret名称:
kubectl get sa <ServiceAccount名称> -n <命名空间> -o jsonpath='{.secrets[0].name}'
- 从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测试
确保Account B的IAM角色信任策略已配置:信任Account A的EKS OIDC提供商,且允许目标ServiceAccount的
sub(格式:system:serviceaccount:<命名空间>:<ServiceAccount名称>)扮演该角色。执行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
相关产品推荐
相关产品推荐

