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 角色。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭