리소스에 대한 액세스 권한 부여, 변경, 취소

이 페이지에서는 리소스에 액세스 권한을 부여, 변경, 취소하는 방법을 설명합니다. 세분화된 Cloud IAM 역할을 사용하여 사용자마다 리소스에 대한 다양한 수준의 액세스 권한을 부여할 수 있습니다.

사용자 역할은 GCP Console, gcloud 명령줄 도구, REST API, 클라이언트 라이브러리를 사용하여 관리할 수 있습니다. GCP 콘솔을 사용하는 것이 가장 쉬운 방법으로, 자세한 내용을 이 문서의 앞부분에서 다룹니다. 보다 복잡한 시나리오에 프로그래매틱 방식을 사용하는 방법은 뒷부분에서 다룹니다.

Cloud IAM을 Cloud Identity-Aware Proxy(Cloud IAP)와 함께 사용하여 애플리케이션에 대한 액세스 권한을 보호하려면 Cloud IAP 문서를 참조하세요.

시작하기 전에

GCP 콘솔 사용

GCP 콘솔을 사용하면 사용자 역할을 빠르고 손쉽게 관리할 수 있습니다. 사용자에게 역할을 부여해도 사용자에게 초대 이메일이 전송되지 않습니다. 액세스 권한은 직접 업데이트됩니다.

액세스 권한 부여

팀 구성원을 프로젝트에 추가하고 Cloud IAM 역할을 부여하는 방법은 다음과 같습니다.

  1. GCP 콘솔에서 IAM 페이지를 엽니다.

    IAM 페이지 열기

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 다음 열기를 클릭합니다.

  3. 추가를 클릭합니다.

  4. 이메일 주소를 입력합니다. 개인, 서비스 계정, Google 그룹스를 구성원으로 추가할 수 있지만 모든 프로젝트에 1명 이상의 개인이 구성원으로 있어야 합니다.

  5. 역할을 선택합니다. 역할을 통해 구성원에게 적절한 수준의 권한을 부여할 수 있습니다. 구성원에게 필요한 최소 권한을 부여하는 것이 좋습니다. 소유자 수준 권한이 있는 구성원은 프로젝트 소유자이기도 하며 프로젝트 종료를 포함한 프로젝트의 모든 측면을 관리할 수 있습니다.

  6. 저장을 클릭합니다.

2개 이상의 프로젝트에서 구성원에게 역할을 부여하는 방법은 다음과 같습니다.

  1. GCP 콘솔에서 IAM 및 프로젝트 관리 페이지를 엽니다.

    IAM 및 프로젝트 관리 페이지 열기

  2. 권한을 부여할 대상 프로젝트를 모두 선택합니다.

  3. 정보 패널 표시를 클릭한 다음 권한 탭을 클릭합니다.

  4. 구성원 추가 필드에 이메일 주소를 입력하고 드롭다운 메뉴에서 원하는 역할을 선택합니다.

  5. 추가 버튼을 클릭합니다. 선택한 각 프로젝트에서 구성원에게 선택한 역할이 부여됩니다.

액세스 권한 취소

  1. Google Cloud Platform Console에서 IAM 페이지를 엽니다.

    IAM 페이지 열기

  2. 프로젝트 선택을 클릭합니다.

  3. 프로젝트를 선택하고 열기를 클릭합니다.

  4. 액세스 권한을 취소할 구성원을 찾은 다음 오른쪽의 수정(edit) 버튼을 클릭합니다.

  5. 취소할 역할마다 삭제(delete) 버튼을 클릭한 다음 저장을 클릭합니다.

액세스 권한 수정

액세스 권한을 수정하는 특별한 절차는 없습니다. 위의 단계에 따라 액세스 권한을 부여하고 취소하여 사용자에게 필요한 역할을 설정합니다.

gcloud, REST API, 클라이언트 라이브러리 사용

일부 사용 사례에서는 GCP 콘솔을 사용하는 것보다 프로그래매틱 방식으로 액세스 제어를 관리하는 것이 더 쉽습니다. gcloud 명령줄 도구, REST API, Cloud IAM용 클라이언트 라이브러리를 사용할 수 있습니다. 프로그래매틱 방식은 GCP Console에서 수행할 경우 시간이 오래 걸리는 대규모 업데이트 또는 자동 업데이트를 수행할 때 특히 유용합니다.

gcloud 명령줄 도구를 사용한 빠른 업데이트

명령줄을 사용하여 단일 사용자에게 역할을 부여하거나 취소하려면 add-iam-policy-bindingremove-iam-policy-binding 명령어를 사용합니다. 추가하거나 제거하려는 각 역할에 --role 플래그를 전달하세요.

역할 부여:

gcloud [GROUP] add-iam-policy-binding [RESOURCE-NAME]
  --member user:[USER-EMAIL] --role [ROLE-ID]

역할 취소:

gcloud [GROUP] remove-iam-policy-binding [RESOURCE-NAME]
  --member user:[EMAIL] --role [ROLE-ID]

[GROUP]은 권한을 부여할 리소스의 gcloud 그룹입니다(예: projects 또는 organizations). [RESOURCE]는 리소스의 이름입니다. [EMAIL]은 역할을 부여할 사용자입니다. [ROLE-ID]는 부여할 역할의 ID입니다.

아래 예시에서는 my-project 프로젝트의 user-1@gmail.com에 뷰어 역할을 부여합니다(콘솔을 통해서만 프로젝트에 소유자 역할을 추가할 수 있음).

gcloud projects add-iam-policy-binding my-project
  --member user:user-1@gmail.com --role roles/viewer

Cloud IAM 정책 개요

리소스에 대한 액세스 권한은 Cloud IAM 정책을 통해 관리합니다. 정책은 사용자 계정이나 서비스 계정과 같은 구성원을 연결하는 바인딩 모음입니다. 정책은 JSON 또는 YAML을 사용하여 나타냅니다.

다음은 user-1@gmail.com에 소유자 역할을 부여하고 user-2@gmail.comservice-account-13@appspot.gserviceaccount.com에 편집자 역할을 부여하는 정책의 예입니다.

{
  "bindings":[
    {
      "members":[
        "user:user-1@gmail.com"
      ],
      "role":"roles/owner"
    },
    {
      "members":[
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:user-2@gmail.com"
      ],
      "role":"roles/editor"
    }
  ],
  "etag":"BwUjMhCsNvY=",
  "version":1
}

리소스 정책은 읽기-수정-쓰기 패턴을 사용하여 업데이트합니다. 즉, 사용자 액세스 권한을 생성, 수정, 취소하는 별도의 방법은 없습니다. 대신 모든 수정은 다음 방법을 통해 이루어집니다.

  1. getIamPolicy()를 호출하여 현재 정책을 읽습니다.
  2. 텍스트 편집기를 사용하거나 프로그래매틱 방식으로 반환된 정책을 수정하여 원하는 구성원과 역할을 추가 또는 삭제합니다.
  3. setIamPolicy()를 호출하여 업데이트된 정책을 작성합니다.

일반적으로 프로젝트 또는 조직 전체에 대한 권한을 부여합니다. 그러나 Compute Engine 인스턴스Cloud Storage 버킷과 같은 광범위한 GCP 리소스에 더 상세한 정책을 설정할 수도 있습니다. 전체 역할 목록과 각 역할을 부여할 수 있는 최하위 리소스 수준은 역할 이해를 참조하세요.

아래 섹션에서는 프로젝트의 정책을 가져오고 수정 및 설정하는 방법을 설명합니다.

정책 가져오기

GCLOUD 명령어

다음과 같이 get-iam-policy 명령어를 실행합니다.

gcloud projects get-iam-policy [PROJECT] --format [FORMAT] > [FILE-PATH]

[PROJECT]는 프로젝트의 이름입니다. [FORMAT]은 JSON 또는 YAML입니다. [FILE-PATH]는 디스크에 정책을 저장할 경로입니다.

예를 들어 다음과 같이 my-project 프로젝트의 정책을 JSON 형식으로 가져와서 사용자의 홈 디렉토리에 저장합니다.

gcloud projects get-iam-policy my-project --format json > ~/policy.json

응답으로 정책이 반환됩니다.

REST API

다음과 같이 getIamPolicy()를 호출합니다.

POST https://cloudresourcemanager.googleapis.com/v1/[PROJECT]:getIamPolicy

[PROJECT]는 정책을 가져올 리소스의 이름입니다(예: projects/my-project).

응답으로 정책이 반환됩니다.

C#

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud IAM 빠른 시작의 C# 설정 안내를 따르세요. 자세한 내용은 Cloud IAM C# API 참조 문서를 참조하세요.


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud IAM 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 참조하세요.

def get_policy(project_id):
    """Gets IAM policy for a project."""

    # pylint: disable=no-member
    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])
    service = googleapiclient.discovery.build(
        'cloudresourcemanager', 'v1', credentials=credentials)
    policy = service.projects().getIamPolicy(
        resource=project_id, body={}).execute()
    print(policy)
    return policy

정책 수정

프로그래매틱 방식으로 또는 텍스트 편집기를 사용하여 특정 사용자에게 역할을 부여하거나 취소하도록 정책을 수정합니다.

사용자에게 기존 역할을 부여하려면 다음 안내를 따르세요.

GCLOUD 명령어

다음 예시에서는 텍스트 편집기를 사용해 해당 바인딩 아래의 members 배열에 이메일 주소를 추가하여 user-3@gmail.com편집자 역할을 부여합니다.

{
  "members":[
    "serviceAccount:service-account-13@appspot.gserviceaccount.com",
    "user:user-2@gmail.com",
    "user:user-3@gmail.com"
  ],
  "role":"roles/editor"
}

REST API

다음 예시에서는 텍스트 편집기를 사용해 해당 바인딩 아래의 members 배열에 이메일 주소를 추가하여 user-3@gmail.com편집자 역할을 부여합니다.

{
  "members":[
    "serviceAccount:service-account-13@appspot.gserviceaccount.com",
    "user:user-2@gmail.com",
    "user:user-3@gmail.com"
  ],
  "role":"roles/editor"
}

C#

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud IAM 빠른 시작의 C# 설정 안내를 따르세요. 자세한 내용은 Cloud IAM C# API 참조 문서를 참조하세요.


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public Policy AddMember(Policy policy, string role, string member)
    {
        var binding = policy.Bindings.First(x => x.Role == role);
        binding.Members.Add(member);
        return policy;
    }
}

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud IAM 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 참조하세요.

def modify_policy_add_member(policy, role, member):
    """Adds a new member to a role binding."""

    binding = next(b for b in policy['bindings'] if b['role'] == role)
    binding['members'].append(member)
    print(binding)
    return policy

사용자를 아직 존재하지 않는 새 역할에 추가하려면 새로운 binding을 추가합니다.

GCLOUD 명령어

텍스트 편집기를 사용하여 새로운 bindingbindings 배열에 추가합니다. 다음 예에서는 user-3@gmail.com리더 역할을 부여합니다.

{
  "members":[
    "user:user-3@gmail.com"
  ],
  "role":"roles/reader"
}

REST API

텍스트 편집기를 사용하여 새로운 bindingbindings 배열에 추가합니다. 다음 예에서는 user-3@gmail.com리더 역할을 부여합니다.

{
  "members":[
    "user:user-3@gmail.com"
  ],
  "role":"roles/reader"
}

C#

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud IAM 빠른 시작의 C# 설정 안내를 따르세요. 자세한 내용은 Cloud IAM C# API 참조 문서를 참조하세요.


using System.Collections.Generic;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddBinding(Policy policy, string role, string member)
    {
        var binding = new Binding
        {
            Role = role,
            Members = new List<string> { member }
        };
        policy.Bindings.Add(binding);
        return policy;
    }
}

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud IAM 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 참조하세요.

def modify_policy_add_role(policy, role, member):
    """Adds a new role binding to a policy."""

    binding = {
        'role': role,
        'members': [member]
    }
    policy['bindings'].append(binding)
    print(policy)
    return policy

액세스 권한을 취소하려면 원하는 구성원 또는 바인딩 전체를 삭제합니다. 구성원이 없는 빈 바인딩은 삭제할 수 없습니다.

활성화된 API 서비스와 관련된 역할만 부여할 수 있습니다. Compute Engine과 같은 서비스가 활성화되어 있지 않은 경우 Compute Engine에만 관련된 역할은 부여할 수 없습니다. 자세한 내용은 API 사용 및 사용 중지를 참조하세요.

프로젝트에 권한을 부여할 때, 특히 소유자 역할을 부여할 때는 몇 가지 고유한 제약조건이 있습니다. 자세한 내용은 projects.setIamPolicy()참조 문서를 참조하세요.

정책 설정

원하는 역할을 부여하기 위해 정책을 수정한 후 setIamPolicy()를 호출하여 업데이트합니다.

GCLOUD 명령어

업데이트된 정책이 포함된 JSON 파일의 경로를 사용하여 set-iam-policy 명령어를 실행합니다.

gcloud projects set-iam-policy [PROJECT] [FILE-PATH]

get-iam-policy와 마찬가지로 [PROJECT]는 정책을 설정할 프로젝트의 이름입니다. [FILE-PATH]는 새로운 정책이 포함된 파일 경로입니다.

응답으로 업데이트된 정책이 반환됩니다.

REST API

다음과 같이 setIamPolicy()를 호출합니다.

POST https://cloudresourcemanager.googleapis.com/v1/[PROJECT]:setIamPolicy

[PROJECT]는 정책을 설정할 리소스의 이름입니다(예: projects/my-project).

요청 본문은 업데이트된 IAM 정책을 포함해야 합니다.

응답으로 업데이트된 정책이 반환됩니다.

C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy SetPolicy(string projectId, Policy policy)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        return service.Projects.SetIamPolicy(new SetIamPolicyRequest
        {
            Policy = policy
        }, projectId).Execute();
    }
}

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud IAM 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 참조하세요.

def set_policy(project_id, policy):
    """Sets IAM policy for a project."""

    # pylint: disable=no-member
    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])
    service = googleapiclient.discovery.build(
        'cloudresourcemanager', 'v1', credentials=credentials)

    policy = service.projects().setIamPolicy(
        resource=project_id, body={
            'policy': policy
        }).execute()
    print(policy)
    return policy

여러 소스에서 동시에 정책을 업데이트하려 할 때 발생할 수 있는 충돌을 방지하기 위해 정책에는 etag 값이 포함되어 있습니다. setIamPolicy()를 호출할 때 Cloud IAM은 요청의 etag 값을 기존 etag와 비교하여 값이 일치하는 경우에만 정책을 작성합니다.

다음 단계

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

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

Cloud IAM 문서