Permissões de namespace (com base no RBAC do Kubernetes)
Permissões de namespace (com base no RBAC do Kubernetes)
Você pode regular o acesso de usuários ou grupos de usuários aos recursos do Kubernetes em um único namespace com base em suas funções do RBAC do Kubernetes. A API do RBAC declara quatro tipos de objetos do Kubernetes: Role, ClusterRole, RoleBinding e ClusterRoleBinding, que são descritos a seguir:
- Role: define um conjunto de regras para acessar recursos do Kubernetes em um namespace.
- RoleBinding: define a relação entre usuários e funções.
- ClusterRole: define um conjunto de regras para acessar recursos do Kubernetes em um cluster (incluindo todos os namespaces).
- ClusterRoleBinding: define a relação entre usuários e funções de cluster.
Role e ClusterRole especificam ações que podem ser executadas em recursos específicos. RoleBinding e ClusterRoleBinding vinculam funções a usuários, grupos de usuários ou ServiceAccounts específicos. Ilustração:
- view (somente leitura): permissão somente leitura na maioria dos recursos em todos os namespaces ou selecionados.
- editar (desenvolvimento): permissões de leitura e gravação na maioria dos recursos em todos os namespaces ou selecionados. Se esse ClusterRole estiver configurado para todos os namespaces, sua capacidade será a mesma da permissão O&M.
- admin (O&M): permissões de leitura e gravação na maioria dos recursos em todos os namespaces e permissão somente leitura em nós, volumes de armazenamento, namespaces e gerenciamento de cotas.
- cluster-admin (administrador): permissões de leitura e gravação em todos os recursos em todos os namespaces.
- drainage-editor: drenar um nó.
- drainage-viewer: visualizar o status de drenagem de nodal, mas não pode drenar um nó.
Permissões de cluster (baseadas no IAM) e permissões de namespace (baseadas no Kubernetes RBAC)
Usuários com diferentes permissões de cluster (atribuídos usando o IAM) têm diferentes permissões de namespace (atribuídos usando o Kubernetes RBAC). Tabela 1 lista as permissões de namespace de diferentes usuários.
Usuário |
Clusters da v1.13 e posterior |
---|---|
Usuário com permissões de Tenant Administrator (por exemplo, uma conta) |
Todas as permissões de namespace |
Usuário do IAM com a função CCE Administrator |
Todas as permissões de namespace |
Usuário do IAM com a função CCE FullAccess ou CCE ReadOnlyAccess |
Requer autorização do Kubernetes RBAC. |
Usuário do IAM com a função Tenant Guest |
Requer autorização do Kubernetes RBAC. |
Precauções
- Depois que você cria um cluster, o CCE atribui automaticamente a permissão cluster-admin a você, o que significa que você tem controle total sobre todos os recursos em todos os namespaces do cluster. O ID de um usuário federado é alterado a cada logon e logout. Portanto, o usuário com as permissões é exibido como excluído. Nesse caso, não exclua as permissões. Caso contrário, a autenticação falha. É aconselhável conceder a permissão cluster-admin a um grupo de usuários no CCE e adicionar usuários federados ao grupo de usuários.
- Um usuário com a função Security Administrator tem todas as permissões do IAM, exceto a troca de função. Por exemplo, uma conta no grupo de usuários admin tem essa função por padrão. Somente esses usuários podem atribuir permissões na página Permissions no console do CCE.
Configurar permissões de namespace (no console)
Você pode regular o acesso de usuários ou grupos de usuários aos recursos do Kubernetes em um único namespace com base em suas funções do RBAC do Kubernetes.
- Efetue logon no console do CCE. No painel de navegação, escolha Permissions.
- Selecione um cluster para o qual você deseja adicionar permissões na lista suspensa à direita.
- Clique em Add Permissions no canto superior direito.
- Confirme o nome do cluster e selecione o namespace para o qual atribuir permissões. Por exemplo, selecione All namespaces, o usuário de destino ou grupo de usuários e selecione as permissões.
Se você não tiver permissões do IAM, não poderá selecionar usuários ou grupos de usuários ao configurar permissões para outros usuários ou grupos de usuários. Nesse caso, você pode inserir um ID de usuário ou um ID de grupo de usuários.
Figura 2 Configurar permissões de namespace
As permissões podem ser personalizadas conforme necessário. Depois de selecionar Custom para Permission Type, clique em Add Custom Role à direita do parâmetro Custom. Na caixa de diálogo exibida, insira um nome e selecione uma regra. Depois que a regra personalizada for criada, você poderá selecionar um valor na caixa de listagem suspensa Custom.
Figura 3 Permissão personalizada
- Clique em OK.
Usar o kubectl para configurar permissões de namespace
Quando você acessa um cluster usando kubectl, o CCE usa kubeconfig.json gerado no cluster para autenticação. Esse arquivo contém informações do usuário, com base no qual o CCE determina quais recursos do Kubernetes podem ser acessados pelo kubectl. As permissões registradas em um arquivo kubeconfig.json variam de usuário para usuário. As permissões que um usuário possui estão listadas em Permissões de cluster (baseadas no IAM) e permissões de namespace (baseadas no Kubernetes RBAC).
Além de cluster-admin, admin, edit e view, você pode definir Roles e RoleBindings para configurar as permissões para adicionar, excluir, modificar e consultar recursos, como pods, Implementações e Serviços, no namespace.
O procedimento para criar um Role é muito simples. Para ser específico, especifique um namespace e defina regras. As regras no exemplo a seguir são para permitir operações GET e LIST em pods no namespace padrão.
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 o grupo de API ao qual o recurso pertence.
- resources indica os recursos que podem ser operados. Pods, Implementações, ConfigMaps e outros recursos do Kubernetes são suportados.
- verbs indica as operações que podem ser realizadas. get indica a consulta de um objeto específico e list indica a listagem de todos os objetos de um determinado tipo. Outras opções de valor incluem create, update e delete.
Para obter detalhes, consulte Uso da autorização do RBAC.
Depois de criar um Role, você pode vincular o Role a um usuário específico, que é chamado de RoleBinding. O seguinte mostra um exemplo:
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
A seção subjects vincula uma Role a um usuário do IAM para que o usuário do IAM possa obter as permissões definidas na Role, conforme mostrado na figura a seguir.
Você também pode especificar um grupo de usuários na seção subjects. Nesse caso, todos os usuários no grupo de usuários obtêm as permissões definidas na Role.
subjects:
- kind: Group
name: 0c96fad22880f32a3f84c009862af6f7 # User group ID
apiGroup: rbac.authorization.k8s.io
Use o exemplo de usuário do usuário do IAM para se conectar ao cluster e obter as informações do pod. A seguir, um exemplo das informações do pod retornado.
# 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
Tente consultar Implementações e Serviços no namespace. A saída mostra que user-example não tem as permissões necessárias. Tente consultar os pods no kube-system do namespace. A saída mostra que user-example também não tem as permissões necessárias. Isso indica que o usuário do IAM user-example tem apenas as permissões GET e LIST Pod no namespace padrão, que é o mesmo que o esperado.
# 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"
Exemplo: atribuir permissões de administrador de cluster (cluster-admin)
Você pode usar a função cluster-admin para atribuir todas as permissões em um cluster. Esta função contém as permissões para todos os recursos de cluster.
No exemplo a seguir, um ClusterRoleBinding foi criado e vincula a função cluster-admin ao grupo de usuários 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
Conecte-se ao cluster como um usuário autorizado. Se os PVs e StorageClasses puderem ser consultados, a configuração de permissão entrará em vigor.
# 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
Exemplo: atribuir permissões de O&M de namespace (admin)
A função admin tem as permissões de leitura e gravação na maioria dos recursos de namespace. Você pode conceder a permissão admin em todos os namespaces para um usuário ou grupo de usuários.
No exemplo a seguir, um RoleBinding foi criado e vincula a função admin ao grupo de usuários cce-role-group.
# 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 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
Conecte-se ao cluster como um usuário autorizado. Se os PVs e StorageClasses puderem ser consultados, mas um namespace não puder ser criado, a configuração de permissão entrará em vigor.
# 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 # kubectl apply -f namespaces.yaml Error from server (Forbidden): namespaces is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot create resource "namespaces" in API group "" at the cluster scope
Exemplo: atribuir permissões de desenvolvedor de namespace (edit)
A função edit tem as permissões de leitura e gravação na maioria dos recursos de namespace. Você pode conceder a permissão edit em todos os namespaces a um usuário ou grupo de usuários.
No exemplo a seguir, um RoleBinding foi criado, a função de edição é vinculada ao grupo de usuários cce-role-group e o namespace de destino é o namespace padrão.
# 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: edit subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: 0c96fad22880f32a3f84c009862af6f7
Conecte-se ao cluster como um usuário autorizado. Neste exemplo, você pode criar e obter recursos no namespace padrão, mas não pode consultar recursos no namespace do kube-system ou recursos de cluster.
# 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
Exemplo: atribuir permissões de namespace somente leitura (view)
A função view tem as permissões somente leitura em um namespace. Você pode atribuir permissões aos usuários para exibir um ou vários namespaces.
Na saída de kubectl de exemplo a seguir, um RoleBinding foi criado, a função view é vinculada ao grupo de usuários cce-role-group e o namespace de destino é o namespace padrão.
# 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
Conecte-se ao cluster como um usuário autorizado. Neste exemplo, você pode consultar recursos no namespace padrão, mas não pode criar 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"
Exemplo: atribuir permissões para um objeto de recurso específico do Kubernetes
Você pode atribuir permissões a um objeto de recurso específico do Kubernetes, como pod, Implementação e Serviço. Para mais detalhes, consulte Usar o kubectl para configurar permissões de namespace.