Compute Engine 리소스에 대한 액세스 권한 부여하기

Compute Engine 리소스에 대한 Cloud IAM 정책을 통해 해당 리소스에 대한 Cloud IAM 역할을 관리하여 VM 인스턴스, 디스크, 이미지 등 특정 리소스에 대한 액세스 권한을 부여할 수 있습니다. 이로써 공동작업자에게 작업에 필요한 특정 리소스로 제한하여 권한을 부여하는 등 최소 권한 원칙을 유연하게 적용하는 것이 가능합니다.

리소스는 상위 리소스의 정책도 상속합니다. 리소스의 효과적인 정책은 해당 리소스에서 설정하는 정책 통합과 리소스 계층구조의 상위에서 상속된 정책입니다.

리소스에 멤버를 결합하거나 리소스에 정책을 설정할 때 멤버에게 초대 이메일이 발송되지는 않습니다. 대신에 멤버마다 액세스 권한이 직접 업데이트됩니다.

Cloud IAM 정책에 포함할 수 있는 멤버의 유형(사용자, 그룹 등)에 대한 자세한 내용은 Cloud IAM 문서를 참조하세요.

시작하기 전에

지원되는 리소스

현재 액세스 권한을 부여할 수 있는 Compute Engine 리소스는 다음과 같습니다.

다음 리소스에 대한 액세스 권한도 부여할 수 있지만, 이 기능은 현재 베타 버전이므로 관련된 gcloud beta 또는 베타 API 명령어를 사용해야 합니다.

리소스에 대한 멤버 결합 추가 및 제거

리소스에 대한 Cloud IAM 결합은 해당 리소스의 멤버에게 특정 역할을 부여합니다. 인스턴스, 디스크, 이미지 및 스냅샷에 대한 Cloud IAM 결합은 Google Cloud Platform Console과 gcloud 명령줄 도구를 사용해 추가하거나 제거할 수 있습니다.

리소스의 모든 멤버에게 적용되는 Cloud IAM 정책을 업데이트하는 방법에 대한 자세한 내용은 리소스의 정책 가져오기 및 설정을 참조하세요.

콘솔

  1. 권한을 추가할 각 리소스 페이지로 이동합니다.
  2. 업데이트할 리소스 옆에 있는 체크박스를 선택합니다.
  3. 정보 패널 보기를 클릭하여 권한 열을 펼칩니다.
  4. 멤버를 추가하는 방법은 다음과 같습니다.
    1. 멤버 추가 필드에서 멤버를 1명 이상 추가합니다.
    2. 역할 선택 드롭다운 메뉴에서 역할을 1개 이상 선택합니다.
    3. 추가를 클릭하여 변경사항을 저장합니다.
  5. 멤버를 제거하는 방법은 다음과 같습니다.
    1. 리소스에 역할 1개 이상에 대한 정책 결합이 있다면 해당 역할이 펼칠 수 있는 카드로 표시됩니다. 멤버 1명 이상을 제거할 역할 카드를 클릭합니다.
    2. 삭제 아이콘(휴지통 모양의 삭제 아이콘)을 클릭하여 각 역할을 제거합니다.

gcloud

역할을 리소스의 멤버에게 부여하려면 리소스의 add-iam-policy-binding 하위 명령어를 --member--role 플래그와 함께 사용합니다.

gcloud compute [RESOURCE_TYPE] add-iam-policy-binding [RESOURCE_NAME] \
    --member='[MEMBER]' \
    --role='[ROLE]'

또는 정책 결합을 제거하려면 리소스의 remove-iam-policy-binding 하위 명령어를 --member--role 플래그와 함께 사용합니다.

gcloud compute [RESOURCE_TYPE] remove-iam-policy-binding [RESOURCE_NAME] \
    --member='[MEMBER]' \
    --role='[ROLE]'

각 항목의 의미는 다음과 같습니다.

  • [RESOURCE_TYPE]은 리소스의 유형이며 disks, images, instances, instance-templates, sole-tenancy node-groups, sole-tenancy node-templates 또는 snapshots입니다.
  • [RESOURCE_NAME]은 리소스 이름입니다. 예를 들면 my_instance와 같습니다.
  • [MEMBER]은 결합이 추가되는 멤버입니다.
    • user|group|serviceAccount:email 또는 domain:domain 형식이어야 합니다. 예를 들면 user:test-user@gmail.com, group:admins@example.com, serviceAccount:test123@example.domain.com, domain:example.domain.com 등입니다.
    • 다음 특수 값 중 하나일 수도 있습니다.
      • allUsers: Google 계정 유무에 상관없이 인터넷에 연결된 모든 사용자
      • allAuthenticatedUsers: Google 계정 또는 서비스 계정으로 인증한 모든 사용자
  • [ROLE]은 해당 멤버에게 추가할 역할입니다.

현재 베타 버전인 리소스에 대한 액세스 권한을 부여하는 경우 gcloud beta compute 명령어를 대신 사용하세요.

리소스의 정책 가져오기 및 설정

리소스에 적용되는 Cloud IAM 정책은 리소스에 대한 액세스 권한이 부여된 사용자를 정의하는 문들의 집합입니다.

리소스 정책은 읽기-수정-쓰기 패턴을 사용해 업데이트할 수 있습니다. 이 패턴에 따라 현재 리소스에 적용되는 Cloud IAM 정책을 먼저 가져와서 업데이트한 후 마지막으로 설정합니다. 이 패턴에 대한 자세한 내용은 Cloud IAM 문서를 참조하세요.

gcloud

리소스의 정책을 가져오거나 설정하기 위해 gcloud 명령어를 실행할 때는 JSON 또는 YAML 파일을 사용할 수 있습니다. 이 섹션의 예시에서는 JSON을 사용합니다.

  1. 리소스의 get-iam-policy 하위 명령어를 실행하여 수정할 정책을 가져옵니다.

    gcloud compute [RESOURCE_TYPE] get-iam-policy [RESOURCE_NAME] --format json > policy.json
    

    각 항목의 의미는 다음과 같습니다.

    • [RESOURCE_TYPE]은 리소스의 유형이며 disks, images, instances, instance-templates 또는 snapshots입니다.
    • [RESOURCE_NAME]은 리소스 이름입니다.

    예를 들어 이름이 example-disk인 디스크에 적용되는 Cloud IAM 정책을 가져오려면 다음과 같이 실행합니다.

    gcloud compute disks get-iam-policy example-disk --format json > policy.json
    
  2. 비어있는 JSON 정책 파일은 다음과 비슷한 모습입니다. etag 속성은 마지막 요청 이후 정책 변경 여부를 확인하는 데 사용됩니다.

    {
      "etag": "ACAB"
    }
    
  3. 텍스트 편집기를 사용해 JSON 파일을 업데이트합니다. 배열이 포함된 bindings 객체를 작성합니다. 배열의 각 객체에는 members 배열과 해당 멤버에게 연결된 역할이 있습니다. 예를 들어 all-devs@example.comsome-devs@other-place.com 그룹에 roles/compute.imageUser 역할을 부여하고 bob@example.com에게 roles/compute.storageAdmin 역할을 부여하는 방법은 다음과 같습니다.

    {
      "bindings": [
        {
          "members": [
            "group:all-devs@example.com",
            "group:other-devs@other-place.com"
          ],
          "role": "roles/compute.imageUser"
        },
        {
          "members": [
            "user:bob@example.com"
          ],
          "role": "roles/compute.storageAdmin"
        }
      ],
      "etag": "ACAB"
    }
    
  4. 리소스의 set-iam-policy 하위 명령어를 실행하면서 새로운 정책이 포함된 JSON 파일 경로를 제공하여 정책을 업데이트합니다. JSON 파일의 etag 값이 리소스의 현재 etag 값과 일치하는 경우에만 명령어가 성공적으로 실행됩니다.

    gcloud compute [RESOURCE_TYPE] set-iam-policy [RESOURCE_NAME] policy.json
    

    예를 들어 이름이 example-disk인 디스크에 적용되는 Cloud IAM 정책을 설정하려면 다음과 같이 실행합니다.

    gcloud compute disks set-iam-policy example-disk policy.json
    
  5. 명령어가 출력하는 업데이트된 정책에 업데이트된 etag 값이 포함되어 있습니다.

    bindings:
    - members:
      - user:bob@example.com
        role: roles/compute.storageAdmin
    - members:
      - group:all-devs@example.com
      - group:other-devs@other-place.com
        role: roles/compute.imageUser
    etag: BwUjMhXbSPU=
    

API

기존 정책을 수정하는 방법은 다음과 같습니다.

  1. 리소스의 getIamPolicy() 메소드를 호출하여 기존 정책을 가져옵니다.

    예를 들어 리소스가 디스크라면 다음과 같습니다.

    GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/disks/[DISK_NAME]/getIamPolicy
    
  2. 요청이 정책을 반환합니다. 여기에는 bindings 배열(결합이 존재하는 경우) 및 etag 값이 포함됩니다. etag 속성은 마지막 요청 이후 정책 변경 여부를 확인하는 데 사용됩니다.

    {
      "etag": "BwVvzaUs8EY=",
      "bindings":[
        {
          "role":"roles/compute.storageAdmin",
          "members":[
            "user:bob@example.com",
            "serviceAccount:service-account@my-project.iam.gserviceaccount.com"
          ]
        },
        {
          "role":"roles/compute.imageUser",
          "members":[
            "user:email1@gmail.com",
            "user:email2@gmail.com",
            "user:email3@gmail.com"
          ]
        }
      ]
    }
    
  3. 필요에 따라 정책을 수정한 후 setIamPolicy()를 호출하여 업데이트된 정책을 설정합니다.

    예를 들어 email2@gmail.com에게서 compute.imageUser 역할을 취소할 경우 요청은 다음과 비슷한 모습이 됩니다.

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/disks/[DISK_NAME]/setIamPolicy

    {
      "etag": "BwVvzaUs8EY=",
      "bindings":[
        {
          "role":"roles/compute.storageAdmin",
          "members":[
            "user:bob@example.com",
            "serviceAccount:service-account@my-project.iam.gserviceaccount.com"
          ]
        },
        {
          "role":"roles/compute.imageUser",
          "members":[
            "user:email1@gmail.com",
            "user:email3@gmail.com"
          ]
        }
      ]
    }
    
  4. 응답에 표시되는 업데이트된 정책에 업데이트된 etag 값이 포함되어 있습니다.

    {
      "etag": "BwVwGgz7Arg=",
      "bindings":[
        {
          "role":"roles/compute.storageAdmin",
          "members":[
            "user:bob@example.com",
            "serviceAccount:service-account@my-project.iam.gserviceaccount.com"
          ]
        },
        {
          "role":"roles/compute.imageUser",
          "members":[
            "user:email1@gmail.com",
            "user:email3@gmail.com"
          ]
        }
      ]
    }
    

호출자의 권한 유무 테스트

testIamPermissions API 메소드는 리소스 URL과 권한 집합을 입력 매개변수로 취하고, 호출자에게 허용된 권한 집합을 반환합니다. 모든 지원되는 리소스에 이 메소드를 사용할 수 있습니다.

GCP를 직접 사용하여 권한을 관리하는 경우 일반적으로 testIamPermission을 호출하지 않습니다. testIamPermissions는 맞춤설정된 그래픽 사용자 인터페이스와 같은 독점 소프트웨어와 통합할 수 있습니다. 예를 들어 Compute Engine API에서 GUI를 빌드할 때 GUI에 인스턴스를 시작하는 '시작' 버튼이 있다면 compute.instances.testIamPermissions()를 호출하여 버튼을 사용으로 설정할지 아니면 사용 안 함으로 설정할지 결정할 수 있습니다.

호출자에게 리소스에 대한 특정 권한이 있는지 테스트하는 방법은 다음과 같습니다.

  1. 요청을 리소스에게 전송하면서 확인할 권한 목록을 요청 본문에 추가합니다.

    예를 들어 리소스가 인스턴스라면 다음과 같이 compute.instances.start, compute.instances.stop, compute.instances.delete 권한을 확인할 수 있습니다.

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]/setIamPolicy

    {
      "permissions": [
        "compute.instances.start",
        "compute.instances.stop",
        "compute.instances.delete"
       ]
    }
    
  2. 요청이 호출자에게 사용 설정되어 있는 권한을 반환합니다.

    {
      "permissions": [
        "compute.instances.start",
        "compute.instances.stop"
      ]
    }
    

시나리오

조직 내 특정 이미지 공유

임의의 회사가 IT 부서에서 인증한 머신 이미지를 가지고 있으면서 특정 팀에 일부 이미지에 액세스할 수 있는 권한을 부여한다고 가정하겠습니다. 이때 Compute Engine 리소스에게 적용되는 Cloud IAM 정책이 없다면 회사는 모든 팀에 모든 이미지에 액세스할 수 있는 권한을 부여하거나, 혹은 이미지를 다수의 프로젝트에 저장해야 합니다. 반대로 Compute Engine 리소스에 적용되는 Cloud IAM 정책이 있다면 회사는 모든 이미지를 단일 프로젝트에 저장하여 쉽게 관리하는 동시에 작업에 필요한 이미지에 한해 액세스할 수 있는 권한을 팀에게 부여할 수 있습니다.

아래 예에서는 images-project에 여러 이미지가 있습니다. all-devs@example.com 그룹은 ubuntu-base-v1-0 이미지를 사용할 액세스 권한이 있지만 ubuntu-v1-1-test 이미지 또는 mysql-v1 이미지에 대해서는 권한이 없습니다. 또한 mysql-v1 이미지를 사용할 액세스 권한은 db-admins@example.com 그룹에게만 있습니다. 이러한 설정으로 구성하려면 ubuntu-base-v1-0 이미지에는 all-devs@example.com이미지 사용자 역할을 부여하는 Cloud IAM 정책을, mysql-v1에는 db-admin@example.com이미지 사용자 역할을 부여하는 Cloud IAM 정책을 설정합니다.

gcloud 명령줄 도구를 사용하여 all-devs@example.comshared-image 이미지 사용 권한을 부여하는 방법은 다음과 같습니다.

  1. Cloud IAM 정책을 가져옵니다.

    gcloud compute images get-iam-policy shared-image --format json > policy.json
    
  2. 텍스트 편집기에서 policy.json을 수정하여 all-devs@example.comroles/compute.imageUser 역할을 부여합니다.

    {
      "bindings": [
        {
          "members": [
            "group:all-devs@example.com"
          ],
          "role": "roles/compute.imageUser"
        }
      ],
      "etag": "ACAB"
    }
    
  3. 수정된 policy.json을 이미지에 적용합니다.

    gcloud compute images set-iam-policy shared-image policy.json
    

특정 이미지의 공개 공유

Compute Engine 사용자에게 이미지를 게시하는 Google 파트너가 있다고 가정하겠습니다. 파트너는 이미지에 Cloud IAM 정책을 설정하여 Compute Engine의 인증된 모든 사용자와 공유할 수 있습니다.

Compute Engine API에서 모든 Compute Engine 사용자가 shared-image를 사용할 수 있도록 하는 방법은 다음과 같습니다.

  1. Cloud IAM 정책을 가져옵니다.

    GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/images/shared-image/getIamPolicy
    
  2. 요청이 다음과 같이 정책을 반환합니다.

    {
     "etag": "ACAB"
    }
    
  3. 수정된 정책을 적용합니다.

    POST https://www.googleapis.com/compute/alpha/projects/[PROJECT_ID]/zones/[ZONE]/images/shared-image/setIamPolicy
    {
      "bindings": [
        {
          "members": [
            "allAuthenticatedUsers"
          ],
          "role": "roles/compute.imageUser"
        }
      ],
      "etag": "ACAB"
    }
    
  4. 요청이 업데이트된 정책을 반환합니다.

    {
     "etag": "BwVa45js9SQ=",
     "bindings": [
       {
         "role": "roles/compute.imageUser",
         "members": [
           "allAuthenticatedUsers"
         ]
       }
     ]
    }
    

문제를 디버깅할 목적으로 팀원에게 인스턴스에 대한 액세스 권한 부여

인스턴스를 만들었지만 문제를 디버깅하려면 alice@example.com의 도움이 필요하다고 가정하겠습니다. 인스턴스의 Cloud IAM 정책을 수정하여 alice@example.com에게 인스턴스에 대한 Compute 인스턴스 관리자(v1) 역할을 부여합니다.

인스턴스가 서비스 계정으로 실행되도록 구성된 경우 Alice가 SSH로 연결하거나, 메타데이터를 설정하거나, 디스크를 연결할 수 있도록 허용하려면 alice@example.com에게 인스턴스의 서비스 계정에 대한 서비스 계정 사용자 역할을 부여합니다. 서비스 계정에 대해 이 역할을 부여해야 하는 이유는 이러한 세 가지 작업을 통해 Alice가 대신해서 명령어를 실행할 수 있기 때문입니다. 서비스 계정을 리소스로 처리하는 방법에 대한 자세한 내용은 서비스 계정 권한을 참조하세요.

GCP Console에서 Alice에게 인스턴스를 관리하도록 허용하고 싶다면 compute.projects.get 권한을 가진 역할을 부여하세요. 예를 들어 이러한 권한이 포함된 Compute 뷰어 역할을 Alice에게 부여할 수 있습니다. 이 역할은 프로젝트에 속한 Compute Engine 리소스를 모두 확인할 수는 있지만 디스크, 이미지 또는 스냅샷의 데이터는 읽어올 수 없습니다. 그 밖에 필요한 권한이 포함된 커스텀 역할을 만들 수도 있습니다.

이를 위해 gcloud를 사용하는 방법은 다음과 같습니다.

  1. 인스턴스에 적용되는 Cloud IAM 정책을 가져옵니다.

    gcloud compute instances get-iam-policy example-instance --format json > policy.json
    
  2. 텍스트 편집기에서 policy.json을 수정합니다.

    {
      "bindings": [
        {
          "members": [
            "user:alice@example.com"
          ],
          "role": "roles/compute.instanceAdmin.v1"
        }
      ],
      "etag": "ACAB"
    }
    
  3. 수정된 policy.json을 인스턴스에 적용합니다.

    gcloud compute instances set-iam-policy example-instance policy.json
    
  4. alice@example.com에게 인스턴스의 서비스 계정에 대한 서비스 계정 사용자 역할을 부여합니다. 여기에서는 인스턴스의 서비스 계정이 data-reader-service-account@[PROJECT_ID].iam.gserviceaccount.com이라고 가정합니다.

     gcloud iam service-accounts add-iam-policy-binding \
         data-reader-service-account@[PROJECT_ID].iam.gserviceaccount.com \
         --member="user:alice@example.com" \
         --role="roles/iam.serviceAccountUser"
    

    gcloud가 다음을 반환합니다.

     bindings:
     - members:
       - user:alice@example.com
       role: roles/iam.serviceAccountUser
     etag: BwVa42MC-aY=
    
  5. alice@example.com에게 프로젝트에 대한 Compute 뷰어 역할을 부여합니다.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
        --member=user:alice@example.com \
        --role=roles/compute.viewer
    

    gcloud가 다음을 반환합니다.

    bindings:
    - members:
      - user:alice@example.com
      role: roles/iam.serviceAccountUser
    [...]
    etag: BwVa42MC-aY=
    

이제 Alice가 GCP Console에서 인스턴스를 볼 수 있으며, 인스턴스에 대해 메소드를 호출할 수 있는 권한도 부여되었습니다. Alice가 추가 리소스(서브 네트워크 또는 방화벽 등)에 대한 권한이 필요하다면 사전 정의되어 있는 적정 역할(네트워크 사용자 등)을 부여해야 합니다.

다음 단계

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

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

Compute Engine 문서