当容器服务控制台预置的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"] | 
 | 
 | 
| Service | resources: ["services"] | apiGroups: [""] | 
 | 
| ConfigMaps | resources: ["configmaps"] | apiGroups: [""] | 
 | 
| Secrets | resources: ["secrets"] | apiGroups: [""] | 
 | 
| PersistentVolumes | resources: ["persistentvolumes"] | apiGroups: [""] | 
 | 
| PersistentVolumeClaim | resources: ["persistentvolumeclaims"] | apiGroups: [""] | 
 | 
| NameSpaces | resources: ["namespaces"] | apiGroups: [""] | 
 | 
| Deployments | resources: ["deployments"] | apiGroups: ["apps"] | 
 | 
| DaemonSet | resources: ["daemonsets"] | apiGroups: ["apps"] | 
 | 
| StatefulSet | resources: ["statefulsets"] | apiGroups: ["apps"] | 
 | 
| Ingresses | resources: ["ingresses"] | apiGroups: ["networking.k8s.io"] | 
 | 
| Networkpolicies | resources: ["networkpolicies"] | apiGroups: ["networking.k8s.io"] | 
 | 
| Jobs | resources: ["jobs"] | apiGroups: ["batch"] | 
 | 
| CronJobs | resources: ["cronjobs"] | apiGroups: ["batch"] | 
 | 
| StorageClasses | resources: ["storageclasses"] | apiGroups: ["storage.k8s.io"] | 
 | 
| HorizontalPodAutoscalers | resources: ["horizontalpodautoscalers"] | apiGroups: ["autoscaling"] | 
 | 
操作步骤
您可以通过控制台或kubectl使用自定义RBAC权限。
当前容器服务 Kubernetes 版控制台操作方式仅支持自定义ClusterRole角色与集群内RBAC权限的绑定,如果您需要使用自定义Role角色进行权限绑定,可使用kubectl命令完成。
控制台
步骤一:创建自定义RBAC权限
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 在角色页面,单击Cluster Role页签。然后单击创建。 
- 在创建YAML面板输入自定义策略的YAML内容,单击确定即可创建ClusterRole。 - 此步骤以ClusterRole(集群角色)的YAML为例,创建完成后,可在Cluster Role页签查看自定义权限my-clusterrole。 

步骤二:使用自定义RBAC权限进行授权
- 登录容器服务管理控制台,在左侧导航栏选择授权管理。 
- 在授权管理页面配置管理权限。 - 为RAM用户授权 - 单击RAM 用户页签,在RAM用户列表中,单击目标RAM用户右侧的管理权限,进入权限管理页面,您也可以选择多个目标RAM用户进行批量授权。 
- 为RAM角色授权 - 单击RAM 角色页签,输入RAM 角色名称,然后单击管理权限,进入权限管理页面。 说明- RAM角色支持手动输入,也支持在下拉列表中选择。您可以单击RAM角色右侧空白框,将会显示已有的RAM角色列表,然后从列表中选择已有的RAM角色进行授权。 
 
- 单击+添加权限,在添加权限框中,选择已创建ClusterRole的集群和需要授权的命名空间,然后在权限管理中选择自定义,接着在右边的下拉框中,选择my-clusterrole,然后单击提交授权。 

kubectl
步骤一:创建自定义RBAC权限
- 使用以下示例应用的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"]
- 执行以下命令,部署ClusterRole。 - kubectl apply -f my-clusterrole.yaml
步骤二:获取授权对象ID
- 为RAM用户授权,需要通过RAM用户名称获取UserId,详情请参见查询RAM用户的详细信息。 
- 为RAM角色授权,需要通过RAM角色名称获取RoleId,详情请参见GetRole - 获取角色信息。 
步骤三:使用自定义RBAC权限授权
- 使用以下示例应用的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
- 执行以下命令,部署ClusterRoleBinding。 - kubectl apply -f my-clusterrole-binding.yaml
目标RAM用户被授予自定义RBAC权限后,通过获取目标集群KubeConfig并通过kubectl工具连接集群,以验证其权限。
常见问题
如何授权RAM用户或角色通过控制台登录容器终端?
即使RAM用户或角色拥有对Pod的get和list只读权限,默认情况下也无法通过容器服务管理控制台登录到 Pod 的容器终端。 该操作在RBAC机制中需要Pod子资源 pods/exec 的get和 create 权限。
因此,需在Role或ClusterRole的rules中为 pods/exec 资源授予get和 create 权限,然后将其绑定给目标用户或用户组。示例如下。
操作入口:登录容器服务管理控制台,在集群列表页面单击目标集群名称,在左侧导航栏选择,然后在操作列单击终端。
Role
   apiVersion: rbac.authorization.k8s.io/v1
   kind: Role
   metadata:
     namespace: default
     name: ns-role 
   rules:                               
   - apiGroups: [""]                   
     resources: ["pods"]                
     verbs: ["get", "list"]           
   # 授予命名空间下 pod/exec 的权限
   - apiGroups: [""]
     resources: ["pods/exec"]
     verbs: ["get", "create"]ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# namespace: default                     
  name: my-clusterrole
rules:                                 
  - apiGroups: [""]                   
    resources: ["pods"]               
    verbs: ["get", "list"]             
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["get", "list"]
  # 授予集群下 pod/exec 的权限
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["get", "create"]