使用自定义RBAC限制集群内资源操作

当容器服务控制台预置的ClusterRole无法满足您的权限要求时,您可以通过自定义ClusterRole和Role实现更精细化的RBAC权限配置,使您能够根据业务需求和安全要求灵活定制权限策略。本文将为您介绍如何自定义RBAC权限配置。

自定义RBAC权限策略说明

您可以根据以下资源的策略说明,自定义创建Role和ClusterRole的YAML清单,来实现对ACK集群资源的精细访问控制。

Role(命名空间角色)

以下YAML示例定义了一个名为my-role的Role,赋予其在default命名空间中对Pod资源的读取权限。

   apiVersion: rbac.authorization.k8s.io/v1
   kind: Role
   metadata:
     namespace: default
     name: my-role 
   rules:                               # 权限规则的列表。
   - apiGroups: [""]                    # 资源所属的API组。
     resources: ["pods"]                # 定义pod资源类型。
     verbs: ["get", "list"]             # 定义执行的get、list权限策略。

ClusterRole(集群角色)

以下YAML示例定义了一个名为my-clusterrole的ClusterRole,赋予其对集群中的Pods和Services资源的读取权限。

说明

ClusterRole是集群维度的资源,YAML中若指定命名空间参数视为无效。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# namespace: default                     
  name: my-clusterrole
rules:                                 # 权限规则的列表。
  - apiGroups: [""]                    # 资源所属的API组。
    resources: ["pods"]                # 定义pod资源类型。
    verbs: ["get", "list"]             # 定义执行的get、list权限策略。
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["get", "list"]

您可以根据以下常见资源类型的策略说明,为不同资源创建自定义RBAC权限,以实现对RAM用户或角色在集群资源上更精细的访问控制。

常见资源类型的策略说明

  • 读取权限

    • get:读取指定资源的详细信息。

    • list:获取资源集合的列表。

    • watch:监控资源的变化,实时接收更新。

  • 写入权限

    • create:创建新的资源实例。

    • update:修改已存在的资源。

    • patch:对已存在的资源进行部分修改。

    • delete:删除指定的资源。

资源名称

资源类型(resources

所属API组(apiGroups

权限策略(verbs

Pods

resources: ["pods"]

apiGroups: [""]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete", "exec", "proxy"]

Service

resources: ["services"]

apiGroups: [""]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

ConfigMaps

resources: ["configmaps"]

apiGroups: [""]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

Secrets

resources: ["secrets"]

apiGroups: [""]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

PersistentVolumes

resources: ["persistentvolumes"]

apiGroups: [""]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

PersistentVolumeClaim

resources: ["persistentvolumeclaims"]

apiGroups: [""]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

NameSpaces

resources: ["namespaces"]

apiGroups: [""]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

Deployments

resources: ["deployments"]

apiGroups: ["apps"]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

DaemonSet

resources: ["daemonsets"]

apiGroups: ["apps"]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

StatefulSet

resources: ["statefulsets"]

apiGroups: ["apps"]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

Ingresses

resources: ["ingresses"]

apiGroups: ["networking.k8s.io"]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

Networkpolicies

resources: ["networkpolicies"]

apiGroups: ["networking.k8s.io"]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

Jobs

resources: ["jobs"]

apiGroups: ["batch"]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

CronJobs

resources: ["cronjobs"]

apiGroups: ["batch"]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

StorageClasses

resources: ["storageclasses"]

apiGroups: ["storage.k8s.io"]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

HorizontalPodAutoscalers

resources: ["horizontalpodautoscalers"]

apiGroups: ["autoscaling"]

verbs: ["get", "list", "watch", "update", "create", "patch", "delete"]

操作步骤

image

您可以通过控制台或kubectl使用自定义RBAC权限。

重要

当前容器服务 Kubernetes 版控制台操作方式仅支持自定义ClusterRole角色与集群内RBAC权限的绑定,如果您需要使用自定义Role角色进行权限绑定,可使用kubectl命令完成。

控制台

步骤一:创建自定义RBAC权限

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

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择安全管理 > 角色

  3. 角色页面,单击Cluster Role页签。然后单击创建

  4. 创建YAML面板输入自定义策略的YAML内容,单击确定即可创建ClusterRole。

    此步骤以ClusterRole(集群角色)的YAML为例,创建完成后,可在Cluster Role页签查看自定义权限my-clusterrole

12

步骤二:使用自定义RBAC权限进行授权

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

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

    • 为RAM用户授权

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

    • 为RAM角色授权

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

      说明

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

  3. 单击+添加权限,在添加权限框中,选择已创建ClusterRole的集群和需要授权的命名空间,然后在权限管理中选择自定义,接着在右边的下拉框中,选择my-clusterrole,然后单击提交授权

13

kubectl

步骤一:创建自定义RBAC权限

  1. 使用以下示例应用的YAML内容,创建名为my-clusterrole.yaml文件。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: my-clusterrole
      namespace: default
    rules:
      - apiGroups: [""]
        resources: ["pods"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["services"]
        verbs: ["get", "list", "watch"]
  2. 执行以下命令,部署ClusterRole。

    kubectl apply -f  my-clusterrole.yaml

步骤二:获取授权对象ID

步骤三:使用自定义RBAC权限授权

  1. 使用以下示例应用的YAML内容,创建名为my-clusterrole-binding.yaml文件。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: my-clusterrole-binding
    subjects:
    - kind: User
      name: "20811XXXXXXXXX2288"  # 步骤二中获取授权对象的UserId或RoleId。
    roleRef:
      kind: ClusterRole
      name: my-clusterrole
      apiGroup: rbac.authorization.k8s.io
  2. 执行以下命令,部署ClusterRoleBinding。

    kubectl apply -f  my-clusterrole-binding.yaml

目标RAM用户被授予自定义RBAC权限后,通过获取目标集群KubeConfig并通过kubectl工具连接集群,以验证其权限。