Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »

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

로드밸런서

  • 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 권한을 추가해주어야 한다.

# roles/compute.osLoginExternalUser
gcloud organizations add-iam-policy-binding xxxxxxxxxxxx \
--member=user:sample.gcp.lab@gmail.com \
--role=roles/compute.osLoginExternalUser

관리자용 group에 IAM 권한 설정

편집자권한

member="group:gcp_admin@sample.com"

# roles
gcloud projects add-iam-policy-binding xxxxx --member=$member --role=roles/owner

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

해당 그룹에 N-GW 개발자의 이메일을 넣어준다. (N-GW 개발자의 이메일 도 임시로 http://vntgcorp.com 도메인으로 받은 것임. 외부 공개 이메일이면 그룹에 안 들어감)

GCP console에 권한이 있는 경우

https://console.cloud.google.com/iam-admin/groups?organizationId=150853886474&orgonly=true&supportedpurview=organizationId

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

https://groups.google.com/a/vntgcorp.com/g/partner_n_gw_developer/members

https://groups.google.com/a/vntgcorp.com/g/gcp_n_gw_admin/members

추가한 IAM group :

이제 해당 group의 IAM 권한이 필요한 경우에는 사용자를 해당 group에 추가해준다.

N-GW 팀

손진형 : vntgcorp.com - N-Groupware Team - groupware 폴더에 roles/viewer 부여

# vntgcorp.com - N-Groupware Team - groupware : 480186302230
gcloud resource-manager folders add-iam-policy-binding 480186302230 \
--member='user:jhson@vntgcorp.com' --role='roles/viewer'

Web, Was, 배치서버, PDF 서버용 서비스 계정

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

여기서 할당한 서비스 계정은 Web, Was, 배치서버의 VM에 할당을 해 주어야 함.

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

project="vntg-gw-dev-324106"
# Web, WAS, Batch서버용
sa_for_web="vntg-web-general-sa"
gcloud iam service-accounts create $sa_for_web \
    --description="VNTG web Compute Engine default service account" \
    --display-name="VNTG web Compute Engine default service account" \
    --project=$project
    
gcloud projects add-iam-policy-binding $project  \
    --member="serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com" \
    --role="roles/logging.logWriter"
    
gcloud projects add-iam-policy-binding $project  \
    --member="serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com" \
    --role="roles/monitoring.metricWriter"

# Cloud Storage bucket    
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-attachment-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-board-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-appr-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-tasks-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-content-img-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-appr-bk-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-operation-dev

# PDF 서버용
project="vntg-gw-dev-324106"
sa_for_pdf="vntg-pdf-general-sa"
gcloud iam service-accounts create $sa_for_pdf \
    --description="VNTG pdf Compute Engine default service account" \
    --display-name="VNTG pdf Compute Engine default service account" \
    --project=$project
    
gcloud projects add-iam-policy-binding $project  \
    --member="serviceAccount:$sa_for_pdf@$project.iam.gserviceaccount.com" \
    --role="roles/logging.logWriter"
    
gcloud projects add-iam-policy-binding $project  \
    --member="serviceAccount:$sa_for_pdf@$project.iam.gserviceaccount.com" \
    --role="roles/monitoring.metricWriter"

기타 서비스 서비스 계정

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

개발자 역할 설정 테스팅

LB : 콘솔 확인
https://console.cloud.google.com/net-services/loadbalancing/list/loadBalancers?project=vntg-gw-dev-324106

VM : 콘솔 확인. ssh 접근 확인

https://console.cloud.google.com/compute/instances?project=vntg-gw-dev-324106

gcloud 로 web, was, 배치서버에 ssh login 하고 sudo su - 명령어 실행해서 root 권한 가지는지 확인함.

$ gcloud compute instances list
$ gcloud beta compute ssh --zone "asia-northeast3-a" "gw-web-dev-1"  --tunnel-through-iap --project "vntg-gw-dev-324106"
$ sudo su -

gcloud beta compute ssh --zone "asia-northeast3-a" "gw-was-dev-1"  --tunnel-through-iap --project "vntg-gw-dev-324106" --command=hostname
gcloud beta compute ssh --zone "asia-northeast3-a" "gw-batch-dev-1"  --tunnel-through-iap --project "vntg-gw-dev-324106" --command=hostname

Cloud SQL : 콘솔 확인 (instance 목록은 못 봄)

https://console.cloud.google.com/sql/instances/gw-sql-dev-01/overview?project=vntg-gw-dev-324106

MemoryStore : 콘솔 확인
https://console.cloud.google.com/memorystore/redis/instances?project=vntg-gw-dev-324106

Cloud Storage : 콘솔 확인(버킷리스트는 못 봄). ssh로 접근해서 객체 쓰기 확인

https://console.cloud.google.com/storage/browser/vntg-gw-attachment-dev;tab=objects?forceOnBucketsSortingFiltering=false&project=vntg-gw-dev-324106&prefix=&forceOnObjectsSortingFiltering=false

gcloud config set project vntg-gw-dev-324106

REGION="asia-northeast3"
BUCKET_NAME="vntg-gw-attachment-dev"

# list
gsutil ls gs://$BUCKET_NAME

# 예제 파일 다운로드
curl https://cloud.google.com/storage/images/kitten.png -o kitten.png

# 버킷에 객체 업로드
gsutil cp kitten.png gs://$BUCKET_NAME

# 버킷에서 객체 다운로드
gsutil cp gs://$BUCKET_NAME/kitten.png /tmp/kitten2.png

# 버킷의 폴더에 객체 복사
gsutil cp gs://$BUCKET_NAME/kitten.png gs://$BUCKET_NAME/just-a-folder/kitten3.png

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 이라고 나온다.

ERROR: (gcloud.compute.instances.list) Some requests did not succeed:
 - Request had insufficient authentication scopes.

문서에서는 “인스턴스에 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 만 나옴.

project="vntg-gw-dev-324106"
sa_for_web="vntg-web-general-sa"
gcloud iam service-accounts create $sa_for_web \
    --description="VNTG web Compute Engine default service account" \
    --display-name="VNTG web Compute Engine default service account" \
    --project=$project
    
gcloud projects add-iam-policy-binding $project  \
    --member="serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com" \
    --role="roles/logging.logWriter"
    
gcloud projects add-iam-policy-binding $project  \
    --member="serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com" \
    --role="roles/monitoring.metricWriter"

# Cloud Storage bucket    
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-attachment-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-board-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-appr-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-tasks-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-content-img-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-appr-bk-dev
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntg-gw-operation-dev

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

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

https://vntg.atlassian.net/wiki/spaces/CLOUD/pages/301367297/N-groupware+-+GCP+101+draft#Linux-VM-%EB%A7%8C%EB%93%A4%EA%B8%B0-(service-project) 문서에서 scopes, service-account 추가.

project="vntg-gw-dev-324106"
sa_for_web="vntg-web-general-sa"

REGION="asia-northeast3"
ZONE="$REGION-a"
HOST_PROJECT="vntg-gw-shared-vpc"
SUBNET="vntg-gw-web-ne3-dev-subnet"
GCP_VM="gw-web-dev-2"
TAGS="webserver"

ubuntu_image=`gcloud compute images list --filter=name:ubuntu-minimal-2004 --uri | awk -Fimages/ '{ print $2 }'`
UBUNTU_IMAGE_PROJECT="ubuntu-os-cloud"

gcloud beta compute instances create $GCP_VM \
--zone=$ZONE \
--machine-type=f1-micro \
--subnet=projects/$HOST_PROJECT/regions/$REGION/subnetworks/$SUBNET \
--no-address \
--image=$ubuntu_image \
--image-project=$UBUNTU_IMAGE_PROJECT \
--boot-disk-size=10GB \
--boot-disk-type=pd-balanced \
--boot-disk-device-name=$GCP_VM \
--reservation-affinity=any \
--tags=$TAGS \
--scopes=cloud-platform \
--service-account=$sa_for_web@$project.iam.gserviceaccount.com

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

gcloud compute instances describe gw-was-dev-1 | grep serviceAccounts -A12
serviceAccounts:
- email: 446928390800-compute@developer.gserviceaccount.com
  scopes:
  - https://www.googleapis.com/auth/devstorage.read_only
  - https://www.googleapis.com/auth/logging.write
  - https://www.googleapis.com/auth/monitoring.write
  - https://www.googleapis.com/auth/pubsub
  - https://www.googleapis.com/auth/service.management.readonly
  - https://www.googleapis.com/auth/servicecontrol
  - https://www.googleapis.com/auth/trace.append
shieldedInstanceConfig:
  enableIntegrityMonitoring: true
  enableSecureBoot: false

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

gcloud compute instances describe tjmoon-test --zone=asia-northeast3-c | grep serviceAccounts -A5
serviceAccounts:
- email: service-vm-test-tjmoon@vntg-gw-dev-324106.iam.gserviceaccount.com
  scopes:
  - https://www.googleapis.com/auth/cloud-platform
shieldedInstanceConfig:
  enableIntegrityMonitoring: true

IAM 역할관리

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

Cloud Resource Manager API를 사용 설정

gcloud services enable cloudresourcemanager.googleapis.com

현재 액세스 보기

gcloud projects get-iam-policy vntg-gw-dev-324106  --format=json > policy.json

단일 역할 부여 및 취소

gcloud projects add-iam-policy-binding vntg-gw-dev-324106 \
    --member=user:vntg.gcp.lab@gmail.com --role=roles/viewer
    
gcloud projects remove-iam-policy-binding vntg-gw-dev-324106 \
    --member=user:vntg.gcp.lab@gmail.com --role=roles/viewer

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

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

 gcloud projects add-iam-policy-binding vntg-gw-dev-324106  --member=user:vntg.gcp.lab@gmail.com --role=roles/compute.networkViewer
 gcloud projects add-iam-policy-binding vntg-gw-dev-324106  --member=user:vntg.gcp.lab@gmail.com --role=roles/cloudsql.client

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 로그인 설정용

상세내용은 https://vntg.atlassian.net/wiki/spaces/CLOUD/pages/325648950/GCP+VM#OS-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%84%A4%EC%A0%95 참고.

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

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

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

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

gcloud compute instances add-iam-policy-binding gw-web-dev-1 \
--zone=asia-northeast3-a --member=user:vntg.gcp.lab@gmail.com \
--role=roles/compute.osAdminLogin

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

gcloud projects add-iam-policy-binding vntg-gw-dev-324106 --member=user:vntg.gcp.lab@gmail.com --role=roles/iam.serviceAccountUser

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

# roles/compute.osLoginExternalUser
# vntgcorp.com organization id :  150853886474
gcloud organizations add-iam-policy-binding 150853886474 \
--member=user:vntg.gcp.lab@gmail.com \
--role=roles/compute.osLoginExternalUser

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

 gcloud projects add-iam-policy-binding vntg-gw-dev-324106 --member=user:vntg.gcp.lab@gmail.com --role=roles/iap.tunnelResourceAccessor

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

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

$ gsutil iam get gs://vntg-gw-attachment-dev
....
    {
      "members": [
        "user:vntg.gcp.lab@gmail.com"
      ],
      "role": "roles/storage.objectAdmin"
    }
....

$ gsutil iam ch user:vntg.gcp.lab@gmail.com:objectAdmin gs://vntg-gw-attachment-dev

여러 역할 부여 또는 취소

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

현재 액세스 설정 가져오기

gcloud projects get-iam-policy vntg-gw-dev-324106  --format=json > policy.json

정책수정

$ diff -bBu policy.json policy-new.json
--- policy.json	2021-10-13 13:23:57.000000000 +0900
+++ policy-new.json	2021-10-13 16:39:48.000000000 +0900
@@ -89,6 +89,12 @@
       "members": [
         "user:vntg.gcp.lab@gmail.com"
       ],
+      "role": "roles/compute.networkViewer"
+    },
+    {
+      "members": [
+        "user:vntg.gcp.lab@gmail.com"
+      ],
       "role": "roles/viewer"
     }
   ],

정책설정

gcloud projects set-iam-policy vntg-gw-dev-324106 policy-new.json

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

아래 python 코드를 이용하여 처리를 하는 것이 좋을 듯 하다. python 으로 작업을 하는 부분은 https://vntg.atlassian.net/wiki/spaces/CLOUD/pages/346488833/Cloud+SDK#Python-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0 참고.

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

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
export GOOGLE_APPLICATION_CREDENTIALS="/root/service_account/vntg-gw-dev-324106-22a44b2dcdd9.json"
cd iam/api-client/
pip install -r requirements.txt
python3 access.py get vntg-gw-dev-324106

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

 python3 access.py modify_role vntg-gw-dev-324106 vntg-gw-dev-324106 roles/compute.osAdminLogin vntg.gcp.lab@gmail.com
 python3 access.py modify_member vntg-gw-dev-324106 roles/compute.osAdminLogin vntg.gcp.lab@gmail.com

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

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

$ git diff quickstart.py
diff --git a/iam/api-client/quickstart.py b/iam/api-client/quickstart.py
index 847b76ec..f6ace343 100644
--- a/iam/api-client/quickstart.py
+++ b/iam/api-client/quickstart.py
@@ -117,8 +117,8 @@ def set_policy(crm_service, project_id, policy):
 if __name__ == '__main__':
 
     # TODO: replace with your project ID
-    project_id = "your-project-id"
+    project_id = "vntg-gw-dev-324106"
     # TODO: Replace with the ID of your member in the form 'user:member@example.com'.
-    member = "your-member"
+    member = "user:vntg.gcp.lab@gmail.com"
     quickstart(project_id, member)
 # [END iam_quickstart]

$ python3 quickstart.py 
Role: roles/logging.logWriter
Members: 
[user:vntg.gcp.lab@gmail.com]

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

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

https://github.com/tjmoon-vntg/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

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

# 역할 생성
gcloud iam roles create TempBucketsViewer \
--project=vntg-gw-dev-324106 \
--title="임시 버킷 뷰어" \
--description="버킷 전체 목록 조회 권한 (삭제예정)" \
--permissions=storage.buckets.list

위 CLI는 버킷 목록만을 확인할 수 있는 커스텀 역할을 생성한 것이다. 위 CLI대로 생성하면 주 구성원에게 역할을 부여할 때 projects/vntg-gw-dev-324106/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 옵션은 필요없음)

  • No labels

0 Comments

You are not logged in. Any changes you make will be marked as anonymous. You may want to Log In if you already have an account.