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

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

사용자 역할은 Cloud Console, gcloud 명령줄 도구, REST API, 클라이언트 라이브러리를 사용해 관리할 수 있습니다. Cloud Console을 사용하는 것이 가장 쉬운 방법으로, gcloud 명령줄 도구를 사용해 신속하게 업데이트 방법과 마찬가지로 이 문서의 앞부분에서 다룹니다. 보다 복잡한 시나리오에 프로그래매틱 방식을 사용하는 방법은 뒷부분에서 다룹니다.

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

시작하기 전에

Cloud Console 사용

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

액세스 권한 부여

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

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

    IAM 페이지 열기

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

  3. 추가를 클릭합니다.

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

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

  6. 저장을 클릭합니다.

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

  1. Cloud Console에서 IAM 및 프로젝트 관리 페이지를 엽니다.

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

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

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

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

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

액세스 취소

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

    IAM 페이지 열기

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

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

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

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

액세스 권한 수정

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

gcloud를 사용한 빠른 업데이트

gcloud 명령줄 도구를 사용해 액세스 권한을 부여하거나 취소할 수도 있습니다.

액세스 권한 부여

구성원에게 신속하게 역할을 부여하려면 다음과 같이 gcloud 도구의 add-iam-policy-binding 명령어를 실행하세요.

    gcloud [GROUP] add-iam-policy-binding [RESOURCE] \
        --member [MEMBER] --role [ROLE_ID]
    

다음 값을 제공합니다.

  • [GROUP]: 업데이트할 리소스의 gcloud 도구 그룹입니다. 예를 들어 projects 또는 organizations를 사용할 수 있습니다.
  • [RESOURCE]: 리소스 이름입니다.
  • [MEMBER]: 구성원의 식별자로, 대개 member_type:id 형식을 따릅니다. 예를 들면 user:alice@example.com입니다. [MEMBER]가 가질 수 있는 값의 전체 목록은 정책 바인딩 참조를 확인하세요.
  • [ROLE_ID]: 역할의 이름입니다.

예를 들어 my-project 프로젝트의 alice@example.com 사용자에게 뷰어 역할을 부여하려면 다음 명령어를 사용하세요.

    gcloud projects add-iam-policy-binding my-project \
        --member user:alice@example.com --role roles/viewer
    

액세스 취소

사용자의 역할을 신속하게 취소하려면 다음과 같이 gcloud 도구의 remove-iam-policy-binding 명령어를 실행하세요.

    gcloud [GROUP] remove-iam-policy-binding [RESOURCE] \
        --member [MEMBER] --role [ROLE_ID]
    

다음 값을 제공합니다.

  • [GROUP]: 업데이트할 리소스의 gcloud 도구 그룹입니다. 예를 들어 projects 또는 organizations를 사용할 수 있습니다.
  • [RESOURCE]: 리소스 이름입니다.
  • [MEMBER]: 구성원의 식별자로, 대개 member_type:id 형식을 따릅니다. 예를 들면 user:alice@example.com입니다. [MEMBER]가 가질 수 있는 값의 전체 목록은 정책 바인딩 참조를 확인하세요.
  • [ROLE_ID]: 역할의 이름입니다.

예를 들어 my-project 프로젝트의 bob@example.com 사용자에게서 뷰어 역할을 취소하려면 다음 명령어를 사용하세요.

    gcloud projects remove-iam-policy-binding my-project \
        --member user:bob@example.com --role roles/viewer
    

프로그래매틱 방식으로 액세스 제어

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

Cloud IAM 정책 개요

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

다음은 alice@example.com소유자 역할을 부여하고 bob@example.comservice-account-13@appspot.gserviceaccount.com편집자 역할을 부여하는 정책의 예시입니다.

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

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

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

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

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

현재 정책 가져오기

gcloud 명령어

get-iam-policy 명령어를 실행합니다.

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

다음 값을 제공합니다.

  • [PROJECT_ID]: 업데이트할 프로젝트입니다(예: my-project).
  • [FORMAT]: JSON 또는 YAML입니다.
  • [FILEPATH]: 정책에 대한 새 출력 파일의 경로입니다.

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

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

REST API

Call getIamPolicy():

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

[PROJECT_ID]를 정보를 가져올 프로젝트로 바꿉니다(예: 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, version=1):
        """Gets IAM policy for a project."""

        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={"options": {"requestedPolicyVersion": version}},
            )
            .execute()
        )
        print(policy)
        return policy

    

정책 수정

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

역할 부여

정책에 이미 포함된 역할을 부여하려면 다음 안내를 따르세요.

gcloud 명령어

get-iam-policy 명령어에서 반환된 JSON 또는 YAML 정책을 수정해 역할을 부여합니다. 업데이트된 정책을 설정해야만 이 정책 변경사항이 적용됩니다.

다음 예시에서는 eve@example.com에 편집자 역할을 부여합니다. 이 역할을 부여하려면 바인딩의 members 배열에 사용자를 추가하세요.

{
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:bob@example.com",
        "user:eve@example.com"
      ],
      "role": "roles/editor"
    }
    

REST API

get-iam-policy 명령어에서 반환된 JSON 또는 YAML 정책을 수정해 역할을 부여합니다. 업데이트된 정책을 설정해야만 이 정책 변경사항이 적용됩니다.

다음 예시에서는 eve@example.com에 편집자 역할을 부여합니다. 이 역할을 부여하려면 바인딩의 members 배열에 사용자를 추가하세요.

{
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:bob@example.com",
        "user:eve@example.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 static 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 명령어

get-iam-policy 명령어에서 반환된 JSON 또는 YAML 정책을 수정해 새 바인딩을 추가합니다. 업데이트된 정책을 설정해야만 이 정책 변경사항이 적용됩니다.

다음 예시에서는 eve@example.com에 리더 역할을 부여합니다. 이 역할을 부여하려면 정책의 bindings 배열에 새 바인딩을 추가하세요.

{
      "members": [
        "user:eve@example.com"
      ],
      "role": "roles/reader"
    }
    

REST API

get-iam-policy 명령어에서 반환된 JSON 또는 YAML 정책을 수정해 새 바인딩을 추가합니다. 업데이트된 정책을 설정해야만 이 정책 변경사항이 적용됩니다.

다음 예시에서는 eve@example.com에 리더 역할을 부여합니다. 이 역할을 부여하려면 정책의 bindings 배열에 새 바인딩을 추가하세요.

{
      "members": [
        "user:eve@example.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() 참조 문서를 확인하세요.

역할 취소

역할을 취소하려면 다음 안내를 따르세요.

gcloud 명령어

get-iam-policy 명령어에서 반환된 JSON 또는 YAML 정책을 수정해 역할을 취소합니다. 이 정책 변경은 업데이트된 정책을 설정해야 적용됩니다.

구성원의 역할을 취소하려면 정책의 bindings 배열에서 원하는 구성원 또는 바인딩을 삭제하세요.

REST API

get-iam-policy 명령어에서 반환된 JSON 또는 YAML 정책을 수정해 역할을 취소합니다. 이 정책 변경은 업데이트된 정책을 설정해야 적용됩니다.

구성원의 역할을 취소하려면 정책의 bindings 배열에서 원하는 구성원 또는 바인딩을 삭제하세요.

C#

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


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

    public partial class AccessManager
    {
        public static Policy RemoveMember(Policy policy, string role, string member)
        {
            try
            {
                var binding = policy.Bindings.First(x => x.Role == role);
                if (binding.Members.Count != 0 && binding.Members.Contains(member))
                {
                    binding.Members.Remove(member);
                }
                if (binding.Members.Count == 0)
                {
                    policy.Bindings.Remove(binding);
                }
                return policy;
            }
            catch (System.InvalidOperationException e)
            {
                System.Diagnostics.Debug.WriteLine("Role does not exist in policy: \n" + e.ToString());
                return policy;
            }
        }
    }

Python

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

def modify_policy_remove_member(policy, role, member):
        """Removes a  member from a role binding."""
        binding = next(b for b in policy["bindings"] if b["role"] == role)
        if "members" in binding and member in binding["members"]:
            binding["members"].remove(member)
        print(binding)
        return policy

    

정책 설정

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

gcloud 명령

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

    gcloud projects set-iam-policy [PROJECT_ID] [FILEPATH]
    

다음 값을 제공합니다.

  • [PROJECT_ID]: 업데이트할 프로젝트입니다(예: my-project).
  • [FILEPATH]: 새 정책이 포함된 파일의 경로입니다.

응답에는 업데이트된 정책이 포함됩니다.

REST API

Call setIamPolicy():

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

[PROJECT_ID]를 업데이트할 프로젝트로 바꿉니다(예: 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."""

        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와 비교하여 값이 일치하는 경우에만 정책을 작성합니다.

다음 단계