...
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://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에 대한 읽기 전용 액세스가 들어 있으므로 기본 서비스 계정을 사용하고 기본 액세스 범위를 사용하면 별도의 설정이 필요없다.
개발자 역할 설정 테스팅
VM : 콘솔 확인. ssh 접근 확인
https://console.cloud.google.com/compute/instances?project=vntg-gw-dev-324106
gcloud 로 web, was, 배치서버에 ssh login 하고 sudo su - 명령어 실행해서 root 권한 가지는지 확인함.
Code Block | ||
---|---|---|
| ||
$ 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로 접근해서 객체 쓰기 확인
...
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 만 나옴.
...
breakoutMode | wide |
---|
...
Code Block | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
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로 역할을 부여할 수 있게 된다. 옵션을 살펴보면
...