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

更新时间:

RBAC(Role-Based Access Control)是基于角色的访问控制。您可以通过Role和ClusterRole定义可操作的资源对象,通过RoleBinding和ClusterRoleBinding将角色绑定到特定的用户,从而实现RBAC权限配置,让不同用户拥有不同的Kubernetes资源操作权限。RAM用户或RAM角色进行集群RAM授权之后,您还需要对其进行集群内部资源的RBAC授权,才能对集群内Kubernetes资源进行操作,例如创建Deployment、Service。

RBAC工作原理

Kubernetes RBAC支持以下类型的角色和绑定,通过角色定义资源的访问权限时,仅支持允许访问资源,不支持拒绝访问资源。关于如何编写Kubernetes的ClusterRole和Role,请参见使用自定义RBAC限制集群内资源操作

  • Role:角色,定义对单个命名空间内资源的访问权限。

  • RoleBinding:角色绑定,定义用户和角色的关系。

  • ClusterRole:集群角色,定义对整个集群内资源的访问权限。

  • ClusterRoleBinding:集群角色绑定,定义用户和集群角色的关系。

image

前提条件

RAM用户或RAM角色已获取目标集群的RAM只读权限,参考策略如下。具体操作,请参见使用自定义策略授权

展开查看RAM权限策略示例

{
  "Statement": [
    {
      "Action": [
        "cs:Get*",
        "cs:List*",
        "cs:Describe*"
      ],
      "Effect": "Allow",
      "Resource": [
        "acs:cs:*:*:cluster/<yourclusterID>" 
      ]
    }
  ],
  "Version": "1"
}

授权说明

阿里云账号(主账号)可以对所有集群进行所有操作,RAM用户或RAM角色拥有自己创建的集群的所有操作权限,非集群创建者的RAM用户或RAM角色,需要额外进行RAM和RBAC授权,才能操作集群。

操作步骤

容器服务ACK默认提供管理员、运维人员、开发人员和受限用户这四种标准的集群资源RBAC访问权限,可满足大部分用户在容器服务控制台上的使用需求。如果您想自由定义集群资源的RBAC访问权限,请参见使用自定义RBAC限制集群内资源操作

满足以下条件的账号才可以为其他RAM用户或RAM角色进行授权。

  • 阿里云账号(主账号)。

  • 拥有管理员权限的RAM用户或RAM角色。

使用阿里云账号授权

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

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

    • 为RAM用户授权

      单击RAM 用户页签,在RAM用户列表中,单击目标RAM用户右侧的管理权限,进入权限管理页面,您也可以选择多个目标RAM用户进行批量授权。

    • 为RAM角色授权

      单击RAM 角色页签,输入RAM 角色名称,然后单击管理权限,进入权限管理页面。

      说明

      RAM角色支持手动输入,也支持在下拉列表中选择。您可以单击RAM角色右侧空白框,将会显示已有的RAM角色列表,然后从列表中选择已有的RAM角色进行授权。

  3. 单击+ 添加权限,为目标RAM用户或RAM角色添加集群命名空间级别的权限配置,并选择相应的预置角色,然后单击提交授权

    说明
    • 在一个目标集群或命名空间中为RAM用户或RAM角色的授权时,支持配置一个预置角色、多个自定义角色,此时,所获得的权限为多个角色权限的并集。

    • 如果您需要在所有集群维度为RAM用户或RAM角色进行一键授权,使得后续新创建的集群也会为被授权的RAM用户或RAM角色自动绑定已经授权的预置角色,您可以选择集群所有集群

    预置角色

    集群内RBAC权限

    管理员

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

    运维人员

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

    开发人员

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

    受限用户

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

    自定义

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

    重要

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

使用RAM用户或RAM角色授权

阿里云账号(主账号)对账号中的资源具有完全管理权限,您也可以将新建或已有的RAM用户或角色授予如下RAM权限和RBAC权限,使其成为一个权限管理员,后续使用该RAM用户或RAM角色进行为其他用户或角色授权。

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

1、获取RAM授权权限

使用系统策略授权

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

    • RAM用户

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

    • RAM角色

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

  2. 添加权限面板,选择授权范围,然后选择权限为系统策略,根据名称搜索或在列表中找到并单击AliyunRAMFullAccess和AliyunCSFullAccess系统策略,将该策略移动到右侧的已选择区域,然后单击确定。权限成功添加后,单击完成

    重要

    AliyunRAMFullAccess为高风险权限,请谨慎授予。如需精细化授权,请参见使用自定义策略精细化授权

使用自定义策略精细化授权

默认情况下,RAM用户或RAM角色不具备对其他RAM用户或角色进行RBAC授权的能力。您需要为其授予如下权限:

  • 查看其他RAM账号。

  • 授予RAM权限策略。

  • 查看集群信息。

  • 查看RBAC权限配置。

  • RBAC授权能力。

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

说明

请将xxxxxx替换为需要绑定的RAM策略的名称。替换为 *,表示RAM用户或RAM角色拥有所有RAM策略的授权绑定能力。

{
    "Statement": [{
            "Action": [
                "ram:Get*",
                "ram:List*",
                "cs:Get*",
                "cs:Describe*",
                "cs:List*",
                "cs:GrantPermission"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ram:AttachPolicyToUser",
                "ram:AttachPolicy"
            ],
            "Effect": "Allow",
            "Resource":  [
                "acs:ram:*:*:policy/xxxxxx",
                "acs:*:*:*:user/*"
            ]
        }
    ],
    "Version": "1"
}

2、获取RBAC授权权限

完成上述RAM权限和RBAC权限授权之后,该RAM用户或RAM角色成为一个权限管理员,拥有给其他RAM用户或RAM角色进行RAM授权和RBAC授权的能力。

说明

拥有管理员权限的RAM用户或RAM角色,可以在所有集群维度进行一键授权,后续新创建的集群也会自动绑定已经授权的ClusterRole。

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

RAM用户或RAM角色获取管理员权限之后,即可登录为其他用户或角色授权,具体操作和阿里云账号授权操作一致,请参见使用阿里云账号授权

自定义集群资源权限

如果您想自由定义集群资源的访问权限,可使用自定义集群资源权限功能。关于如何编写自定义集群资源RBAC权限,请参见使用自定义RBAC限制集群内资源操作

阿里云容器服务内置了一些自定义集群资源权限。

说明

其中cluster-admin权限值得关注,属于集群超级管理员权限,对所有资源都默认拥有权限。

1726631955905_FDBB0E77-2ABC-4423-91F6-CA3C58F348A0

您可登录到集群节点,执行以下命令,查看自定义权限的详情。

kubectl get clusterrole

预期输出:

NAME                                                                   AGE
admin                                                                  13d
alibaba-log-controller                                                 13d
alicloud-disk-controller-runner                                        13d
cluster-admin                                                          13d
cs:admin                                                               13d
edit                                                                   13d
flannel                                                                13d
kube-state-metrics                                                     22h
node-exporter                                                          22h
prometheus-k8s                                                         22h
prometheus-operator                                                    22h
system:aggregate-to-admin                                              13d
....  
system:volume-scheduler                                                13d
view                                                                   13d         

以超级管理员cluster-admin为例,执行以下命令,查看其权限详情。

说明

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

kubectl get clusterrole cluster-admin -o yaml

预期输出:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  creationTimestamp: 2018-10-12T08:31:15Z
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
  resourceVersion: "57"
  selfLink: /apis/rbac.authorization.k8s.io/v1/clusterroles/cluster-admin
  uid: 2f29f9c5-cdf9-11e8-84bf-00163e0b2f97
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'

无权限错误码说明

当您通过控制台或OpenAPI所做的部分操作缺少所需的RBAC权限时,控制台或OpenAPI将返回相应的无权限错误码。各个错误码对应操作所需的集群RBAC权限说明如下表所示。

错误码或错误信息

解决方案

ForbiddenCheckControlPlaneLog

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

ForbiddenHelmUsage

请为用户授予管理员权限。

ForbiddenRotateCert

请为用户授予管理员权限。

ForbiddenAttachInstance

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

ForbiddenUpdateKMSState

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

Forbidden get trigger

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

ForbiddenQueryClusterNamespace

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

相关文档