Cloud IAM 정책 만들기

이 페이지에서는 Google Kubernetes Engine에서 승인 관련 Cloud Identity and Access Management(Cloud IAM) 정책을 만드는 방법을 설명합니다.

개요

모든 Google Cloud Platform(GCP), GKE, Kubernetes API 호출에는 요청 수행 계정에 필요한 권한이 있어야 합니다. 기본적으로 본인 외에는 프로젝트나 프로젝트 리소스에 액세스할 수 없습니다. Cloud Identity and Access Management를 사용하여 프로젝트에 액세스할 수 있는 사용자와 액세스한 사용자가 수행할 수 있는 작업을 관리할 수 있습니다. Cloud IAM 권한은 Kubernetes RBAC와 함께 작동하여 클러스터 또는 네임스페이스에 있는 특정 객체의 액세스를 세부적으로 제어할 수 있게 해줍니다. Cloud IAM은 GKE와 관련된 몇 가지 사전 정의된 역할을 제공하지만 GCP 프로젝트 및 조직 수준의 권한에 더욱 중점을 두고 있습니다.

사용자와 서비스 계정에 GCP 프로젝트에 대한 액세스 권한을 부여하려면 프로젝트 팀원으로 추가한 후 팀원에게 역할을 할당합니다. 역할은 계정이 액세스할 수 있는 GCP 리소스와 이러한 계정이 수행할 수 있는 작업을 정의합니다.

GKE에서 Cloud IAM을 사용하여 클러스터에 액세스하여 작업을 수행할 수 있는 사용자 및 서비스 계정을 관리할 수 있습니다.

시작하기 전에

이 작업을 준비하려면 다음 단계를 완료하세요.

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project [PROJECT_ID]
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 리전 클러스터를 사용하는 경우 기본 컴퓨팅 리전을 설정합니다.
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

Kubernetes RBAC와 상호작용

Kubernetes의 기본 역할 기반 액세스 제어(RBAC) 시스템을 통해 클러스터에 대한 액세스 권한을 관리할 수도 있습니다. RBAC는 클러스터 및 네임스페이스 수준에서 액세스를 제어하는 반면 Cloud IAM은 프로젝트 수준에서 작동합니다.

Cloud IAM 및 RBAC는 함께 작동 가능하며, 클러스터의 리소스를 사용하기 위해서는 어느 수준에서든 충분한 권한이 항목에 있어야 합니다.

Cloud IAM 역할

다음 섹션에서는 GCP에서 제공되는 Cloud IAM 역할을 설명합니다.

사전 정의된 GKE 역할

Cloud IAM은 특정 GCP 리소스에 대한 액세스 권한을 부여하고 다른 리소스에 승인되지 않은 액세스를 방지하는 사전 정의된 역할을 제공합니다.

Cloud IAM은 GKE에 다음과 같은 사전 정의된 역할을 제공합니다.

Kubernetes Engine 역할

역할 이름 설명 권한 최하위 리소스
roles/
container.admin
Kubernetes Engine 관리자 컨테이너 클러스터 및 관련 Kubernetes API 객체를 전체 관리할 수 있는 액세스 권한을 제공합니다. container.*
resourcemanager.projects.get resourcemanager.projects.list
프로젝트
roles/
container.clusterAdmin
Kubernetes Engine 클러스터 관리자 컨테이너 클러스터를 관리할 수 있는 액세스 권한을 제공합니다. container.clusters.create
container.clusters.delete container.clusters.get container.clusters.list container.clusters.update container.operations.* resourcemanager.projects.get resourcemanager.projects.list
프로젝트
roles/
container.clusterViewer
Kubernetes Engine 클러스터 뷰어 Kubernetes 클러스터에 대한 읽기 전용 액세스 권한입니다. container.clusters.get
container.clusters.list resourcemanager.projects.get resourcemanager.projects.list
roles/
container.developer
Kubernetes Engine 개발자 컨테이너 클러스터에 포함된 Kubernetes API 객체에 대한 전체 액세스 권한을 제공합니다. container.apiServices.*
container.backendConfigs.* container.bindings.* container.certificateSigningRequests.create container.certificateSigningRequests.delete container.certificateSigningRequests.get container.certificateSigningRequests.list container.certificateSigningRequests.update container.certificateSigningRequests.updateStatus container.clusterRoleBindings.get container.clusterRoleBindings.list container.clusterRoles.get container.clusterRoles.list container.clusters.get container.clusters.list container.componentStatuses.* container.configMaps.* container.controllerRevisions.get container.controllerRevisions.list container.cronJobs.* container.csiDrivers.* container.csiNodes.* container.customResourceDefinitions.* container.daemonSets.* container.deployments.* container.endpoints.* container.events.* container.horizontalPodAutoscalers.* container.ingresses.* container.initializerConfigurations.* container.jobs.* container.limitRanges.* container.localSubjectAccessReviews.* container.namespaces.* container.networkPolicies.* container.nodes.* container.persistentVolumeClaims.* container.persistentVolumes.* container.petSets.* container.podDisruptionBudgets.* container.podPresets.* container.podSecurityPolicies.get container.podSecurityPolicies.list container.podTemplates.* container.pods.* container.replicaSets.* container.replicationControllers.* container.resourceQuotas.* container.roleBindings.get container.roleBindings.list container.roles.get container.roles.list container.runtimeClasses.* container.scheduledJobs.* container.secrets.* container.selfSubjectAccessReviews.* container.serviceAccounts.* container.services.* container.statefulSets.* container.storageClasses.* container.subjectAccessReviews.* container.thirdPartyObjects.* container.thirdPartyResources.* container.tokenReviews.* resourcemanager.projects.get resourcemanager.projects.list
프로젝트
roles/
container.hostServiceAgentUser
Kubernetes Engine 호스트 서비스 에이전트 사용자 Kubernetes Engine 호스트 서비스 에이전트의 사용 액세스 권한입니다. compute.firewalls.get
container.hostServiceAgent.*
roles/
container.viewer
Kubernetes Engine 뷰어 GKE 리소스에 대한 읽기 전용 액세스 권한을 제공합니다. container.apiServices.get
container.apiServices.list container.backendConfigs.get container.backendConfigs.list container.bindings.get container.bindings.list container.certificateSigningRequests.get container.certificateSigningRequests.list container.clusterRoleBindings.get container.clusterRoleBindings.list container.clusterRoles.get container.clusterRoles.list container.clusters.get container.clusters.list container.componentStatuses.* container.configMaps.get container.configMaps.list container.controllerRevisions.get container.controllerRevisions.list container.cronJobs.get container.cronJobs.getStatus container.cronJobs.list container.csiDrivers.get container.csiDrivers.list container.csiNodes.get container.csiNodes.list container.customResourceDefinitions.get container.customResourceDefinitions.list container.daemonSets.get container.daemonSets.getStatus container.daemonSets.list container.deployments.get container.deployments.getStatus container.deployments.list container.endpoints.get container.endpoints.list container.events.get container.events.list container.horizontalPodAutoscalers.get container.horizontalPodAutoscalers.getStatus container.horizontalPodAutoscalers.list container.ingresses.get container.ingresses.getStatus container.ingresses.list container.initializerConfigurations.get container.initializerConfigurations.list container.jobs.get container.jobs.getStatus container.jobs.list container.limitRanges.get container.limitRanges.list container.namespaces.get container.namespaces.getStatus container.namespaces.list container.networkPolicies.get container.networkPolicies.list container.nodes.get container.nodes.getStatus container.nodes.list container.operations.* container.persistentVolumeClaims.get container.persistentVolumeClaims.getStatus container.persistentVolumeClaims.list container.persistentVolumes.get container.persistentVolumes.getStatus container.persistentVolumes.list container.petSets.get container.petSets.list container.podDisruptionBudgets.get container.podDisruptionBudgets.getStatus container.podDisruptionBudgets.list container.podPresets.get container.podPresets.list container.podSecurityPolicies.get container.podSecurityPolicies.list container.podTemplates.get container.podTemplates.list container.pods.get container.pods.getStatus container.pods.list container.replicaSets.get container.replicaSets.getScale container.replicaSets.getStatus container.replicaSets.list container.replicationControllers.get container.replicationControllers.getScale container.replicationControllers.getStatus container.replicationControllers.list container.resourceQuotas.get container.resourceQuotas.getStatus container.resourceQuotas.list container.roleBindings.get container.roleBindings.list container.roles.get container.roles.list container.runtimeClasses.get container.runtimeClasses.list container.scheduledJobs.get container.scheduledJobs.list container.serviceAccounts.get container.serviceAccounts.list container.services.get container.services.getStatus container.services.list container.statefulSets.get container.statefulSets.getStatus container.statefulSets.list container.storageClasses.get container.storageClasses.list container.thirdPartyObjects.get container.thirdPartyObjects.list container.thirdPartyResources.get container.thirdPartyResources.list container.tokenReviews.* resourcemanager.projects.get resourcemanager.projects.list
프로젝트

각 Cloud IAM 역할별로 부여되는 권한에 대한 자세한 내용은 Cloud IAM 역할별로 부여되는 권한을 참조하세요.

기본 Cloud IAM 역할

기본 Cloud IAM 역할은 모든 GCP 리소스에 대한 전역, 프로젝트 수준의 액세스 권한을 사용자에게 부여합니다. 프로젝트와 클러스터를 안전하게 유지하려면 가능한 한 사전 정의된 역할을 사용합니다.

기본 역할에 대한 자세한 내용은 Cloud Identity and Access Management 문서의 기본 역할을 참조하세요.

서비스 계정 사용자 역할

서비스 계정 사용자는 GCP 사용자 계정에 서비스 계정에서 작업을 수행하는 것처럼 작업을 수행할 수 있는 권한을 부여합니다.

  • iam.serviceAccountUser 역할을 프로젝트의 사용자에게 부여하면 이후에 생성될 수 있는 서비스 계정을 포함하여 이 프로젝트의 모든 서비스 계정에 부여된 모든 역할이 사용자에게 부여됩니다.

  • iam.serviceAccountUser 역할을 특정 서비스 계정의 사용자에게 부여하면 이 서비스 계정에 부여된 모든 역할이 사용자에게 부여됩니다.

ServiceAccountUser 역할에 대한 자세한 내용은 Cloud IAM 문서의 ServiceAccountUser를 참조하세요.

다음 명령어는 서비스 계정 사용자 역할을 부여하는 구문을 보여줍니다.

gcloud iam service-accounts add-iam-policy-binding \
  [SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com \
  --member=user:[USER] \
  --role=roles/iam.serviceAccountUser
roles/
iam.serviceAccountUser
서비스 계정 사용자 작업을 서비스 계정으로 실행합니다. iam.serviceAccounts.actAs
iam.serviceAccounts.get
iam.serviceAccounts.list
resourcemanager.projects.get
resourcemanager.projects.list
서비스 계정
역할 이름 설명 권한 최하위 리소스

호스트 서비스 에이전트 사용자 역할

호스트 서비스 에이전트 사용자 역할은 공유 VPC 클러스터에서만 사용됩니다.

roles/
container.hostServiceAgentUser
Kubernetes Engine 호스트 서비스 에이전트 사용자 Kubernetes Engine 호스트 서비스 에이전트의 사용 액세스 권한입니다. compute.firewalls.get
container.hostServiceAgent.*
역할 이름 설명 권한 최하위 리소스

커스텀 역할

사전 정의된 역할이 요구사항을 충족하지 않는 경우 직접 정의한 권한이 포함된 커스텀 역할을 만들 수 있습니다.

커스텀 역할을 만들고 할당하는 방법은 커스텀 역할 만들기 및 관리를 참조하세요.

Cloud Identity and Access Management 역할에서 부여되는 권한 보기

gcloud 명령줄 도구 또는 GCP Console을 사용하여 각 역할에서 부여되는 권한을 확인할 수 있습니다.

gcloud

특정 역할에서 부여되는 권한을 보려면 다음 명령어를 실행하세요. [ROLE]은 Cloud Identity and Access Management 역할입니다. GKE 역할에는 roles/container.라는 프리픽스가 붙습니다.

gcloud iam roles describe roles/[ROLE]

예를 들면 다음과 같습니다.

gcloud iam roles describe roles/container.admin

Console

특정 역할에서 부여되는 권한을 확인하려면 다음 단계를 수행하세요.

  1. GCP Console의 IAM 메뉴에서 역할 섹션으로 이동합니다.

    IAM 메뉴로 이동

  2. 필터 테이블 필드에서 'GKE'를 입력합니다.

  3. 원하는 역할을 선택합니다.

Cloud Identity and Access Management 역할 관리

사용자의 Cloud IAM 역할과 권한을 관리하는 방법은 Cloud IAM 문서의 프로젝트 구성원에게 액세스 권한 부여, 변경, 취소를 참조하세요.

서비스 계정서비스 계정에 역할 부여를 참조하세요.

예시

다음은 GKE에서 Cloud Identity and Access Management 작동 방식의 몇 가지 예시입니다.

  • 새로운 직원이 입사했습니다. GCP 프로젝트에 새 직원을 추가해야 하지만 프로젝트의 클러스터와 다른 GCP 리소스에 대한 보기 권한만 필요합니다. 프로젝트 소유자는 새 직원에게 프로젝트 수준의 Compute 뷰어 역할을 할당합니다. 이 역할은 Compute Engine 리소스인 노드를 가져오고 나열할 수 있는 읽기 전용 액세스 권한을 제공합니다.
  • 이 직원이 작업에 참여함으로써 gcloud 또는 Google Cloud Platform Console을 사용하여 클러스터를 업데이트해야 합니다. 이 작업을 수행하려면 container.clusters.update 권한이 필요하므로 프로젝트 소유자는 직원에게 Kubernetes Engine 클러스터 관리자 역할을 할당합니다. 이제 직원의 권한에는 Kubernetes Engine 클러스터 관리자 역할과 Compute 뷰어 역할이 모두 부여되었습니다.
  • 직원이 배포에서 발생한 문제의 원인을 조사해야 합니다. 클러스터에서 실행 중인 Pod를 확인하기 위해 kubectl get pods를 실행해야 합니다. 이 직원에게는 이미 Compute 뷰어 역할이 있지만 Pod를 나열할 수는 없습니다. 이 직원에게는 Kubernetes Engine 뷰어 역할이 필요합니다.
  • 직원이 새 클러스터를 만들어야 합니다. 프로젝트 소유자는 이 직원에게 [PROJECT_NUMBER]-compute@developer.gserviceaccount.com 서비스 계정의 서비스 계정 사용자 역할을 부여하여 직원 계정에서 Compute Engine의 기본 서비스 계정에 액세스할 수 있도록 합니다. 이 서비스 계정에는 다양한 권한 집합을 제공하는 편집자 역할이 있습니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine 문서