EKS Add-on 独立身份与最小 IAM
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| API | Application Programming Interface | 应用程序编程接口 |
| ARN | Amazon Resource Name | AWS 资源名称,用于唯一标识资源 |
| ASG | Auto Scaling Group | AWS 自动扩缩容组 |
| AWS | Amazon Web Services | 亚马逊云服务 |
| CSI | Container Storage Interface | 容器存储接口 |
| EKS | Elastic Kubernetes Service | AWS 托管 Kubernetes 服务 |
| ESO | External Secrets Operator | 将外部秘密系统中的值同步到 Kubernetes 的控制器 |
| IaC | Infrastructure as Code | 基础设施即代码 |
| IAM | Identity and Access Management | 身份与访问管理 |
| IMDS | Instance Metadata Service | 实例元数据服务 |
| IRSA | IAM Roles for Service Accounts | 通过 Kubernetes 服务账号关联 AWS IAM 角色 |
| JSON | JavaScript Object Notation | 一种结构化数据格式 |
| OIDC | OpenID Connect | 基于 OAuth 2.0 的身份认证协议 |
| SA | Service Account | 服务账号,供程序或工作负载使用的身份 |
| SDK | Software Development Kit | 软件开发工具包 |
| STS | Security Token Service | 安全令牌服务,用于签发或交换短期凭据 |
本篇给 ExternalDNS、cert-manager、ESO、CSI、扩容控制器提供可复用的 IRSA 建立流程。每个组件一个角色,trust 绑定精确 namespace/ServiceAccount;不把所有组件权限挂到节点角色。EKS Pod Identity 是另一方案,先核实组件 SDK/运行位置支持再选择,不同时叠配两套身份。
Hands-on:建立专属角色#
前置:集群 OIDC provider 已通过企业 IaC 建立;操作者有创建角色/策略权限,知道账户、区域与集群。permissions.json 必须来自对应篇的权限表及固定版本官方策略,收窄到自己的资源。
export AWS_REGION='REPLACE_REGION'
export CLUSTER='REPLACE_CLUSTER'
export ADDON_NS='external-dns'
export ADDON_SA='external-dns'
export ROLE_NAME="${CLUSTER}-external-dns"
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
OIDC_URL=$(aws eks describe-cluster --name "$CLUSTER" --region "$AWS_REGION" --query cluster.identity.oidc.issuer --output text)
export OIDC_HOST="${OIDC_URL#https://}"
export ACCOUNT_ID
aws iam get-open-id-connect-provider --open-id-connect-provider-arn "arn:aws:iam::$ACCOUNT_ID:oidc-provider/$OIDC_HOST"以下适用于商业 AWS 分区;其他分区调整 ARN。生成 trust,不从不可信输入拼接 JSON:
python3 - <<'PY'
import json, os
h = os.environ['OIDC_HOST']
p = {'Version':'2012-10-17','Statement':[{
'Effect':'Allow',
'Principal':{'Federated':f"arn:aws:iam::{os.environ['ACCOUNT_ID']}:oidc-provider/{h}"},
'Action':'sts:AssumeRoleWithWebIdentity',
'Condition':{'StringEquals':{
f'{h}:aud':'sts.amazonaws.com',
f'{h}:sub':f"system:serviceaccount:{os.environ['ADDON_NS']}:{os.environ['ADDON_SA']}"}}}]}
with open('trust.json','w') as f: json.dump(p,f,indent=2)
PY
aws iam create-role --role-name "$ROLE_NAME" --assume-role-policy-document file://trust.json
aws iam put-role-policy --role-name "$ROLE_NAME" --policy-name addon-access --policy-document file://permissions.json
export ROLE_ARN="arn:aws:iam::$ACCOUNT_ID:role/$ROLE_NAME"已存在的角色应审查 diff 后由 IaC 更新,不盲目重建。values 中配置该 SA 的 eks.amazonaws.com/role-arn annotation;安装后检查 Pod 有 AWS_ROLE_ARN 和投射的 token 路径,不能把 token 输出到日志。
权限验收#
| 测试 | 期望 |
|---|---|
| 组件实际 API 调用 | CloudTrail 记录对应 assumed role,操作限定资源成功 |
| 修改其他 zone/secret/ASG | AccessDenied;domainFilter、标签筛选不能代替 IAM |
| 其他 namespace/SA 尝试该角色 | trust 条件拒绝 |
| 撤销一项测试资源权限 | 组件有告警/错误,恢复策略后自动重试;不能静默转用节点宽权限 |
每篇写的身份变量均指本流程创建的角色。检查 private endpoint/STS 出口、SDK 版本、token audience、节点 IMDS 访问边界;IRSA 不能替代 Pod 间隔离和节点安全。IRSA 原理、建立角色
通过 Terraform 管理 role/trust/policy、OIDC 和 SA,保存负向权限测试证据。集群重建 OIDC issuer 变化后必须更新 trust,备份 Kubernetes Secret 并不能恢复 AWS 角色。