Controle de acesso baseado em papéis (RBAC) para o ambiente de execução de VM do Anthos

O Anthos VM Runtime gerencia uma ampla variedade de recursos relacionados às VMs. Isso inclui recursos definidos pelo Anthos, recursos definidos pelo KubeVirt e recursos do Kubernetes. O Anthos VM Runtime usa controle de acesso baseado em papéis (RBAC) para definir e aplicar permissões a recursos gerenciados. Para ajudar você a trabalhar com esses recursos e gerenciar suas VMs, fornecemos quatro ClusterRoles pré-configurados:

  • kubevm.admin
  • kubevm.edit
  • kubevm.view
  • kubevm.cluster.view

Esses papéis integrados oferecem um modelo de acesso generalizado nos recursos personalizados relacionados ao ambiente de execução da VM do Anthos. Cada papel tem permissões predefinidas para operar nos recursos. Neste documento, apresentamos informações sobre os recursos que o Anthos VM Runtime gerencia para que os administradores de clusters possam personalizar o próprio modelo de acesso.

ClusterRoles predefinidos

Nesta seção, descrevemos cada um dos ClusterRoles predefinidos. Esses ClusterRoles estão disponíveis apenas quando o Anthos VM Runtime está ativado:

  • Quando o Anthos VM Runtime está ativado, os quatro ClusterRoles predefinidos são criados automaticamente.
  • Quando o Anthos VM Runtime está desativado, os quatro ClusterRoles predefinidos são excluídos.

A tabela a seguir lista os papéis do cluster e as permissões relacionadas a eles:

Papel do cluster Descrição Verbos de acesso
kubevm.admin Concede acesso total a todos os recursos do Anthos.
  • get
  • list
  • watch
  • delete
  • create
  • update
  • patch
  • deletecollection
kubevm.edit Concede acesso de leitura/gravação a todos os recursos do Anthos.
  • get
  • list
  • watch
  • delete
  • create
  • update
  • patch
kubevm.view Concede acesso de leitura a todos os recursos do Anthos.
  • get
  • list
  • watch
kubevm.cluster.view Concede acesso de leitura a recursos do cluster. Esse papel de cluster é necessário quando o papel de edição/visualização está vinculado a um namespace, enquanto o acesso a recursos no cluster é necessário.
  • get
  • list
  • watch

ClusterRoles agregados

Os ClusterRoles kubevm.admin, kubevm.view e kubevm.edit não são usados diretamente. Em vez disso, esses três papéis são agregados aos ClusterRoles padrão admin, view e edit do Kubernetes, respectivamente. Essa agregação estende os papéis padrão do Kubernetes para que possam ser usados para gerenciar os recursos do Anthos. Com ClusterRoles agregados, você pode usar papéis padrão do Kubernetes para gerenciar o acesso a recursos do Anthos ou criar seus próprios papéis com base nos ClusterRoles predefinidos.

Exemplo de rótulo de agregação

O ClusterRole kubevm.edit tem o rótulo rbac.authorization.k8s.io/aggregate-to-edit: "true", que o agrega ao ClusterRole edit do Kubernetes. As permissões no ClusterRole kubevm.edit são concedidas ao papel edit padrão do Kubernetes. Os ClusterRoles kubevm.admin e kubevm.view são agregados de maneira semelhante às anotações aggregate-to-admin ou aggregate-to-view.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
    name: kubevm.edit
    labels:
      kubevm: kubevm.edit
      rbac.authorization.k8s.io/aggregate-to-edit: "true"
...

Cenários típicos de usuários

As seções a seguir descrevem como usar RoleBinding e ClusterRoleBinding para conceder as permissões especificadas nos ClusterRoles predefinidos a um usuário ou a um conjunto de usuários.

Administrador de clusters

Para conceder permissões de administrador a um usuário ou conjunto de usuários, crie um ClusterRoleBinding com o ClusterRole admin padrão do Kubernetes.

ClusterRoleBinding de exemplo

O exemplo de ClusterRoleBinding admin-charlie a seguir fornece permissões de administrador charlie ao usuário. O ClusterRoleBinding usa permissões do ClusterRole admin padrão do Kubernetes, que inclui permissões do ClusterRole kubevm.admin predefinido por agregação.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-charlie
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: charlie

Leitor de cluster

Para conceder permissões de leitor a um usuário ou conjunto de usuários, crie um ClusterRoleBinding com o ClusterRole view padrão do Kubernetes. Consulte ClusterRoleBinding de exemplo para ver um exemplo de ClusterRoleBinding.

Editor de cluster

Para conceder permissões de edição a um usuário ou a um conjunto de usuários, crie um ClusterRoleBinding com o ClusterRole edit padrão do Kubernetes. Consulte ClusterRoleBinding de exemplo para ver um exemplo de ClusterRoleBinding.

Editor com namespace

Para conceder permissões de editor com namespace a um usuário ou a um conjunto de usuários, você precisa criar duas vinculações separadas:

  • Crie um "RoleBinding" no namespace e faça referência ao ClusterRole edit padrão do Kubernetes.

  • Crie um ClusterRoleBinding que faça referência ao ClusterRole kubevm.cluster.view predefinido. Esse ClusterRoleBinding é necessário porque alguns recursos, como virtualmachinetypes e storageclasses, não são namespaces.

Exemplos de vinculação de papéis (editor de namespaces)

Os seguintes exemplos de RoleBinding e ClusterRoleBinding oferecem ao usuáriocharlie permissões de editor para recursos no namespace default:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: edit-charlie
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: edit
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: charlie
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubevm-cluster-view-charlie
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubevm.cluster.view
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: charlie

Leitor com namespace

Para conceder permissões de leitor com namespace a um usuário ou a um conjunto de usuários, você precisa criar duas vinculações separadas:

  • Crie um "RoleBinding" no namespace e faça referência ao ClusterRole view padrão do Kubernetes.

  • Crie um ClusterRoleBinding que faça referência ao ClusterRole kubevm.cluster.view predefinido.

Consulte Exemplos de vinculação de papéis (editor de namespace) para exemplos semelhantes de RoleBinding e ClusterRoleBinding.

Recursos usados pelo Anthos VM Runtime

As seções a seguir contêm tabelas de recursos usados pelo Anthos VM Runtime. Essas seções são apenas para fins informativos. Se você pretende usar papéis predefinidos nos cenários típicos de usuário descritos nas seções anteriores, não há uso específico para essas informações.

No entanto, se você não quiser usar os papéis predefinidos, use essas informações dos recursos para criar seus próprios papéis personalizados.

Recursos definidos pelo Anthos

Os ClusterRoles predefinidos focam no acesso a recursos definidos pelo Anthos. A tabela a seguir lista os recursos do Anthos e as permissões de acesso concedidas por cada um dos ClusterRoles predefinidos.

Recurso Gerado Em relação ao cluster kubevm.admin kubevm.view kubevm.edit kubevm.cluster.view
virtualmachineaccessrequests Completa Ler Leitura/gravação
virtualmachinedisks Completa Ler Leitura/gravação
virtualmachines Completa Ler Leitura/gravação
gpuallocations Completa Ler Leitura/gravação
guestenvironmentdata Sim Completa Ler Leitura/gravação
vmruntimes Sim Completa Ler Leitura/gravação Ler
virtualmachinetypes Sim Completa Ler Leitura/gravação Ler
vmhighavailabilitypolicies Sim Completa Ler Leitura/gravação Ler
networkinterfaces Sim Completa Ler Leitura/gravação
networks Sim Completa Ler Leitura/gravação Ler

Recursos do KubeVirt

O ambiente de execução da VM do Anthos é baseado no projeto de código aberto KubeVirt. Por padrão, as permissões dos recursos do KubeVirt são agregadas automaticamente aos papéis padrão do Kubernetes, semelhantes aos recursos gerenciados pelo Anthos. Use as informações do recurso na tabela a seguir se quiser criar os próprios papéis personalizados:

Recurso Gerado Em relação ao cluster
virtualmachineinstances/console
virtualmachineinstances/vnc
virtualmachineinstances/portforward
virtualmachineinstances/start
virtualmachineinstances/stop
virtualmachineinstances/restart
virtualmachines Sim
virtualmachineinstances Sim
datavolumes
storageprofiles Sim
cdiconfigs Sim

Recursos do Kubernetes

Ao trabalhar com o Anthos VM Runtime e as VMs, talvez seja necessário gerenciar o acesso aos seguintes recursos do Kubernetes. Use as informações do recurso na tabela a seguir se quiser criar os próprios papéis personalizados:

Recurso Gerado Em relação ao cluster
pods Sim
services
persistentvolumeclaims
secrets
nodes Sim
storageclasses Sim
configmaps

Exemplos de YAML do ClusterRole

É possível recuperar YAML para os ClusterRoles com o seguinte comando kubectl:

kubectl get ClusterRole CLUSTERROLE_NAME -o yaml --kubeconfig KUBECONFIG_PATH

Substitua:

  • CLUSTERROLE_NAME: o nome do ClusterRole, como kubevm.cluster.view.
  • KUBECONFIG_PATH: o caminho do arquivo kubeconfig do cluster.

Veja abaixo exemplos de resposta ao comando para cada um dos quatro ClusterRoles predefinidos:

  • kubevm.admin

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      creationTimestamp: "2022-10-11T21:10:31Z"
      labels:
        kubevm: kubevm.admin
        rbac.authorization.k8s.io/aggregate-to-admin: "true"
      name: kubevm.admin
      resourceVersion: "16654950"
      uid: 3296c279-6e85-4ea6-b250-548bf0c3e935
    rules:
    - apiGroups:
      - vm.cluster.gke.io
      resources:
      - virtualmachineaccessrequests
      - virtualmachinedisks
      - virtualmachines
      - gpuallocations
      - guestenvironmentdata
      - vmruntimes
      - virtualmachinetypes
      - vmhighavailabilitypolicies
      verbs:
      - get
      - delete
      - create
      - update
      - patch
      - list
      - watch
      - deletecollection
    - apiGroups:
      - networking.gke.io
      resources:
      - networkinterfaces
      - networks
      verbs:
      - get
      - delete
      - create
      - update
      - patch
      - list
      - watch
      - deletecollection
    
  • kubevm.edit

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      creationTimestamp: "2022-10-11T21:10:31Z"
      labels:
        kubevm: kubevm.edit
        rbac.authorization.k8s.io/aggregate-to-edit: "true"
      name: kubevm.edit
      resourceVersion: "16654951"
      uid: 237bf9ae-b2c8-4303-94dc-e6425a2df331
    rules:
    - apiGroups:
      - vm.cluster.gke.io
      resources:
      - virtualmachineaccessrequests
      - virtualmachinedisks
      - virtualmachines
      - gpuallocations
      - guestenvironmentdata
      - vmruntimes
      - virtualmachinetypes
      - vmhighavailabilitypolicies
      verbs:
      - get
      - delete
      - create
      - update
      - patch
      - list
      - watch
    - apiGroups:
      - networking.gke.io
      resources:
      - networkinterfaces
      - networks
      verbs:
      - get
      - delete
      - create
      - update
      - patch
      - list
      - watch
    
  • kubevm.view

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      creationTimestamp: "2022-10-11T21:10:31Z"
      labels:
        kubevm: kubevm.view
        rbac.authorization.k8s.io/aggregate-to-view: "true"
      name: kubevm.view
      resourceVersion: "16654953"
      uid: b5b54e2d-0097-4698-abbd-aeac212d0a34
    rules:
    - apiGroups:
      - vm.cluster.gke.io
      resources:
      - virtualmachineaccessrequests
      - virtualmachinedisks
      - virtualmachines
      - gpuallocations
      - guestenvironmentdata
      - vmruntimes
      - virtualmachinetypes
      - vmhighavailabilitypolicies
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - networking.gke.io
      resources:
      - networkinterfaces
      - networks
      verbs:
      - get
      - list
      - watch
    
  • kubevm.cluster.view

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      creationTimestamp: "2022-10-11T21:10:31Z"
      labels:
        kubevm: kubevm.cluster.view
      name: kubevm.cluster.view
      resourceVersion: "16654956"
      uid: b25dde64-67da-488b-81d2-1a08f9a4a7c1
    rules:
    - apiGroups:
      - vm.cluster.gke.io
      resources:
      - vmruntimes
      - virtualmachinetypes
      - vmhighavailabilitypolicies
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - networking.gke.io
      resources:
      - networks
      verbs:
      - get
      - list
      - watch