Cloud IAMあれこれ試行（その１：「役割」）

# お題
表題の通り。
GCPプロジェクト作った時点で自分のアカウントはCloud IAMとしてどうなっているか？
といったところから、Consoleも交えつつ、gcloudコマンドを使ってあれこれ試行する。
体系的に網羅的に学ぶのはGCPのサイトを順繰り追えばわかる話なので、やらない。
Consoleの内容やgcloudコマンド実行結果などから気になったことを次々にやっていく想定。

# 前提
- 試行端末はLinux（Ubuntu 17.10）
- GCPアカウント取得済み
- gcloudコマンドインストール及びセットアップ済み

### gcloudコマンドについては下記参照
#### セットアップ
https://cloud.google.com/sdk/gcloud/?hl=ja

#### リファレンス
https://cloud.google.com/sdk/gcloud/reference/?hl=ja

# 実践
## ■機能自体について
https://cloud.google.com/iam/?hl=ja
https://cloud.google.com/iam/docs/concepts?hl=ja

### ベストプラクティス
https://cloud.google.com/iam/docs/resource-hierarchy-access-control?hl=ja

## ■はじめる前に
おそらく、個人でGCPを使えるようにする場合、自分が持っている（または、そのために作成した）GoogleアカウントでGCPプロジェクトを作るんじゃないかと思う。
この時点では、自分のアカウントの状態は下記のように表示されている。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/180599/ebcd1009-f4bb-4c70-f1ab-fa8571a7b789.png)

はい、「オーナー」です。
オーナーって何？　いや、なんとなくはわかる。このGCPプロジェクトに対する参照も編集もできる権限を持っているということでしょう。
「役割」でいう「オーナー」とは・・・[ここ](https://cloud.google.com/iam/docs/understanding-roles)によると、↓であるそう。

- プロジェクトおよびプロジェクト内のすべてのリソースの権限と役割を管理する。
- プロジェクトの課金情報を設定する。

「課金」の話も絡む。
これ、個人で使う分には「課金」も自分だけが把握して管理すればいいのだろうけど、会社で使う時は特定の個人アカウントに紐づくのはマズイのでは？
共有のgmailアカウントでも作るのか・・・。と思ったら、「組織リソース」という概念があるようで。
https://cloudplatform-jp.googleblog.com/2017/02/centrally-manage-all-your-Google-Cloud-resources-with-Cloud-Resource-Manager.html
これに則ると、「組織」の下に「GCPプロジェクト」がくるイメージとなり、プロジェクトが、それを作成した従業員にではなく、組織に属するようになる。
そのため、従業員が辞めてもプロジェクトが削除されなくなる。なるほどね。
※ただ、「組織リソース」を作るには会社のドメインが必要らしい。

## ■「役割」
### そもそもCloud IAMとは？
Cloud IAM自体は、”誰”が”どのリソース”に対して”どのような権限（役割）”を持つかを細かく制御できる機能だそうで、「”誰”が」の部分は先述の通り個人でGCPプロジェクト作った時に使う「Googleアカウント」になる。
※ちなみに、「”誰”が」の部分は他に下記のようなものがある。

- 「サービスアカウント」・・・”人”というより”アプリ”に対するアカウント。
- 「Googleグループ」・・・Googleアカウントやサービスアカウントを束ねる概念。そこに属しているアカウント全てに一括で権限付与できたりと便利。
- 「G Suiteドメイン」・・・最近は会社で使っていることも多い。会社独自のドメインでGmailやGoogleカレンダー、Googleドライブといったところからスプレッドシートやスライド等を使えるようになるもの。「username@[会社ドメイン]」の形で社員個々人にアカウント作れる。
- 「Cloud Identityドメイン」・・・上の「G Suiteドメイン」から”Googleの各種アプリが使える”の部分を除いたものというイメージ。
- 「allAuthenticatedUsers」・・・特殊。Googleアカウントで認証済みの人かサービスアカウント。
- 「allUsers」・・・特殊。インターネットにアクセスできる人すべて。（[以前の記事](https://qiita.com/sky0621/items/60c654fd1817bbf085ae#08なので一般公開してみる)でGCSオブジェクトの一般公開用に付与したもの）

【参考】https://cloud.google.com/iam/docs/overview#concepts_related_to_identity

次に、「”どのリソース”」の部分は、当然ながらGCPプロジェクト内のもろもろのリソース（例えば、プロジェクト自体、GCEのインスタンスやGCSのバケットなど）。
最後に、「”どのような権限（役割）”」の部分。リソース毎に何ができるかを”役割”という形で決める。
形式は「```<service>.<resource>.<verb>```」らしい。

### どんな”役割”がある？
試しに、どんな”役割”があるのか確認するため、ローカルで gcloud コマンド叩いてみる。（ようやくgcloudコマンド登場）

<pre>
$ gcloud iam roles list | grep name
name: roles/accesscontextmanager.policyAdmin
name: roles/accesscontextmanager.policyEditor
name: roles/accesscontextmanager.policyReader
name: roles/androidmanagement.user
name: roles/appengine.appAdmin
name: roles/appengine.appViewer
name: roles/appengine.codeViewer
name: roles/appengine.deployer
name: roles/appengine.serviceAdmin
name: roles/automl.admin
name: roles/automl.editor
name: roles/automl.predictor
name: roles/automl.viewer
name: roles/axt.admin
name: roles/bigquery.admin
name: roles/bigquery.dataEditor
name: roles/bigquery.dataOwner
name: roles/bigquery.dataViewer
name: roles/bigquery.jobUser
name: roles/bigquery.user
name: roles/bigtable.admin
name: roles/bigtable.reader
name: roles/bigtable.user
name: roles/bigtable.viewer
name: roles/billing.admin
name: roles/billing.creator
name: roles/billing.projectManager
name: roles/billing.user
name: roles/billing.viewer
name: roles/binaryauthorization.attestorsAdmin
name: roles/binaryauthorization.attestorsEditor
name: roles/binaryauthorization.attestorsVerifier
name: roles/binaryauthorization.attestorsViewer
name: roles/binaryauthorization.policyAdmin
name: roles/binaryauthorization.policyEditor
name: roles/binaryauthorization.policyViewer
name: roles/browser
name: roles/cloudbuild.builds.builder
name: roles/cloudbuild.builds.editor
name: roles/cloudbuild.builds.viewer
name: roles/clouddebugger.agent
name: roles/clouddebugger.user
name: roles/cloudfunctions.developer
name: roles/cloudfunctions.viewer
name: roles/cloudiot.admin
name: roles/cloudiot.deviceController
name: roles/cloudiot.editor
name: roles/cloudiot.provisioner
name: roles/cloudiot.viewer
name: roles/cloudjobdiscovery.admin
name: roles/cloudjobdiscovery.jobsEditor
name: roles/cloudjobdiscovery.jobsViewer
name: roles/cloudkms.admin
name: roles/cloudkms.cryptoKeyDecrypter
name: roles/cloudkms.cryptoKeyEncrypter
name: roles/cloudkms.cryptoKeyEncrypterDecrypter
name: roles/cloudkms.publicKeyViewer
name: roles/cloudkms.signer
name: roles/cloudkms.signerVerifier
name: roles/cloudprofiler.agent
name: roles/cloudprofiler.user
name: roles/cloudscheduler.admin
name: roles/cloudscheduler.viewer
name: roles/cloudsecurityscanner.editor
name: roles/cloudsecurityscanner.runner
name: roles/cloudsecurityscanner.viewer
name: roles/cloudsql.admin
name: roles/cloudsql.client
name: roles/cloudsql.editor
name: roles/cloudsql.viewer
name: roles/cloudsupport.admin
name: roles/cloudsupport.viewer
name: roles/cloudtasks.admin
name: roles/cloudtasks.dequeuer
name: roles/cloudtasks.enqueuer
name: roles/cloudtasks.queueAdmin
name: roles/cloudtasks.taskDeleter
name: roles/cloudtasks.taskRunner
name: roles/cloudtasks.viewer
name: roles/cloudtestservice.testAdmin
name: roles/cloudtestservice.testViewer
name: roles/cloudtrace.admin
name: roles/cloudtrace.agent
name: roles/cloudtrace.user
name: roles/composer.admin
name: roles/composer.environmentAndStorageObjectAdmin
name: roles/composer.environmentAndStorageObjectViewer
name: roles/composer.user
name: roles/composer.worker
name: roles/compute.admin
name: roles/compute.imageUser
name: roles/compute.instanceAdmin
name: roles/compute.instanceAdmin.v1
name: roles/compute.networkAdmin
name: roles/compute.networkUser
name: roles/compute.networkViewer
name: roles/compute.osAdminLogin
name: roles/compute.osLogin
name: roles/compute.osLoginExternalUser
name: roles/compute.securityAdmin
name: roles/compute.storageAdmin
name: roles/compute.viewer
name: roles/compute.xpnAdmin
name: roles/container.admin
name: roles/container.clusterAdmin
name: roles/container.developer
name: roles/container.hostServiceAgentUser
name: roles/container.viewer
name: roles/containeranalysis.admin
name: roles/containeranalysis.notes.attacher
name: roles/containeranalysis.notes.editor
name: roles/containeranalysis.notes.viewer
name: roles/containeranalysis.occurrences.editor
name: roles/containeranalysis.occurrences.viewer
name: roles/dataflow.admin
name: roles/dataflow.developer
name: roles/dataflow.viewer
name: roles/dataflow.worker
name: roles/dataprep.projects.user
name: roles/dataproc.editor
name: roles/dataproc.viewer
name: roles/dataproc.worker
name: roles/datastore.importExportAdmin
name: roles/datastore.indexAdmin
name: roles/datastore.owner
name: roles/datastore.user
name: roles/datastore.viewer
name: roles/deploymentmanager.editor
name: roles/deploymentmanager.typeEditor
name: roles/deploymentmanager.typeViewer
name: roles/deploymentmanager.viewer
name: roles/dialogflow.admin
name: roles/dialogflow.client
name: roles/dialogflow.reader
name: roles/dlp.admin
name: roles/dlp.analyzeRiskTemplatesEditor
name: roles/dlp.analyzeRiskTemplatesReader
name: roles/dlp.deidentifyTemplatesEditor
name: roles/dlp.deidentifyTemplatesReader
name: roles/dlp.inspectTemplatesEditor
name: roles/dlp.inspectTemplatesReader
name: roles/dlp.jobTriggersEditor
name: roles/dlp.jobTriggersReader
name: roles/dlp.jobsEditor
name: roles/dlp.jobsReader
name: roles/dlp.storedInfoTypesEditor
name: roles/dlp.storedInfoTypesReader
name: roles/dlp.user
name: roles/dns.admin
name: roles/dns.reader
name: roles/editor
name: roles/endpoints.portalAdmin
name: roles/errorreporting.admin
name: roles/errorreporting.user
name: roles/errorreporting.viewer
name: roles/errorreporting.writer
name: roles/file.editor
name: roles/file.viewer
name: roles/firebasecrash.symbolMappingsAdmin
name: roles/genomics.admin
name: roles/genomics.editor
name: roles/genomics.pipelinesRunner
name: roles/genomics.viewer
name: roles/iam.organizationRoleAdmin
name: roles/iam.organizationRoleViewer
name: roles/iam.roleAdmin
name: roles/iam.roleViewer
name: roles/iam.securityReviewer
name: roles/iam.serviceAccountAdmin
name: roles/iam.serviceAccountKeyAdmin
name: roles/iam.serviceAccountTokenCreator
name: roles/iam.serviceAccountUser
name: roles/iap.admin
name: roles/iap.httpsResourceAccessor
name: roles/logging.admin
name: roles/logging.configWriter
name: roles/logging.logWriter
name: roles/logging.privateLogViewer
name: roles/logging.viewer
name: roles/ml.admin
name: roles/ml.developer
name: roles/ml.jobOwner
name: roles/ml.modelOwner
name: roles/ml.modelUser
name: roles/ml.operationOwner
name: roles/ml.viewer
name: roles/mobilecrashreporting.symbolMappingsAdmin
name: roles/monitoring.admin
name: roles/monitoring.alertPolicyEditor
name: roles/monitoring.alertPolicyViewer
name: roles/monitoring.editor
name: roles/monitoring.metricWriter
name: roles/monitoring.notificationChannelEditor
name: roles/monitoring.notificationChannelViewer
name: roles/monitoring.uptimeCheckConfigEditor
name: roles/monitoring.uptimeCheckConfigViewer
name: roles/monitoring.viewer
name: roles/orgpolicy.policyAdmin
name: roles/orgpolicy.policyViewer
name: roles/owner
name: roles/proximitybeacon.attachmentEditor
name: roles/proximitybeacon.attachmentPublisher
name: roles/proximitybeacon.attachmentViewer
name: roles/proximitybeacon.beaconEditor
name: roles/pubsub.admin
name: roles/pubsub.editor
name: roles/pubsub.publisher
name: roles/pubsub.subscriber
name: roles/pubsub.viewer
name: roles/redis.admin
name: roles/redis.editor
name: roles/redis.viewer
name: roles/reservepartner.portalAdmin
name: roles/reservepartner.portalReader
name: roles/resourcemanager.folderAdmin
name: roles/resourcemanager.folderCreator
name: roles/resourcemanager.folderEditor
name: roles/resourcemanager.folderIamAdmin
name: roles/resourcemanager.folderMover
name: roles/resourcemanager.folderViewer
name: roles/resourcemanager.lienModifier
name: roles/resourcemanager.organizationAdmin
name: roles/resourcemanager.organizationCreator
name: roles/resourcemanager.organizationViewer
name: roles/resourcemanager.projectCreator
name: roles/resourcemanager.projectDeleter
name: roles/resourcemanager.projectIamAdmin
name: roles/resourcemanager.projectMover
name: roles/runtimeconfig.admin
name: roles/servicebroker.admin
name: roles/servicebroker.operator
name: roles/servicemanagement.admin
name: roles/servicemanagement.configEditor
name: roles/servicemanagement.quotaAdmin
name: roles/servicemanagement.quotaViewer
name: roles/servicemanagement.serviceConsumer
name: roles/servicemanagement.serviceController
name: roles/servicenetworking.networksAdmin
name: roles/serviceusage.apiKeysAdmin
name: roles/serviceusage.apiKeysViewer
name: roles/serviceusage.serviceUsageAdmin
name: roles/serviceusage.serviceUsageConsumer
name: roles/serviceusage.serviceUsageViewer
name: roles/source.admin
name: roles/source.reader
name: roles/source.writer
name: roles/spanner.admin
name: roles/spanner.databaseAdmin
name: roles/spanner.databaseReader
name: roles/spanner.databaseUser
name: roles/spanner.viewer
name: roles/stackdriver.accounts.editor
name: roles/stackdriver.accounts.viewer
name: roles/stackdriver.resourceMaintenanceWindow.editor
name: roles/stackdriver.resourceMaintenanceWindow.viewer
name: roles/storage.admin
name: roles/storage.legacyBucketOwner
name: roles/storage.legacyBucketReader
name: roles/storage.legacyBucketWriter
name: roles/storage.legacyObjectOwner
name: roles/storage.legacyObjectReader
name: roles/storage.objectAdmin
name: roles/storage.objectCreator
name: roles/storage.objectViewer
name: roles/subscribewithgoogledeveloper.developer
name: roles/tpu.admin
name: roles/tpu.viewer
name: roles/viewer
</pre>

多い。GCPのサービスの数ごとにできる内容がぶら下がると考えると当然か。

### プロジェクトのオーナーに関する”役割”の詳細は？
先述の通り、GCPプロジェクト作ったばかりなら、”人”に対しては自分のGoogleアカウントが「オーナー」であるという結果が確認できる。
これがgcloudコマンド叩いてどう確認できるかというと。

<pre>
$ gcloud iam roles list | grep name | grep owner
name: roles/datastore.owner
name: roles/owner
</pre>
※２行目の方。

これで「オーナー」に関してgcloudコマンドで扱うための名前がわかったので権限詳細を見てみる。
<pre>
$ gcloud iam roles describe roles/owner
description: Full access to all resources.
etag: AA==
includedPermissions:
- accesscontextmanager.accessLevels.create
- accesscontextmanager.accessLevels.delete
- accesscontextmanager.accessLevels.get
　　　　〜
　　　＊省略（せざるを得ないほど列挙された・・・）＊
　　　　〜
- tpu.operations.list
- tpu.tensorflowversions.get
- tpu.tensorflowversions.list
name: roles/owner
stage: GA
title: Owner
</pre>
「全リソースに対してフル権限」。わかりやすい。

# 終わりに
記事の内容としては薄いけど、Cloud IAM自体について調べているうちにタイムオーバー。
続きは「その２」以降で。
そういえば、いまさら気づいたけど、Qiitaの記事用に載せた画像はAmazon S3にアップされているんですね。