使用RBAC为集群内资源操作授权

操作ACK集群需遵循RAMKubernetes RBAC的双重授权。默认情况下,仅阿里云账号和集群创建者拥有集群的完整权限。其他RAM用户或角色在获得访问集群的RAM授权后,仍需具有RBAC权限,才能对集群内的Kubernetes资源进行操作。

工作原理

ACK授权体系包括阿里云RAMKubernetes RBAC两个层级,构成了从云资源到集群资源的完整授权链路。

  • RAM:决定了谁能“进入”集群的大门。负责在云资源层面进行授权,控制用户对ACK集群及其依赖云产品的OpenAPI操作权限。

  • RBAC:决定了用户“进入”大门后能做什么。负责在集群内部进行精细化授权,定义用户能对哪些Kubernetes资源(如Pod、Deployment)执行何种操作(如创建、删除)。

Kubernetes RBAC 机制

image
  • ClusterRole:定义一个在整个集群范围生效的权限集合,再通过ClusterRoleBinding将其绑定至授权主体,使其权限在整个集群内生效。

  • Role:定义一个仅在单个命名空间内有效的权限集合,再通过RoleBinding将其绑定至授权主体,使其权限仅在当前命名空间内生效。

场景一:使用阿里云账号进行RBAC授权

  1. 登录容器服务管理控制台,在左侧导航栏选择授权管理

  2. 授权管理页面配置管理权限。

    • RAM用户授权:单击RAM 用户页签,定位目标 RAM 用户,单击操作列的管理权限,进入权限管理页面。

    • RAM角色授权:单击RAM 角色页签,定位目标 RAM 角色,单击管理权限,进入权限管理页面。

  3. 单击+ 添加权限,按照页面提示为目标RAM用户或角色添加集群或命名空间级别的权限配置,并选择预置角色。

场景二:使用RAM用户或角色进行RBAC授权

默认情况下,RAM用户或角色无法为其他账号授予RBAC权限。为便于权限管理,ACK支持指定某个RAM用户或角色为权限管理员,使其能够为其他用户授予RBAC权限。

步骤一:将RAM用户或角色设置为权限管理员

1. 获得授权所需的RAM权限

方式一:系统策略授权

重要

系统策略需使用AliyunRAMReadOnlyAccessAliyunCSFullAccess,权限较大。如需精细化授权,请使用方式二:自定义策略精细化授权

  1. 使用阿里云账号登录RAM管理控制台,定位目标RAM用户或角色。

    • RAM用户:选择身份管理 > 用户,在用户列表的操作列,单击添加权限

    • RAM角色:选择身份管理 > 角色,在角色列表的操作列,单击添加权限

  2. 选择资源范围账号级别,在权限策略区域定位并选中系统策略AliyunRAMReadOnlyAccessAliyunCSFullAccess,按照页面提示完成授权。

方式二:自定义策略精细化授权

权限管理员需具备以下能力:

  • 查看其他RAM身份信息

  • 查看集群列表和详情

  • 查看集群已有的RBAC配置

  • 在集群中执行RBAC授权操作

请登录RAM管理控制台,参考以下代码示例,为目标RAM用户或角色授予所需的RAM权限。具体操作,请参见使用自定义策略授权

{
    "Statement": [{
            "Action": [
                "ram:Get*",
                "ram:List*",
                "cs:Get*",
                "cs:Describe*",
                "cs:List*",
                "cs:GrantPermission"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ],
    "Version": "1"
}

2. 获得RBAC管理员权限

使用阿里云账号登录容器服务管理控制台,为目标RAM用户或角色在集群维度授予预置角色管理员

  1. 登录容器服务管理控制台,在左侧导航栏选择授权管理

  2. 授权管理页面配置管理权限。

    • RAM用户授权:单击RAM 用户页签,定位目标 RAM 用户,单击操作列的管理权限,进入权限管理页面。

    • RAM角色授权:单击RAM 角色页签,定位目标 RAM 角色,单击管理权限,进入权限管理页面。

  3. 单击+ 添加权限,按照页面提示添加集群和命名空间级别的权限配置,选择预置角色为管理员

    如果在所有集群维度进行授权,权限管理员的身份将自动应用到未来新建的集群,无需重复授权。

步骤二:为其他RAM用户或角色授予RBAC权限

完成前置授权后,权限管理员即可在授权管理页面为其他RAM用户或角色授予RBAC权限。

适用于生产环境

为提升权限管理的安全性和可维护性,建议遵循以下建议。

  • 遵循最小权限原则

    仅授予RAM用户、角色等主体完成其工作所必需的最小权限集。避免无差别授予管理员等高权限角色。

  • 实施精细化授权

    • 分层授权:区分RAM(负责云资源访问)和RBAC(负责集群内资源访问)的职责。

    • 收敛作用域:优先使用RoleBinding将权限限制在特定的命名空间内,而非集群级别的ClusterRoleBinding

    • 精确选择角色:优先使用ACK提供的预置角色。如需自定义角色,应精确定义权限规则,避免使用通配符(*)。

  • 持续治理

    权限管理是一个动态过程。应建立定期审计机制,及时回收冗余或过度的授权,并对权限管理员等高权限角色的操作进行记录和监控。

附录:预置角色说明

为了简化权限管理并快速满足常见的用户场景,ACK基于RBAC机制封装了多种标准化的预置角色。

预置角色

集群内RBAC权限

管理员

对集群所有命名空间下Kubernetes资源的RBAC读写权限,对集群节点、存储卷、命名空间、配额的读写权限。

只读管理员

对集群所有命名空间下Kubernetes资源的RBAC只读权限,对集群节点、存储卷、命名空间、配额的只读权限。

运维人员

对集群所有命名空间下控制台可见Kubernetes资源的RBAC读写权限,对集群节点、存储卷、命名空间的读取与更新权限,对其他资源的只读权限。

开发人员

对集群所有命名空间或所选命名空间下控制台可见Kubernetes资源的RBAC读写权限。

受限用户

对集群所有命名空间或所选命名空间下控制台可见Kubernetes资源的RBAC只读权限。

自定义

权限由您所选择的ClusterRole决定,请在确定所选ClusterRole对各类资源的操作权限后再进行授权,以免RAM用户或RAM角色获得不符合预期的权限。关于自定义权限的授权,请参见使用自定义RBAC限制集群内资源操作

重要

RAM用户或RAM角色被授予cluster-admin权限后,在该集群内可视为与阿里云账号有相同权限的超级账号,拥有操作集群内所有资源的任意权限。请谨慎授予。

常见问题

操作时遇到无权限错误码怎么办?

通过控制台或OpenAPI所做的部分操作缺少所需的RBAC权限时,将返回相应的无权限错误码。可参见下表解决。

错误码或错误信息

说明

解决方案

ForbiddenCheckControlPlaneLog

查看控制面日志被拒绝。

为用户授予管理员或运维人员权限。

ForbiddenHelmUsage

执行Helm操作被拒绝。

为用户授予管理员权限。

ForbiddenRotateCert

证书轮换被拒绝。

为用户授予管理员权限。

ForbiddenAttachInstance

添加节点被拒绝。

为用户授予管理员或运维人员权限。

ForbiddenUpdateKMSState

修改集群KMS落盘加密状态被拒绝。

为用户授予管理员或运维人员权限。

Forbidden get trigger

获取应用触发器信息被拒绝。

为用户授予管理员、运维人员或开发人员权限。

ForbiddenQueryClusterNamespace

查询集群命名空间被拒绝。

为用户授予管理员、运维人员、开发人员或受限用户的权限。

RBAC预置角色不满足需求,如何创建自定义权限?

可通过编写YAML来创建自定义RoleClusterRole。例如,创建一个只允许查看PodClusterRole,然后在授权时选择自定义权限并绑定对应的ClusterRole。具体操作,请参见使用自定义RBAC限制集群内资源操作

RBAC的权限策略仅支持允许(Allow)访问资源,不支持显式拒绝(Deny)访问资源。

相关文档