Permisos de espacio de nombres (basados en Kubernetes RBAC)
Permisos de espacio de nombres (basados en Kubernetes RBAC)
Puede regular el acceso de los usuarios o los grupos de usuarios a los recursos de Kubernetes en un único espacio de nombres basado en sus roles de Kubernetes RBAC. La API de RBAC declara cuatro tipos de objetos de Kubernetes: Role, ClusterRole, RoleBinding y ClusterRoleBinding, que se describen a continuación:
- Función: define un conjunto de reglas para acceder a los recursos de Kubernetes en un espacio de nombres.
- RoleBinding: define la relación entre usuarios y roles.
- ClusterRole: define un conjunto de reglas para acceder a los recursos de Kubernetes en un clúster (incluidos todos los espacios de nombres).
- ClusterRoleBinding: define la relación entre los usuarios y los roles de clúster.
Role y ClusterRole especifican acciones que se pueden realizar en los recursos específicos. RoleBinding y ClusterRoleBinding vinculan roles a usuarios específicos, grupos de usuarios o ServiceAccounts. Ilustración:
En la consola de CCE, puede asignar permisos a un usuario o grupo de usuarios para tener acceso a recursos en uno o varios espacios de nombres. De forma predeterminada, la consola de CCE proporciona el ClusterRoles siguiente:
- view (solo lectura): permiso de solo lectura en la mayoría de los recursos de todos los espacios de nombres o seleccionados.
- edit (desarrollo): permisos de lectura y escritura en la mayoría de los recursos en todos o en espacios de nombres seleccionados. Si este ClusterRole está configurado para todos los espacios de nombres, su capacidad es la misma que el permiso de O&M.
- admin (O&M): permisos de lectura y escritura en la mayoría de los recursos de todos los espacios de nombres, y permisos de solo lectura en nodos, volúmenes de almacenamiento, espacios de nombres y gestión de cuotas.
- cluster-admin (administrador): permisos de lectura y escritura en todos los recursos de todos los espacios de nombres.
Cluster Permissions (basados en IAM) y Namespace Permissions (basados en Kubernetes RBAC)
Los usuarios con diferentes permisos de clúster (asignados mediante IAM) tienen diferentes permisos de espacio de nombres (asignados mediante Kubernetes RBAC). Tabla 1 enumera los permisos de espacio de nombres de diferentes usuarios.
Usuario |
Clústeres de v1.13 y posteriores |
---|---|
Usuario con los permisos de Tenant Administrator (por ejemplo, una cuenta) |
Todos los permisos de espacio de nombres |
Usuario de IAM con el rol CCE Administrator |
Todos los permisos de espacio de nombres |
Usuario de IAM con el rol CCE FullAccess o CCE ReadOnlyAccess |
Requiere la autorización RBAC de Kubernetes. |
Usuario de IAM con el rol Tenant Guest |
Requiere la autorización RBAC de Kubernetes. |
Precauciones
- La autorización de RBAC de Kubernetes se puede usar para clústeres de v1.11.7-r2 y posteriores. Asegúrese de haber desplegado una versión de clúster compatible. Para obtener más información sobre la actualización de un clúster, consulte Actualización de sustitución/rodamiento (versión 1.13).
- Después de crear un clúster de v1.11.7-r2 o posterior, CCE le asigna automáticamente el permiso de cluster-admin, lo que significa que tiene control total sobre todos los recursos de todos los espacios de nombres del clúster. El ID de un usuario federado cambia en cada inicio de sesión y cierre de sesión. Por lo tanto, el usuario con los permisos se muestra como eliminado. En este caso, no elimine los permisos. De lo contrario, la autenticación falla. Se recomienda conceder el permiso de administrador del clúster a un grupo de usuarios en CCE y agregar usuarios federados al grupo de usuarios.
- Un usuario con el rol Security Administrator tiene todos los permisos de IAM excepto el cambio de rol. Por ejemplo, una cuenta del grupo de usuarios admin tiene esta función de forma predeterminada. Solo estos usuarios pueden asignar permisos en la página Permissions de la consola de CCE.
Configuración de permisos de espacio de nombres (en la consola)
Puede regular el acceso de los usuarios o los grupos de usuarios a los recursos de Kubernetes en un único espacio de nombres basado en sus roles de Kubernetes RBAC.
- Inicie sesión en la consola de CCE. En el panel de navegación, elija Permissions.
- Seleccione un clúster para el que desee agregar permisos en la lista desplegable de la derecha.
- Haga clic en Add Permissions en la esquina superior derecha.
- Confirme el nombre del clúster y seleccione el espacio de nombres para el que asignar permisos. Por ejemplo, seleccione All namespaces, el usuario o grupo de usuarios de destino y seleccione los permisos.
Si no tiene permisos de IAM, no puede seleccionar usuarios o grupos de usuarios al configurar permisos para otros usuarios o grupos de usuarios. En este caso, puede introducir un ID de usuario o un ID de grupo de usuarios.
Figura 2 Configuración de permisos de espacio de nombres
Los permisos se pueden personalizar según sea necesario. Después de seleccionar Custom para Permission Type, haga clic en Add Custom Role a la derecha del parámetro Custom. En el cuadro de diálogo que se muestra, escriba un nombre y seleccione una regla. Una vez creada la regla personalizada, puede seleccionar un valor en el cuadro de lista desplegable Custom.
Figura 3 Permiso personalizado
- Haga clic en OK.
Uso de kubectl para configurar permisos de espacio de nombres
Cuando se accede a un clúster mediante kubectl, CCE utiliza el archivo kubeconfig.json generado en el clúster para la autenticación. Este archivo contiene información del usuario, basada en la cual CCE determina qué recursos de Kubernetes puede acceder kubectl. Los permisos registrados en un archivo kubeconfig.json varían de usuario a usuario. Cluster Permissions (basados en IAM) y Namespace Permissions (basados en Kubernetes RBAC) muestra los permisos que tiene un usuario.
Además de cluster-admin, admin, edit, y view, puede definir Roles y RoleBindings para configurar los permisos para agregar, eliminar, modificar y consultar recursos, como pods, implementaciones y servicios, en el espacio de nombres.
El procedimiento para crear un Role es muy simple. Para ser específico, especifique un espacio de nombres y, a continuación, defina las reglas. Las reglas del siguiente ejemplo son permitir las operaciones GET y LIST en los pods en el espacio de nombres predeterminado.
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default # Namespace name: role-example rules: - apiGroups: [""] resources: ["pods"] # The pod can be accessed. verbs: ["get", "list"] # The GET and LIST operations can be performed.
- apiGroups indica el grupo de API al que pertenece el recurso.
- resources indica los recursos que se pueden operar. Se admiten pods, Deployments, ConfigMaps y otros recursos de Kubernetes.
- verbs indica las operaciones que se pueden realizar. get indica la consulta de un objeto específico, y list indica la lista de todos los objetos de un tipo determinado. Otras opciones de valor incluyen create, update y delete.
Para obtener más información, consulte Uso de la autorización RBAC.
Después de crear un Role, puede enlazar el Role a un usuario específico, que se denomina RoleBinding. Lo siguiente es un ejemplo.
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: RoleBinding-example namespace: default annotations: CCE.com/IAM: 'true' roleRef: kind: Role name: role-example apiGroup: rbac.authorization.k8s.io subjects: - kind: User name: 0c97ac3cb280f4d91fa7c0096739e1f8 # User ID of the user-example apiGroup: rbac.authorization.k8s.io
La sección subjects vincula un rol con un usuario de IAM para que el usuario de IAM pueda obtener los permisos definidos en el rol, como se muestra en la siguiente figura.
También puede especificar un grupo de usuarios en la sección subjects. En este caso, todos los usuarios del grupo de usuarios obtienen los permisos definidos en el rol.
subjects:
- kind: Group
name: 0c96fad22880f32a3f84c009862af6f7 # User group ID
apiGroup: rbac.authorization.k8s.io
Utilice el ejemplo de usuario de IAM para conectarse al clúster y obtener la información del pod. A continuación se muestra un ejemplo de la información de pod devuelta.
# kubectl get pod NAME READY STATUS RESTARTS AGE deployment-389584-2-6f6bd4c574-2n9rk 1/1 Running 0 4d7h deployment-389584-2-6f6bd4c574-7s5qw 1/1 Running 0 4d7h deployment-3895841-746b97b455-86g77 1/1 Running 0 4d7h deployment-3895841-746b97b455-twvpn 1/1 Running 0 4d7h nginx-658dff48ff-7rkph 1/1 Running 0 4d9h nginx-658dff48ff-njdhj 1/1 Running 0 4d9h # kubectl get pod nginx-658dff48ff-7rkph NAME READY STATUS RESTARTS AGE nginx-658dff48ff-7rkph 1/1 Running 0 4d9h
Intente consultar Deployments y Services en el espacio de nombres. El resultado muestra que user-example no tiene los permisos necesarios. Intente consultar los pods en el espacio de nombres kube-system. El resultado muestra que user-example tampoco tiene los permisos necesarios. Esto indica que el usuario de IAM user-example solo tiene los permisos GET y LIST Pod en el espacio de nombres predeterminado, que es el mismo que se esperaba.
# kubectl get deploy Error from server (Forbidden): deployments.apps is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "deployments" in API group "apps" in the namespace "default" # kubectl get svc Error from server (Forbidden): services is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "services" in API group "" in the namespace "default" # kubectl get pod --namespace=kube-system Error from server (Forbidden): pods is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "pods" in API group "" in the namespace "kube-system"
Ejemplo: Asignación de todos los permisos de clúster (cluster-admin)
Puede usar el rol cluster-admin para asignar todos los permisos de un clúster. Este rol contiene los permisos para los recursos del clúster (como PV y StorageClasses).
En el siguiente ejemplo de salida de kubectl, se ha creado un ClusterRoleBinding y enlaza el rol de cluster-admin al grupo de usuarios cce-role-group.
# kubectl get clusterrolebinding NAME ROLE AGE clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7 ClusterRole/cluster-admin 61s # kubectl get clusterrolebinding clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7 -oyaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: annotations: CCE.com/IAM: "true" creationTimestamp: "2021-06-23T09:15:22Z" name: clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7 resourceVersion: "36659058" selfLink: /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7 uid: d6cd43e9-b4ca-4b56-bc52-e36346fc1320 roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: 0c96fad22880f32a3f84c009862af6f7
Conéctese al clúster como usuario autorizado. Si se pueden consultar los PV y los StorageClasses, la configuración de permisos tiene efecto.
# kubectl get pv No resources found # kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE csi-disk everest-csi-provisioner Delete Immediate true 75d csi-disk-topology everest-csi-provisioner Delete WaitForFirstConsumer true 75d csi-nas everest-csi-provisioner Delete Immediate true 75d csi-obs everest-csi-provisioner Delete Immediate false 75d csi-sfsturbo everest-csi-provisioner Delete Immediate true 75d
Ejemplo: Asignación de todos los permisos de espacio de nombres (admin)
admin tiene todos los permisos en los espacios de nombres. Puede otorgar este rol a un usuario o grupo de usuarios para gestionar uno o todos los espacios de nombres.
En el siguiente ejemplo de salida de kubectl, se ha creado un RoleBinding, el rol de admin está enlazado al grupo de usuarios cce-role-group y el espacio de nombres de destino es el espacio de nombres predeterminado.
# kubectl get rolebinding NAME ROLE AGE clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7 ClusterRole/admin 18s # kubectl get rolebinding clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7 -oyaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: annotations: CCE.com/IAM: "true" creationTimestamp: "2021-06-24T01:30:08Z" name: clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7 namespace: default resourceVersion: "36963685" selfLink: /apis/rbac.authorization.k8s.io/v1/namespaces/default/rolebindings/clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7 uid: 6c6f46a6-8584-47da-83f5-9eef1f7b75d6 roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: admin subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: 0c96fad22880f32a3f84c009862af6f7
Conéctese a un clúster como usuario autorizado. En este ejemplo, puede crear y consultar recursos en el espacio de nombres predeterminado, pero no puede consultar recursos en el espacio de nombres del kube-system o en los recursos del clúster.
# kubectl get pod NAME READY STATUS RESTARTS AGE test-568d96f4f8-brdrp 1/1 Running 0 33m test-568d96f4f8-cgjqp 1/1 Running 0 33m # kubectl get pod -nkube-system Error from server (Forbidden): pods is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "pods" in API group "" in the namespace "kube-system" # kubectl get pv Error from server (Forbidden): persistentvolumes is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "persistentvolumes" in API group "" at the cluster scope
Ejemplo: Asignación de permisos de espacio de nombres de solo lectura (view)
El rol de view tiene los permisos de solo lectura en un espacio de nombres. Puede asignar permisos a los usuarios para ver uno o varios espacios de nombres.
En el siguiente ejemplo de salida de kubectl, se ha creado un RoleBinding, el rol de view está enlazado al grupo de usuarios cce-role-group y el espacio de nombres de destino es el espacio de nombres predeterminado.
# kubectl get rolebinding NAME ROLE AGE clusterrole_view_group0c96fad22880f32a3f84c009862af6f7 ClusterRole/view 7s # kubectl get rolebinding clusterrole_view_group0c96fad22880f32a3f84c009862af6f7 -oyaml apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: annotations: CCE.com/IAM: "true" creationTimestamp: "2021-06-24T01:36:53Z" name: clusterrole_view_group0c96fad22880f32a3f84c009862af6f7 namespace: default resourceVersion: "36965800" selfLink: /apis/rbac.authorization.k8s.io/v1/namespaces/default/rolebindings/clusterrole_view_group0c96fad22880f32a3f84c009862af6f7 uid: b86e2507-e735-494c-be55-c41a0c4ef0dd roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: view subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: 0c96fad22880f32a3f84c009862af6f7
Connect to the cluster as an authorized user. En este ejemplo, puede consultar recursos en el espacio de nombres predeterminado, pero no puede crear recursos.
# kubectl get pod NAME READY STATUS RESTARTS AGE test-568d96f4f8-brdrp 1/1 Running 0 40m test-568d96f4f8-cgjqp 1/1 Running 0 40m # kubectl run -i --tty --image tutum/dnsutils dnsutils --restart=Never --rm /bin/sh Error from server (Forbidden): pods is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot create resource "pods" in API group "" in the namespace "default"
Ejemplo: Asignación de permisos para un objeto de recurso específico de Kubernetes
Puede asignar permisos a un objeto de recurso de Kubernetes específico, como pod, Deployment y Service. Para obtener más información, véase Uso de kubectl para configurar permisos de espacio de nombres.