Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
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 부여

Code Block
# 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 으로 지정. 상세내용은 서비스 계정 관련한 내용 참고.

Code Block
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 권한 가지는지 확인함.

Code Block
breakoutModewide
$ 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

...

VM 서버용 서비스 계정

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

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

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

Code Block
project="sample-gw-dev-00000"
sa_for_web="sample-web-general-sa"
gcloud iam service-accounts create $sa_for_web \
    --description="sample web Compute Engine default service account" \
    --display-name="sample 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://sample-gw-sample-dev

기타 서비스 서비스 계정

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

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

...

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

...

breakoutModewide

...

Code Block
breakoutModewide
project="sample-gw-dev-00000"
sa_for_web="sample-web-general-sa"
gcloud iam service-accounts create $sa_for_web \
    --roledescription="roles/logging.logWriter"
    
gcloud projects add-iam-policy-binding $project  \
    --member="serviceAccount:$sa_for_web@$project.iam.gserviceaccount.comsample web Compute Engine default service account" \
    --display-rolename="roles/monitoring.metricWriter"

# Cloud Storage bucket sample web Compute Engine default service account" \
   gsutil iam--project=$project
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 gcloud projects add-iam-policy-binding $project  \
    --member="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 " \
    --role="roles/logging.logWriter"
    
gcloud projects add-iam-policy-binding $project  \
    --member="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" \
    --role="roles/monitoring.metricWriter"

# Cloud Storage bucket    
gsutil iam ch serviceAccount:$sa_for_web@$project.iam.gserviceaccount.com:objectAdmin gs://vntgsample-gw-operationsample-dev

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

https://cloud.google.com/sdk/gcloud/reference/compute/instances/create#--service-accounthttps://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 추가.

Code Block
project="vntgsample-gw-dev-32410600000"
sa_for_web="vntgsample-web-general-sa"

REGION="asia-northeast3"
ZONE="$REGION-a"
HOST_PROJECT="vntgsample-gw-shared-vpc"
SUBNET="vntgsample-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

...

Code Block
gcloud compute instances describe gw-was-dev-1 | grep serviceAccounts -A12
serviceAccounts:
- email: 44692839080044xxxxxx-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

...

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

...

Code Block
gcloud projects get-iam-policy vntgsample-gw-dev-32410600000  --format=json > policy.json

...

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

...

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

...

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)은 위 스크립트에 포함이 되어 있지만 이해를 위해서 추가했음.

...

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

...

Code Block
gcloud projects add-iam-policy-binding vntgsample-gw-dev-32410600000 --member=user:vntgsample.gcp.lab@gmail.com --role=roles/iam.serviceAccountUser

...

Code Block
# roles/compute.osLoginExternalUser
# vntgcorp.comsample organization id :  1508538864740000000000
gcloud organizations add-iam-policy-binding 1508538864740000000000 \
--member=user:vntgsample.gcp.lab@gmail.com \
--role=roles/compute.osLoginExternalUser

...

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

...

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

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

여러 역할 부여 또는 취소

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

...

Code Block
gcloud projects get-iam-policy vntgsample-gw-dev-32410600000  --format=json > policy.json

...

Code Block
$ 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:vntgsample.gcp.lab@gmail.com"
       ],
+      "role": "roles/compute.networkViewer"
+    },
+    {
+      "members": [
+        "user:vntgsample.gcp.lab@gmail.com"
+      ],
       "role": "roles/viewer"
     }
   ],

...

Code Block
gcloud projects set-iam-policy vntgsample-gw-dev-32410600000 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

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

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

Code Block
 python3 access.py modify_role vntgsample-gw-dev-32410600000 vntgsample-gw-dev-32410600000 roles/compute.osAdminLogin vntgsample.gcp.lab@gmail.com
 python3 access.py modify_member vntgsample-gw-dev-32410600000 roles/compute.osAdminLogin vntgsample.gcp.lab@gmail.com

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

...

Code Block
$ 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 = "vntgsample-gw-dev-32410600000"
     # TODO: Replace with the ID of your member in the form 'user:member@example.com'.
-    member = "your-member"
+    member = "user:vntgsample.gcp.lab@gmail.com"
     quickstart(project_id, member)
 # [END iam_quickstart]

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

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

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

https://github.com/tjmoon-vntgtaejoonmoon/scripts/blob/main/gcp/grant_gcp_role.sh

커스텀 역할 생성

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

...

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

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

...