IAM을 사용하여 조직 액세스 제어

Google Cloud Platform은 사용자가 특정 Google Cloud Platform 리소스 액세스 권한을 보다 세부적으로 부여하고 다른 리소스에 대한 무단 액세스를 방지할 수 있게 해주는 Cloud Identity and Access Management(IAM)를 제공합니다. IAM은 최소 권한의 보안 원칙을 채택하여 리소스에 대해 필요한 액세스 권한만 부여할 수 있게 해줍니다.

IAM을 사용하면 IAM 정책을 설정하여 어떠한 리소스에 대해 누구(사용자)에게 어떠한 액세스 권한(역할)이 있는지 제어할 수 있습니다. IAM 정책은 사용자에게 구체적인 역할을 부여하여 특정 권한을 줍니다.

이 페이지에서는 조직 수준에서 사용할 수 있는 Identity and Access Management(IAM) 역할과 Resource Manager API를 사용하여 조직의 IAM 정책을 만들고 관리하는 방법에 대해 설명합니다. Cloud Identity and Access Management에 대한 자세한 설명은 IAM 문서를 참조하세요. 특히 액세스 권한 부여, 변경, 취소를 확인하시기 바랍니다.

권한 및 역할

Cloud Identity and Access Management와 함께 모든 Google Cloud Platform 메소드를 사용하려면 API를 요청하는 계정에 리소스에 액세스할 수 있는 적절한 권한이 있어야 합니다. 권한이 있는 사용자는 Cloud 리소스에서 특정 작업을 수행할 수 있습니다. 예를 들어 resourcemanager.organizations.list 권한이 있는 사용자는 소유한 조직을 나열할 수 있고 resourcemanager.organizations.update 권한이 있는 사용자는 조직의 메타데이터를 업데이트할 수 있습니다.

다음 표에서는 호출자가 조직 메소드를 호출하는 데 필요한 권한 목록을 보여줍니다.

메소드 필수 권한
cloudresourcemanager.organizations.get() resourcemanager.organizations.get
cloudresourcemanager.organizations.search() 사용자에게 resourcemanager.organizations.get 권한이 있는 모든 조직을 보여줍니다.
cloudresourcemanager.organizations.getIamPolicy() resourcemanager.organizations.getIamPolicy
cloudresourcemanager.organizations.setIamPolicy() resourcemanager.organizations.setIamPolicy
cloudresourcemanager.organizations.testIamPermissions() 어떠한 권한도 필요하지 않습니다.

사용자에게 권한을 직접 부여하는 대신 하나 이상의 권한이 번들로 포함된 역할을 부여합니다.

동일한 리소스에 하나 이상의 역할을 부여할 수 있습니다.

사전 정의된 역할 사용

다음 표에는 조직의 리소스에 액세스하기 위해 부여할 수 있는 역할, 각 역할에 대한 설명, 각 역할에 포함된 권한이 나와 있습니다.

역할 설명 권한
roles/
resourcemanager.organizationAdmin
조직에 속한 모든 리소스를 관리할 수 있는 액세스 권한입니다. 기본적으로 이 역할에는 결제 또는 조직 역할 관리를 위한 권한이 없습니다.
  • orgpolicy.policy.get
  • resourcemanager.folders.get
  • resourcemanager.folders.getIamPolicy
  • resourcemanager.folders.list
  • resourcemanager.folders.setIamPolicy
  • resourcemanager.organizations.get
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.setIamPolicy
  • resourcemanager.organizations.update
  • resourcemanager.projectInvites.get
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list
  • resourcemanager.projects.setIamPolicy
roles/
resourcemanager.organizationViewer
조직의 표시 이름을 볼 수 있는 액세스 권한입니다. 사용자에게 이 역할을 부여하면 조직의 모든 리소스를 볼 수 있는 액세스 권한 없이도 해당 사용자가 Cloud Console에서 조직을 볼 수 있습니다.
  • resourcemanager.organizations.get
roles/
browser
조직에서 리소스를 찾아볼 수 있는 액세스 권한입니다.
  • resourcemanager.folders.get
  • resourcemanager.folders.list
  • resourcemanager.organizations.get
  • resourcemanager.projectInvites.get
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list

커스텀 역할 만들기

이 항목에서 설명하는 사전 정의된 역할 외에, 요구사항에 맞게 조정하는 권한 컬렉션인 커스텀 역할을 만들 수도 있습니다. Resource Manager로 사용할 커스텀 역할을 만들 때 다음 사항에 유의하세요.
  • resourcemanager.projects.get/list 같은 나열하기 및 가져오기 권한은 항상 쌍으로 부여해야 합니다.
  • 커스텀 역할에 folders.listfolders.get 권한이 있는 경우 projects.listprojects.get 권한도 있어야 합니다.
  • 조직, 폴더, 프로젝트에 대한 setIamPolicy 권한이 있는 사용자는 기타 모든 권한을 부여할 수 있으므로 주의해서 할당해야 합니다.

조직에 대한 기존 액세스 보기

조직 수준 IAM 정책을 가져와서 조직의 사용자에게 부여된 역할을 볼 수 있습니다. Cloud Platform Console, gcloud 명령줄 도구, getIamPolicy() 메소드를 사용하여 조직의 정책을 볼 수 있습니다.

콘솔

Google Cloud Platform 콘솔을 사용하여 조직 수준에서 부여된 역할을 보는 방법은 다음과 같습니다.

  1. GCP 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리 페이지 열기

  2. 조직 드롭다운 목록에서 조직을 선택합니다.

  3. 조직 리소스의 체크박스를 선택합니다.

  4. 오른쪽 정보 패널권한 아래에서 클릭하여 역할을 확장하고 해당 역할이 있는 모든 구성원을 표시합니다.

gcloud

get-iam-policy 명령어를 사용하여 조직의 IAM 정책을 가져옵니다.

gcloud alpha organizations get-iam-policy [ORGANIZATION_ID] --format json >
[FILENAME.JSON]

이 명령어는 다음과 유사한 정책을 출력합니다.

bindings:
- members:
  - user:testuser1@gcp-test.com
  role: roles/editor
- members:
  - user:admin@gcp-test.com
  role:roles/resourcemanager.organizationAdmin
- members:
  - user:testuser2@gcp-test.com
  role: roles/resourcemanager.projectCreator
etag": "BwU1aRxWk30="

API

다음 코드 스니펫은 조직 리소스 https://cloudresourcemanager.googleapis.com/v1/organizations/12345의 정책을 반환합니다.

요청:

POST
https://cloudresourcemanager.googleapis.com/v1/organizations/12345:getIamPolicy

응답:

 {
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
        "user:email1@gmail.com"
    ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
}

Python

getIamPolicy() 메소드를 사용하면 이전에 설정된 정책을 가져올 수 있습니다.

...

crm = discovery.build(
    'cloudresourcemanager', 'v1', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()
print json.dumps(policy, indent=2)

...

조직에 액세스 권한 부여

조직 관리자는 팀 구성원에게 IAM 역할을 부여하여 조직의 리소스 및 API에 액세스할 수 있는 권한을 부여할 수 있습니다. Cloud Platform Console, gcloud 도구, setIamPolicy() 메소드를 사용하여 팀 구성원에게 역할을 부여할 수 있습니다.

콘솔

Google Cloud Platform 콘솔을 사용하여 조직 수준에서 액세스 제어를 설정하는 방법은 다음과 같습니다.

  1. GCP 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리 페이지 열기

  2. 조직 드롭다운 목록에서 조직을 선택합니다.

  3. 조직 리소스의 체크박스를 선택합니다. 폴더 리소스가 없으면 조직 리소스가 표시되지 않습니다. 계속하려면 Cloud IAM 페이지를 통한 역할 부여에 대한 안내를 확인하세요.

  4. 오른쪽의 정보 패널이 숨겨져 있는 경우 오른쪽 상단에서 정보 패널 표시 버튼을 선택합니다.

  5. 오른쪽 정보 패널권한 아래에 추가할 구성원의 이메일 주소를 입력합니다.

  6. 역할 선택 드롭다운 목록에서 사용자에게 부여할 역할을 선택합니다.

  7. 추가를 클릭합니다. 구성원의 새로운 역할 추가 또는 업데이트를 확인하는 대화상자가 나타납니다.

gcloud

gcloud 명령어를 사용해 조직의 IAM 정책을 설정하려면 다음 안내를 따르세요.

  1. get-iam-policy 명령어를 사용하여 조직의 IAM 정책을 가져온 다음 정책을 JSON 파일에 출력합니다.

    gcloud alpha organizations get-iam-policy [ORGANIZATION_ID]
    --format json > [FILENAME.JSON]
    
  2. JSON 파일의 내용은 다음과 유사합니다.

    {
        "bindings": [
        {
            "members": [
                "user:testuser1@gcp-test.com"
            ],
            "role": "roles/editor"
        },
        {
            "members": [
                "user:admin@gcp-test.com",
            ],
            "role": "roles/resourcemanager.organizationAdmin"
        },
        {
            "members": [
                "user:testuser2@gcp-test.com"
            ],
            "role": "roles/resourcemanager.projectCreator"
        },
        ],
        "etag": "BwU1aRxWk30="
    }
    
  3. 텍스트 편집기를 사용하여 JSON 파일을 열고 새 항목을 조직 관리자를 정의하는 바인딩 배열에 추가합니다. 예를 들어 anotheradmin@gcp-test.com을 조직 관리자로 지정하려면 위의 예를 다음과 같이 변경해야 합니다.

    {
        "bindings": [
        {
            "members": [
                "user:testuser1@gcp-test.com"
            ],
            "role": "roles/editor"
        },
        {
            "members": [
                "user:admin@gcp-test.com",
                "user:anotheradmin@gcp-test.com"
            ],
            "role": "roles/resourcemanager.organizationAdmin"
        },
        {
            "members": [
                "user:testuser20@gcp-test.com"
            ],
            "role": "roles/resourcemanager.projectCreator"
        },
        ],
        "etag": "BwU1aRxWk30="
    }
    
  4. 다음 명령어를 실행하여 조직의 정책을 업데이트합니다.

    gcloud alpha organizations set-iam-policy [ORGANIZATION_ID] policy.json
    

API

요청:

POST https://cloudresourcemanager.googleapis.com/v1/organizations/12345:setIamPolicy
{
    "policy": {
    "version": "0",
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
        "user:email2@gmail.com",
        "user:email3@gmail.com",
        "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
    }
}

응답:

{
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKJUiQ="
}

setIamPolicy() 메소드를 사용하면 Cloud IAM 정책을 조직에 연결해 사용자에게 역할을 부여할 수 있습니다. IAM 정책은 사용자마다 부여할 액세스 권한을 정의하는 문 컬렉션입니다.

Read-Modify-Write: 정책과 같은 리소스의 메타데이터를 업데이트하는 데 일반적으로 사용하는 패턴으로 현재 상태를 읽고 데이터를 로컬에서 업데이트한 다음 쓰기를 수행하기 위해 수정된 데이터를 전송합니다. 이 패턴에서는 서로 독립된 둘 이상의 프로세스가 동시에 시퀀스를 시도할 경우 충돌이 발생할 수 있습니다. 예를 들어 프로젝트 소유자가 두 명이고 둘 모두 동시에 상충하는 정책 변경을 시도한다고 가정해 보겠습니다. 이 경우 프로젝트 소유자 중 한 명이 시도한 변경이 실패할 수 있습니다. Cloud Identity and Access Management는 Cloud IAM 정책에서 ETag 속성을 사용해 이 문제를 해결합니다. 이 속성은 마지막 요청 이후 정책의 변경 여부를 확인하는 데 사용됩니다. ETag값을 사용하여 Cloud IAM에 요청하면 Cloud IAM은 요청의 ETag 값을 정책과 연결된 기존 ETag 값과 비교합니다. 이때 ETag 값이 일치하는 경우에만 정책을 씁니다.

정책을 업데이트할 때는 일단 getIamPolicy()를 사용해 정책을 가져와 업데이트한 다음 setIamPolicy()를 사용해 업데이트된 정책을 씁니다. 정책을 설정할 때는 GetPolicyResponse에서 해당하는 정책에 ETag 값이 있는 경우에만 ETag 값을 사용하세요.

Python

setIamPolicy() 메소드를 사용하면 리소스에 정책을 연결할 수 있습니다. setIamPolicy 메소드는 설정할 정책과 이 정책과 연결되는 리소스를 포함하는 SetIamPolicyRequest를 사용합니다. 이 메소드는 결과로 나오는 정책을 반환합니다. setIamPolicy()를 사용하여 정책을 업데이트할 때 read-modify-write 패턴을 따르는 것이 좋습니다.

다음은 조직의 정책을 설정하는 샘플 코드입니다.

...

crm = discovery.build(
    'cloudresourcemanager', 'v1', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()

admin_binding = next(
    (binding
        for binding in policy['bindings']
        if binding['role'] == 'roles/resourcemanager.organizationAdmin'),
        None)

# Add an empty Organization Admin binding if not present.
if not admin_binding:
    admin_binding = {
        'role': 'roles/resourcemanager.organizationAdmin',
        'members': []
    }
policy['bindings'].append(admin_binding)

# Add the new Admin (if necessary).
new_admin = 'user:' + flags.adminEmail
if new_admin not in admin_binding['members']:
    admin_binding['members'].append(new_admin)
policy = crm.organizations().setIamPolicy(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'policy': policy
    }).execute()

print json.dumps(policy, indent=2)

...

권한 테스트

testIamPermissions() 메소드를 사용하여 조직 사용자의 Cloud IAM 권한을 테스트할 수 있습니다. 이 메소드는 테스트 대상 리소스 URL 및 권한 집합을 입력 매개변수로 받고 사용자에게 부여된 권한의 일부를 반환합니다.

Cloud Platform Console을 직접 사용하여 권한을 관리하는 경우 일반적으로 testIamPermission()을 호출하지 않습니다. testIamPermissions()는 맞춤설정된 그래픽 사용자 인터페이스와 같은 독점 소프트웨어와 통합할 때 사용됩니다. 예를 들어 Cloud Platform 콘솔은 testIamPermissions()를 내부적으로 사용하여 로그인한 사용자가 사용할 수 있는 UI를 결정합니다.

API

testIamPermissions() 메소드를 사용하여 호출자가 특정 리소스에 대해 보유한 권한을 확인할 수 있습니다. 이 메소드는 리소스 이름과 권한 집합을 매개변수로 사용하여 호출자에게 있는 권한의 하위 집합을 반환합니다.

다음은 조직에 대한 권한을 테스트하는 샘플 코드입니다.

Request:

POST https://cloudresourcemanager.googleapis.com/v1/organization/12345:testIamPermissions

{
    "permissions":  [
        "resourcemanager.organizations.get",
        "resourcemanager.organizations.update"
    ]
}

Response:

{
    "permissions": [
        "resourcemanager.organizations.get"
    ]
}

Python

...

crm = discovery.build(
    'cloudresourcemanager', 'v1', http=creds.authorize(httplib2.Http()))

response = crm.organizations().testIamPermissions(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'permissions': [
            'resourcemanager.organizations.setIamPolicy',
            'resourcemanager.projects.update'
        ]
    }).execute()

print json.dumps(response, indent=2)

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

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

Resource Manager 문서