GCP IAM role 역할 및 서비스 계정 설정

IAM Role

IAM Role https://cloud.google.com/iam/docs/understanding-roles

역할 유형에 기본 역할, 사전 정의된 역할, 커스텀 역할이 있음. IAM 도입 전에도 존재했던 소유자, 편집자, 뷰어라는 몇 가지 기본 역할이 있는데 프로덕션 환경에서는 기본 역할을 부여하지 말라는 주의사항이 있음.

개발환경에서는 roles/viewer 권한을 줄 수 있기는 하지만 가능한 사전 정의된 역할을 부여하는게 좋을 것임.

주의: 모든 Google Cloud 서비스에서 기본 역할에는 수천 가지 권한이 포함됩니다. 프로덕션 환경에서는 대체 역할이 없는 경우가 아니라면 기본 역할을 부여하지 말아야 합니다. 대신 적합하지만 가장 제한된 사전 정의된 역할 또는 커스텀 역할을 부여합니다.

각 역할 내에 어떤 권한이 포함되어 있는지 확인하고 싶을 때가 있습니다.

Cloud Console에서 확인

  • IAM 및 관리자 → 역할로 이동해 필터에 원하는 역할을 검색 후 할당된 권한 확인

gcloud로 확인

  • gcloud iam roles describe <ROLE>

조직, 폴더, 프로젝트에 대한 접근 관리

https://cloud.google.com/iam/docs/granting-changing-revoking-access

리소스별 설정 정보

개발자용 역할 정보 확인

 

 

IAM role

 

 

 

IAM role

 

로드밸런서

 

  • Compute 네트워크 뷰어 (roles/compute.networkViewer) : 모든 네트워킹 리소스에 대한 읽기 전용 액세스 권한입니다.

 

VM 전체

 

  • roles/compute.osLoginExternalUser (조직) 조직 외부 사용자 접속용.

기본적으로 조직 외부 사용자는 조직 내 인스턴스에 SSH 키를 설정하거나 조직 내 인스턴스 접근 권한을 부여받을 수 없기 때문에 조직의 IAM 설정에서 Compute Engine 역할 목록에서 Compute OS 로그인 외부 사용자를 추가(roles/compute.osLoginExternalUser)

  • Compute 뷰어 (roles/compute.viewer)

Compute Engine 리소스를 가져와 나열할 수 있지만 리소스에 저장된 데이터를 읽을 수 없는 읽기 전용 액세스 권한을 제공합니다.

서비스 계정으로 작업을 실행합니다. VM 인스턴스가 서비스 계정을 사용하는 경우 서비스 계정을 사용할 수 있는 roles/iam.serviceAccountUser 권한이 부여

 

VM

접속정보

  • 필요한 VM만 관리자 로그인 또는 로그인 설정을 함.

  • Compute OS 관리자 로그인 (roles/compute.osAdminLogin)

Compute Engine 인스턴스에 관리자 사용자로 로그인할 수 있는 액세스 권한입니다.

  • Compute OS 로그인 (roles/compute.osLogin)

Compute Engine 인스턴스에 표준 사용자로 로그인할 수 있는 액세스 권한입니다.

 

IAP

 

  • IAP 보안 터널 사용자 (roles/iap.tunnelResourceAccessor)

IAP(Identity-Aware Proxy)를 사용하는 터널 리소스에 대한 액세스 권한입니다.

서비스 계정으로 작업을 실행합니다.

 

https://cloud.google.com/iap/docs/using-tcp-forwarding#grant-permission

 

Cloud SQL

접속정보

  • Cloud SQL 클라이언트 (roles/cloudsql.client)

참고 : Cloud SQL 편집자 (roles/cloudsql.editor) : 기존 Cloud SQL 인스턴스를 관리할 수 있는 전체 권한을 제공하지만, 사용자와 SSL 인증서 수정, 리소스 삭제 권한은 제외됩니다.

  • roles/cloudsql.viewer : Cloud SQL 읽기 권한. Cloud SQL LIST를 보여줄 때 필요함. 이 역할이 꼭 필요한 것은 아니지만 콘솔 사용시 편의를 위해 허용

 

Memorystore Redis

접속정보

  • Cloud Memorystore Redis 뷰어 베타 (roles/redis.viewer)

모든 Memorystore for Redis 리소스에 대한 읽기 전용 액세스 권한입니다

 

Cloud Storage

  • 특정 버킷에 대한 objectAdmin

객체 나열, 생성, 보기, 삭제를 포함하여 객체를 관리할 수 있는 전체 권한을 부여합니다. 버킷 정보는 변경 못함. (IAM role이 아닌 Cloud Storage 권한설정에서 작업해야 함)

 

https://cloud.google.com/storage/docs/access-control/using-iam-permissions#console

 

공통설정

Cloud Resource Manager API 활성화

# enable Cloud Resource Manager API gcloud services enable cloudresourcemanager.googleapis.com

OS 로그인 사용시 필요. 메타데이터 값을 설정하여 OS 로그인을 사용 설정

gcloud compute project-info add-metadata \ --metadata enable-oslogin=TRUE

OS 로그인 사용시 조직 외부에 있는 사용자가 VM에 액세스하려면 조직의 해당 user에게  roles/compute.osLoginExternalUser 역할도 부여

일부 관리자용 IAM 읽기 권한 설정

IAM 관리자 역할을 줄 필요는 없지만 IAM에 대한 읽기권한이 필요한 경우에는 roles/iam.securityReviewer 권한을 할당해 준다. 그러면 조직소유의 IAM 정보, 그룹 정보등을 확인 할 수 있다.

https://cloud.google.com/iam/docs/understanding-roles#iam-roles

# organizationId xxxxx gcloud organizations add-iam-policy-binding xxxxx \ --member=user:sample@sample.com \ --role=roles/iam.securityReviewer

https://console.cloud.google.com/iam-admin/iam?organizationId=xxxxx

IAM Group 관리 권한

IAM Group은 GCP에서 관리하는 것이 아니라 Google 그룹스에서 관리가 됨.

 

그룹을 추가, 삭제하는 부분은 GCP와 상관없이 구글그룹스에서 그룹을 만들 수 있는 권한이 있어서 구글그룹스를 이용할 수 있다. 이제 해당 구글그룹스에 필요에 따라 사용자를 추가하거나 관리자를 추가하면 된다. 해당 구글그룹스에서 멤버추가 삭제할 수 있는 사람을 관리자로 지정하면 된다. (구글그룹스 관리자와 소유자의 차이 알고 있어야 함)

https://support.google.com/groups/answer/2464975#zippy=%2Cowner%2Cmanager

소유자만 다음을 수행할 수 있습니다.

  • 그룹을 삭제합니다.

  • 다른 그룹 구성원을 소유자로 지정합니다.

  • 다른 소유자의 설정을 변경합니다.

  • Google 테이크아웃을 사용하여 그룹 메시지를 내보냅니다.

기본적으로 관리자는 다음을 제외하고 소유자가 할 수 있는 모든 작업을 수행할 수 있습니다.

  • 그룹을 삭제합니다.

  • 다른 구성원을 소유자로 지정합니다.

  • 소유자의 역할 또는 구독 설정을 변경합니다.

 

https://cloud.google.com/iam/docs/groups-in-cloud-console

“Google 그룹스를 사용하면 대규모 사용자를 관리할 수 있습니다. 

….

Cloud Console에서 그룹을 관리하려면 다음 권한이 필요합니다.

  • 그룹 권한 : Cloud Console 또는 다른 위치에서 그룹을 생성, 확인, 편집, 삭제하려면 적절한 그룹 권한이 필요합니다. 이러한 권한은 IAM이 아닌 Google Workspace에서 관리됩니다. 이러한 권한을 얻으려면 조직 관리자에게 문의하세요. 그룹 권한에 대한 자세한 내용은 보기, 게시, 검토 가능한 사용자 설정을 참조하세요.” https://support.google.com/groups/answer/2464975#zippy=%2Cowner%2Cmanager

  • IAM 권한 : Cloud Console을 사용하여 그룹을 관리하려면 resourcemanager.organizations.get 권한이 포함된 역할이 필요합니다. 최소 권한 원칙을 준수하면서 이 권한을 얻으려면 관리자에게 조직 뷰어 역할(roles/resourcemanager.organizationViewer)을 부여해 달라고 요청하세요.

 

이제 조직의 IAM 콘솔에서 그룹을 추가하거나 구글그룹스에서 그룹을 만들면 된다.

 

파트너 개발자용 group에 IAM 권한 설정

개발자용으로 만든 IAM group에 필요한 권한을 설정해준다.

스크립트 참고 https://github.com/taejoonmoon/scripts/blob/main/gcp/grant_gcp_role.sh

https://cloud.google.com/sdk/gcloud/reference/projects/add-iam-policy-binding

OS 로그인 역할(roles/compute.osAdminLogin) 구성의 경우에는 roles/iam.serviceAccountUser, oles/iap.tunnelResourceAccessor (IAP로 접근하는 경우) 를 추가하는데 이미 위의 스크립트에서 포함이 되어 있다.

 

회사의 도메인에 속하지 않은 계정이기 때문에 roles/compute.osLoginExternalUser 권한을 추가해주어야 한다.

관리자용 group에 IAM 권한 설정

편집자권한

개발자 또는 필요한 사람을 그룹에 추가

구글그룹스에서 관리하는 경우에는 멤버 추가,삭제 권한이 필요한 사용자에게 관리자 권한 부여하면 해당 사용자가 그룹 멤버를 관리할 수 있다.

VM 서버용 서비스 계정

Cloud Storage 특정 버킷의 객체에 쓰기 권한이 필요하기 때문에 별도의 서비스 계정을 생성하여 할당을 함.

여기서 할당한 서비스 계정은 VM에 할당을 해 주어야 함.

VM 생성시 scopes는 cloud-platform 으로 지정. 상세내용은 서비스 계정 관련한 내용 참고.

기타 서비스 서비스 계정

Cloud Storage에 대한 읽기 전용 액세스가 필요한 경우가 있을 수 있다. 인스턴스 만들 때 기본 엑세스 범위에 Cloud Storage에 대한 읽기 전용 액세스가 들어 있으므로 기본 서비스 계정을 사용하고 기본 액세스 범위를 사용하면 별도의 설정이 필요없다.

Compute Engine VM 설정 - 서비스계정 ServiceAccount

https://cloud.google.com/compute/docs/access/service-accounts#service_account_permissions

VM을 만들 때 사용을 하는 “Compute Engine 기본 서비스 계정”은 IAM 프로젝트 편집자 역할(roles/editor)로 생성이 된다. 인스턴스는 다음 액세스 범위로 자동 구성이 된다.

  • Cloud Storage에 대한 읽기 전용 액세스:
    https://www.googleapis.com/auth/devstorage.read_only

  • Compute Engine 로그를 작성할 수 있는 쓰기 액세스:
    https://www.googleapis.com/auth/logging.write

  • Google Cloud 프로젝트에 측정항목 데이터를 게시할 수 있는 쓰기 액세스:
    https://www.googleapis.com/auth/monitoring.write

  • Google Cloud Endpoints(알파)에 필요한 Service Management 기능에 대한 읽기 전용 액세스:
    https://www.googleapis.com/auth/service.management.readonly

  • Google Cloud Endpoints(알파)에 필요한 Service Control 기능에 대한 읽기/쓰기 액세스:
    https://www.googleapis.com/auth/servicecontrol

그래서 IAM role 에 editor 역할이 있다고 하더라도 Cloud Storage 에 대한 쓰기 등은 안되고 gcloud compute instances list 등의 명령도 불충분한 인증 scope 이라고 나온다.

문서에서는 “인스턴스에 cloud-platform 액세스 범위를 설정한 후 IAM 역할을 사용하여 서비스 계정의 API 액세스 권한을 제어하는 것이 가장 좋습니다.” 라고 나온다.

 

그래서 별도의 서비스 계정을 만들고 VM 에 대한 액세스 범위는 VM을 만들 때 cloud-platform  (“모든 Cloud API에 대한 전체 액세스 허용” ) 으로 지정을 한다. “서비스 계정의 IAM Role And 액세스 범위” 두 설정에서 AND 조건을 만족해야 작동을 한다. 참고로 VM의 서비스 계정을 변경하거나 액세스 범위를 바꾸려면 VM을 멈추어야 한다.

 

서비스계정 추가하고 필요한 role 할당.

https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances

roles/compute.viewer, roles/compute.networkViewer role은 필요한지 모르겠지만 조회권한만 주는 것임.

logging.logWriter 이 있어야 Cloud Logging 에 로그 보낼 수 있음

monitoring.metricWriter 이 있어야 Cloud Monitoring에 메트릭 보낼 수 있음.

cloud storage의 N-GW용 버킷들에 대한 객체 관리자 권한

gcloud iam service-accounts get-iam-policy 로는 etag 만 나옴.

 

새로 만든 서비스 계정을 이용하여 VM 만들기

https://cloud.google.com/sdk/gcloud/reference/compute/instances/create#--service-account

 

VM에 서비스계정 설정, scopes 설정을 해서 띄운 후 아래 python 예제프로그램 확인을 했음.

https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#clientlib

https://github.com/GoogleCloudPlatform/python-docs-samples/blob/HEAD/compute/auth/application_default.py

서비스계정 권한

  • IAM 역할에 따라 서비스 계정의 액세스 수준이 결정

  • 인스턴스의 액세스 범위는 인스턴스에서 클라이언트 라이브러리 및 gcloud 도구를 통해 수행되는 요청의 기본 OAuth 범위를 지정합니다. 따라서 액세스 범위는 OAuth를 통해 인증할 때 API 메서드에 대한 액세스 권한을 잠재적으로 더 제한합니다. 인스턴스에 cloud-platform 액세스 범위를 설정한 후 IAM 역할을 사용하여 서비스 계정의 API 액세스 권한을 제어하는 것이 가장 좋습니다.

Compute Engine 기본 서비스 계정

Compute Engine API가 사용 설정된 새 프로젝트에는 Compute Engine 기본 서비스 계정이 있습니다.

Compute Engine 기본 서비스 계정은 IAM 프로젝트 편집자 역할(roles/editor)로 생성됩니다. 하지만 사용자는 서비스 계정의 역할을 수정하여 Google API에 대한 서비스 계정의 액세스 권한을 제어할 수 있습니다. 보안을 위해서 제한된 역할로 생성을 하여 VM에 사용하는 것이 좋음.

gcloud 명령줄 도구 및 Cloud Console로 생성된 모든 인스턴스에서 기본적으로 사용 설정됩니다. 

서비스 계정을 인스턴스에 연결

gcloud 명령줄 도구 또는 Google Cloud Console을 사용하여 인스턴스를 만들 때는 Google Cloud APIs를 호출할 때 인스턴스가 사용할 서비스 계정을 지정할 수 있습니다. 인스턴스는 다음 액세스 범위로 자동 구성됩니다.

VM 생성시 서비스 계정을 명시적으로 지정하지 않은 경우에는 https://cloud.google.com/sdk/gcloud/reference/compute/instances/create#--scopes 문서에서 지정한 scopes 와 동일하게 설정이 되었음.

https://cloud.google.com/sdk/gcloud/reference/compute/instances/create#--scopes

 

그런데 다른 서비스 계정을 수동으로 만들어서 VM을 만든 경우에는 액세스 범위로 https://www.googleapis.com/auth/cloud-platform 가 자동 설정되었다. 구글문서에서도 cloud-platform 액세스 범위를 설정하는 것을 권장하고 있다. 콘솔에서는 “모든 Cloud API에 대한 전체 액세스 허용” 이라고 나온다.

IAM 역할관리

https://cloud.google.com/iam/docs/granting-changing-revoking-access

Cloud Resource Manager API를 사용 설정

현재 액세스 보기

단일 역할 부여 및 취소

착각 했던 것. 단일 역할 부여를 하는 경우에는 한명의 사용자에 대해서 role을 한가지만 부여할 수 있는 것으로 착각했음. 그래서 여러가지 role을 부여하기 위해서는 json 파일을 수정해야 하는 것으로 생각을 했다. GCP IAM에 대해서 아직 다 이해를 못해서 이렇게 착각을 하는 것 같다.

아래와 같이 개별 role을 사용자에게 따로따로 부여할 수가 있다. 이 방식으로 사용을 하면 된다.

https://cloud.google.com/sdk/gcloud/reference/projects/add-iam-policy-binding

https://cloud.google.com/sdk/gcloud/reference/projects/remove-iam-policy-binding

단일 역할 부여 스크립트로 처리

특정 user 에 대해서 project별로 IAM role 설정하고 삭제하는 스크립트.

jq를 이용해서 python 스크립트로 처리하는 것이 더 나을 수도 있을 듯함. 그런데 https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/iam/api-client 에는 특정 user의 IAM 역할을 보는 코드가 나와있지는 않다. 물론 json 으로 가져온 데이터를 이용해서 python 코드 안에서 찾아낼 수 있기는 하지만 일단 bash로 해서 처리했다.

상단의 스크립트 참고

OS 로그인 설정용

아래에서 project 차원의 IAM 설정(iam.serviceAccountUser, iap.tunnelResourceAccessor)은 위 스크립트에 포함이 되어 있지만 이해를 위해서 추가했음.

메타데이터 값을 설정하여 OS 로그인을 사용 설정

사용자 계정에 OS 로그인 역할 구성

roles/iam.serviceAccountUser 역할을 갖도록 구성

조직 외부에 있는 사용자가 VM에 액세스하려면 조직의 해당 user에게  roles/compute.osLoginExternalUser 역할도 부여

TCP 전달을 위한 Cloud IAP 사용을 위해서 IAP 보안 터널 사용자 (roles/iap.tunnelResourceAccessor), roles/iam.serviceAccountUser 역할 구성

 

Cloud Storage : 특정 버킷의 객체에 대해서만 권한 부여. 버킷 정보는 변경 못함.

https://cloud.google.com/storage/docs/access-control/using-iam-permissions#gsutil

여러 역할 부여 또는 취소

여러 역할의 부여 및 취소가 포함된 대규모 액세스 변경을 수행하려면 읽기-수정-쓰기 패턴을 사용하여 리소스의 IAM 정책을 업데이트합니다.

 

현재 액세스 설정 가져오기

정책수정

정책설정

gcloud 명령으로 정책 변경을 하려면 json 파일을 수정해야 한다. cli 형태로 작업을 할 수가 없다.

아래 python 코드를 이용하여 처리를 하는 것이 좋을 듯 하다.

https://github.com/GoogleCloudPlatform/python-docs-samples/blob/HEAD/iam/api-client/access.py

현재 IAM을 정확이 이해못해서 아래와 같이 실행을 시켰을 때 제대로 동작을 하지 않는다. 이것은 프로그램 소스를 이해못했다기 보다는 IAM 작동방식을 이해못해서 그런 것 같다. 일단 참고로 적어두기만 함.

iam/api-client/quickstart.py 샘플파일을 이용하면 간단하게 테스팅을 해볼수 있음. 아래 코드는 특정 IAM 사용자에게 특정 role 을 할당하고 삭제를 하는 예제임.

https://github.com/GoogleCloudPlatform/python-docs-samples/blob/f5e96f656caeee6a5913edabf770e7ad1e6d674f/iam/api-client/quickstart.py

비슷하게 bash에서 특정 user의 IAM role 추가, 삭제, 정보보는 간단한 스크립트.

특정 user의 IAM role 을 CLI로 보기가 불편해서 범용 스크립트로 만들어 두고 쓰는 것이 필요할 듯 하다.

https://github.com/taejoonmoon/scripts/blob/main/gcp/grant_gcp_role.sh

 

커스텀 역할 생성

기본적으로 GCP에서는 사전 정의된 역할이 존재한다. 일반적인 상황이라면 사전에 정의된 역할을 사용해 주 구성원들에게 권한을 부여할 수 있다. 하지만 역할 내에 존재하는 권한들은 GCP에서 설정한 것들이므로 주 구성원의 권한 요구사항과는 다를 수가 있다. 예를 들어 Cloud Storage의 버킷 목록 확인을 위한 권한(storage.buckets.list)이 필요하다고 하면 사전 정의된 역할로 이 권한을 부여하기 위해서는 뷰어(roles/viewer) 역할을 부여해야하는데 이는 최소 권한 원칙을 준수하지 못한다. 이런 상황들 때문에 커스텀 역할이 필요한 것이며, 이는 최소 권한 원칙을 준수하면서 다양한 권한 요구사항을 만족시킬 수 있다.

커스텀 역할 생성 CLI - https://cloud.google.com/sdk/gcloud/reference/iam/roles/create

커스텀 역할은 아래와 같이 생성 가능하다.

위 CLI는 버킷 목록만을 확인할 수 있는 커스텀 역할을 생성한 것이다. 위 CLI대로 생성하면 주 구성원에게 역할을 부여할 때 projects/sample-gw-dev-00000/roles/TempBucketsViewer 라는 ID로 역할을 부여할 수 있게 된다. 옵션을 살펴보면

--project or --organization : 해당 역할이 속할 프로젝트나 조직이며, 프로젝트 내에서 커스텀 역할을 관리하고 싶다면 “역할 관리자” 역할이 필요하고 조직 내에서 커스텀 역할을 관리하고 싶다면 “조직 역할 관리자” 역할이 필요

--title : 역할 제목

--description : 역할에 대한 설명
--permission : 역할에 추가할 권한 목록 (,로 구분하여 여러 권한 설정 가능)

--stage : 역할에 대한 출시단계 설정(자세한 내용은 역할의 테스트 및 배포모든 역할 참조 이 두 문서를 확인)

출시 단계는 여러 종류가 있지만 대표적으로 다음과 같은 3개의 출시 단계를 사용한다.

ALPHA : 개발 및 테스트 중인 GCP 서비스나 기능에 대한 권한을 포함한 역할

BETA : 일부만 테스트가 진행되어 일반적으로는 사용하지 못하는 GCP 서비스나 기능에 대한 권한을 포함하고 있는 역할

GA : 모든 테스트가 완료되어 안정화된 GCP 서비스나 기능에 대한 권한만을 포함한 역할

위 옵션 중 title,description,permission,stage 옵션 대신 file 옵션을 사용할 수도 있다. file 옵션은 역할 정보가 작성되어 있는 JSON이나 YAML 파일을 지정하면 된다.

--file : 역할 정보가 작성된 JSON 및 YAML 파일 (이 옵션을 지정하면 위 title ~ stage 옵션은 필요없음)