Anthos VM 런타임을 위한 역할 기반 액세스 제어(RBAC)

Anthos VM 런타임은 VM과 연관된 다양한 범위의 리소스를 관리합니다. 이러한 리소스에는 Anthos 정의 리소스, KubeVirt 정의 리소스, Kubernetes 리소스가 포함됩니다. Anthos VM 런타임은 역할 기반 액세스 제어(RBAC)를 사용하여 관리형 리소스의 권한을 설정하고 적용합니다. 이러한 리소스 작업을 지원하고 VM을 관리하기 위해 4개의 사전 구성된 ClusterRole이 제공됩니다.

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

이러한 기본 제공되는 역할은 Anthos VM 런타임과 관련된 커스텀 리소스에 대해 일반화된 액세스 모델을 제공합니다. 각 역할에는 리소스 작업을 위해 사전 설정된 권한이 포함되어 있습니다. 이 문서에는 클러스터 관리자가 고유 액세스 모델을 맞춤설정할 수 있도록 Anthos VM 런타임으로 관리되는 리소스 정보가 포함되어 있습니다.

사전 정의된 ClusterRole

이 섹션에서는 사전 정의된 각 ClusterRole에 대해 설명합니다. 이러한 ClusterRole은 Anthos VM 런타임이 사용 설정되었을 때만 사용 가능합니다.

  • Anthos VM 런타임이 사용 설정되었으면 4개의 사전 정의된 ClusterRole가 자동으로 생성됩니다.
  • Anthos VM 런타임이 사용 중지되어 있으면 4개의 사전 정의된 ClusterRole이 삭제됩니다.

다음 표에서는 클러스터 역할 및 관련 권한을 보여줍니다.

클러스터 역할 설명 액세스 동사
kubevm.admin 모든 Anthos 리소스에 대해 전체 액세스 권한을 부여합니다.
  • get
  • list
  • watch
  • delete
  • create
  • update
  • patch
  • deletecollection
kubevm.edit 모든 Anthos 리소스에 대해 읽기/쓰기 액세스 권한을 부여합니다.
  • get
  • list
  • watch
  • delete
  • create
  • update
  • patch
kubevm.view 모든 Anthos 리소스에 대해 읽기 액세스 권한을 부여합니다.
  • get
  • list
  • watch
kubevm.cluster.view 클러스터별 리소스에 대해 읽기 액세스 권한을 부여합니다. 이 클러스터 역할은 클러스터별 리소스에 대한 액세스가 필요하지만 수정/보기 역할이 네임스페이스에 바인딩된 경우에 필요합니다.
  • get
  • list
  • watch

집계된 ClusterRole

kubevm.admin, kubevm.view, kubevm.edit ClusterRole은 직접 사용되지 않습니다. 대신 이 세 가지 역할이 Kubernetes 기본 admin, view, edit ClusterRole에 각각 집계됩니다. 이러한 집계는 기본 Kubernetes 역할을 확장하므로, 이를 사용해서 Anthos 리소스를 관리할 수 있습니다. 집계된 ClusterRole에서는 Kubernetes 기본 역할을 사용하여 Anthos 리소스에 대한 액세스 권한을 관리하거나 사전 정의된 ClusterRole을 기반으로 자체 역할을 만들 수 있습니다.

집계 라벨 예시

kubevm.edit ClusterRole에는 Kubernetes edit ClusterRole로 집계되는 rbac.authorization.k8s.io/aggregate-to-edit: "true" 라벨이 있습니다. kubevm.edit ClusterRole의 권한은 Kubernetes 기본 edit 역할에 부여됩니다. kubevm.adminkubevm.view ClusterRole은 aggregate-to-admin 또는 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"
...

일반 사용자 시나리오

다음 시나리오에서는 RoleBinding 및 ClusterRoleBinding을 사용하여 사전 정의된 ClusterRole에 지정된 권한을 사용자 또는 사용자 집합에 부여하는 방법을 설명합니다.

클러스터 관리자

사용자 또는 사용자 집합에 관리자 권한을 부여하려면 Kubernetes 기본 admin ClusterRole을 사용하여 ClusterRoleBinding을 만듭니다.

ClusterRoleBinding 예시

다음 admin-charlie ClusterRoleBinding 예시는 사용자에게 charlie 관리자 권한을 부여합니다. ClusterRoleBinding은 집계를 통해 사전 정의된 kubevm.admin ClusterRole의 권한이 포함된 기본 Kubernetes admin ClusterRole의 권한을 사용합니다.

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

클러스터 뷰어

사용자 또는 사용자 집합에 뷰어 권한을 부여하려면 Kubernetes 기본 view ClusterRole을 사용하여 ClusterRoleBinding을 만듭니다. 비슷한 ClusterRoleBinding 예시는 ClusterRoleBinding 예시를 참조하세요.

클러스터 편집자

사용자 또는 사용자 집합에 편집자 권한을 부여하려면 Kubernetes 기본 edit ClusterRole을 사용하여 ClusterRoleBinding을 만듭니다. 비슷한 ClusterRoleBinding 예시는 ClusterRoleBinding 예시를 참조하세요.

네임스페이스 편집자

사용자 또는 사용자 집합에 네임스페이스 편집자 권한을 부여하려면 두 개의 개별 바인딩을 만들어야 합니다.

  • 네임스페이스에 RoleBinding을 만들고 기본 Kubernetes edit ClusterRole을 참조합니다.

  • 사전 정의된 kubevm.cluster.view ClusterRole을 참조하는 ClusterRoleBinding을 만듭니다. virtualmachinetypesstorageclasses와 같은 일부 리소스가 네임스페이스되지 않기 때문에 이 ClusterRoleBinding이 필요합니다.

역할 바인딩 예시(네임스페이스 편집자)

다음 RoleBinding 및 ClusterRoleBinding 예시는 charlie 사용자 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

네임스페이스 뷰어

사용자 또는 사용자 집합에 네임스페이스 뷰어 권한을 부여하려면 두 개의 개별 바인딩을 만들어야 합니다.

  • 네임스페이스에 RoleBinding을 만들고 기본 Kubernetes view ClusterRole을 참조합니다.

  • 사전 정의된 kubevm.cluster.view ClusterRole을 참조하는 ClusterRoleBinding을 만듭니다.

비슷한 RoleBinding 및 ClusterRoleBinding 예시는 역할 바인딩 예시(네임스페이스 편집자)를 참조하세요.

Anthos VM 런타임에 사용되는 리소스

다음 섹션에는 Anthos VM 런타임에 사용되는 리소스 테이블이 포함되어 있습니다. 이 섹션은 정보 제공 목적으로만 사용됩니다. 앞에 표시된 섹션에 설명된 일반적인 사용자 시나리오에서 사전 정의된 역할을 사용하려는 경우 이 정보는 정해진 특정 용도가 없습니다.

그러나 사전 정의된 역할을 사용하지 않으려면 이 리소스 정보에 따라 자신의 맞춤설정된 역할을 만들 수 있습니다.

Anthos 정의 리소스

사전 정의된 ClusterRole은 Anthos 정의 리소스에 대한 액세스에 집중되어 있습니다. 다음 표에서는 Anthos 리소스 및 사전 정의된 각 ClusterRole로 부여된 액세스 권한을 보여줍니다.

리소스 생성됨 클러스터별 kubevm.admin kubevm.view kubevm.edit kubevm.cluster.view
virtualmachineaccessrequests 전체 읽기 읽기 쓰기 겸용
virtualmachinedisks 전체 읽기 읽기 쓰기 겸용
virtualmachines 전체 읽기 읽기 쓰기 겸용
gpuallocations 전체 읽기 읽기 쓰기 겸용
guestenvironmentdata 전체 읽기 읽기 쓰기 겸용
vmruntimes 전체 읽기 읽기 쓰기 겸용 읽기
virtualmachinetypes 전체 읽기 읽기 쓰기 겸용 읽기
vmhighavailabilitypolicies 전체 읽기 읽기 쓰기 겸용 읽기
networkinterfaces 전체 읽기 읽기 쓰기 겸용
networks 전체 읽기 읽기 쓰기 겸용 읽기

KubeVirt 리소스

Anthos VM 런타임은 KubeVirt 오픈소스 프로젝트를 기반으로 합니다. 기본적으로 KubeVirt 리소스의 권한은 Anthos 관리 리소스와 비슷하게 기본 Kubernetes 역할에 자동으로 집계됩니다. 다음 표의 리소스 정보에 따라 자체 맞춤설정된 역할을 만듭니다.

리소스 생성됨 클러스터별
virtualmachineinstances/console
virtualmachineinstances/vnc
virtualmachineinstances/portforward
virtualmachineinstances/start
virtualmachineinstances/stop
virtualmachineinstances/restart
virtualmachines
virtualmachineinstances
datavolumes
storageprofiles
cdiconfigs

Kubernetes 리소스

Anthos VM 런타임 및 VM을 사용할 때는 다음 Kubernetes 리소스에 대한 액세스를 관리해야 할 수 있습니다. 다음 표의 리소스 정보에 따라 자체 맞춤설정된 역할을 만듭니다.

리소스 생성됨 클러스터별
pods
services
persistentvolumeclaims
secrets
nodes
storageclasses
configmaps

ClusterRole YAML 예시

다음 kubectl 명령어를 사용하여 ClusterRole에 대해 YAML을 검색할 수 있습니다.

kubectl get ClusterRole CLUSTERROLE_NAME -o yaml --kubeconfig KUBECONFIG_PATH

다음을 바꿉니다.

  • CLUSTERROLE_NAME: ClusterRole의 이름입니다(예: kubevm.cluster.view).
  • KUBECONFIG_PATH: 클러스터의 kubeconfig 파일 경로입니다.

다음은 4개의 사전 정의된 각 ClusterRole에 대한 명령어 출력 예시입니다.

  • 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