kops专属用户需IAMFullAccess的原因及权限限制方案问询
嘿,这个问题问到点子上了——我之前用kops搭AWS集群的时候也纠结过这个宽泛的IAM权限问题,咱们一步步拆解来看:
IAMFullAccess? kops作为集群编排工具,在集群的整个生命周期(创建、升级、扩缩容、销毁)里需要处理大量IAM相关操作,官方直接给IAMFullAccess是为了降低用户的配置门槛,避免因为权限遗漏导致部署失败。具体来说它要做这些事:
- 创建master和node节点对应的IAM角色(比如
masters.<集群名>、nodes.<集群名>) - 给这些角色绑定必要的权限策略(比如允许节点和AWS API交互、云监控、EBS存储、容器镜像仓库访问的权限)
- 创建并管理实例配置文件(Instance Profile),把IAM角色和EC2实例绑定
- 后续集群变更时自动更新IAM资源,销毁集群时清理相关IAM角色和配置文件
当然有办法,核心思路是最小化权限或者手动预控IAM资源,下面是几种可行方案:
1. 自定义最小权限的IAM策略
你可以给kops专用用户创建一个自定义IAM策略,只包含它实际需要的权限,而不是用全量的IAMFullAccess。这里列一下核心权限(可以根据你的集群需求调整):
- IAM核心操作:
iam:CreateRole、iam:DeleteRole、iam:GetRole、iam:UpdateRole、iam:AttachRolePolicy、iam:DetachRolePolicy、iam:CreateInstanceProfile、iam:DeleteInstanceProfile、iam:AddRoleToInstanceProfile、iam:RemoveRoleFromInstanceProfile、iam:GetInstanceProfile、iam:PassRole(这个非常关键,kops需要把角色传递给EC2实例) - 其他配套权限:比如EC2实例管理、S3集群状态存储、Route53域名解析的权限(根据你的集群配置来加)
给个策略示例(记得替换成你的AWS账号ID):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:CreateRole", "iam:DeleteRole", "iam:GetRole", "iam:UpdateRole", "iam:AttachRolePolicy", "iam:DetachRolePolicy", "iam:CreateInstanceProfile", "iam:DeleteInstanceProfile", "iam:AddRoleToInstanceProfile", "iam:RemoveRoleFromInstanceProfile", "iam:GetInstanceProfile", "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012:role/kops-*", "arn:aws:iam::123456789012:instance-profile/kops-*" ] }, { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:RunInstances", "ec2:TerminateInstances", "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": "*" } ] }
通过资源ARN的通配符限制,能确保kops只能操作它自己创建的IAM资源,进一步降低风险。
2. 预创建IAM角色和实例配置文件
如果不想让kops拥有创建IAM资源的权限,你可以手动提前创建好集群需要的IAM角色和实例配置文件,然后在kops集群配置里指定这些预创建的资源。
步骤大概是:
- 手动创建master节点的IAM角色,绑定
AmazonEKSClusterPolicy、AmazonEC2ContainerRegistryReadOnly等必要策略 - 手动创建node节点的IAM角色,绑定
AmazonEKSWorkerNodePolicy、AmazonEC2ContainerRegistryReadOnly、AmazonEKS_CNI_Policy等策略 - 给每个角色创建对应的实例配置文件,把角色关联进去
- 创建集群时用参数指定这些预创建的角色:
kops create cluster \ --name mycluster.example.com \ --state s3://my-kops-state-store \ --master-iam-role arn:aws:iam::123456789012:role/my-precreated-master-role \ --node-iam-role arn:aws:iam::123456789012:role/my-precreated-node-role \ --zones us-east-1a,us-east-1b
这种方式下,kops只需要iam:PassRole权限来把角色传递给EC2实例,加上其他必要的EC2、S3权限就够了。
3. 用kops自带参数限制IAM操作
kops本身提供了一些参数来跳过IAM资源的自动创建:
--iam-skip-role-creation:跳过创建IAM角色--iam-skip-instance-profile-creation:跳过创建实例配置文件
用这些参数后,你可以完全手动管理IAM资源,kops只负责使用它们。
你提到的“在预配置实例上创建集群”,kops确实支持——你可以用--instance-group参数指定已存在的EC2实例作为集群节点,但这种方式比较小众,适合特殊场景(比如用了自定义镜像的实例)。这种情况下,你需要确保预配置实例已经附加了正确的IAM角色,并且kops有ec2:DescribeInstances、ec2:ModifyInstanceAttribute等权限来把实例加入集群。不过这种方式维护成本较高,自动扩缩容功能可能无法正常工作,所以一般还是推荐前面两种权限限制方案。
内容的提问来源于stack exchange,提问作者pkaramol

