【ACE】IAMのアクセスとセキュリティの構成

# こんにちは
このガイドにはグーグルさんが提供しているCloud IAMの概要上で省略して簡単にIAMのことが分かる為提供いたします。
詳細は[ここ](https://cloud.google.com/iam/docs/overview#how_cloud_iam_works)です。
では、主な基本知識を説明いたします。
# Identity and Access Management（IAM）を管理します
Cloud IAMは各リソースに対するアクセス制御を行うためのサービスです。
Cloud IAM では、**誰（ID）がどのリソースに対してどのようなアクセス権（役割）を持つ**のかを定義することにより、アクセス制御を管理します。
次の図に、Cloud IAM で権限を管理する仕組みを示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/28abf8ce-dcd7-77a5-3798-66b4b527219c.png)
**誰（ID）:** Members
**アクセス権（役割）:** Roles
**1つ以上の*Members*を1つのRolesにバインド:** Policy

ではIAMを使ってみよう～
―対象プロジェクト名：**ACE-le-202004**

## IAM 役割の割り当てを表示します
Cloud Console で [IAM ページ](https://console.cloud.google.com/iam-admin/)を開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/6e0e3648-48ac-9dcb-e0df-d4dfc35651b0.png)
**[追加]** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/6dff1a29-3a5e-5ba6-8ec4-36e7332eae9f.png)

## IAM 役割をアカウントまたは Googleグループに割り当ています
**[New members]**
Cloud IAM では、メンバーに対してアクセス権を付与します。メンバーには次のタイプがあります。
― Google アカウント
― サービス アカウント
― Google グループ
― G Suite ドメイン
― Cloud Identity ドメイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/054f2a93-70f5-b0d5-161d-3756f4102575.png)

今回の作成するPolicyは、
―Memberタイプ：Googleアカウントemail
―Roles: Storage Object Creator
[:point_right: Roles一覧はリンクをご参考下さい](https://cloud.google.com/iam/docs/understanding-roles#role_types)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/04f4799d-db31-3048-da9f-3f334d2157bd.png)
結果は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/b15e45d4-4040-7b5f-585e-8b1a9b9d99e6.png)
では共有された者からストレージへアクセスしてみよう
次の図にアクセスが出来ない理由は*storage.buckets.list*の権限がありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/f4ff67ed-879c-042c-f636-7c74ef4081f6.png)
とりあえず、先ほど作成したPolicyを調整します。Rolesは*Storage Admin*へ変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/bf0d230f-6978-9c6a-9044-10670506a9cc.png)
Storage Admin権限でStorageリソースを利用できるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/8b5aac51-65ff-acd4-cf1e-a0866ed39ca5.png)
以上に**Storage Admin**の権限をhuong_le@xxxxxx-s.co.jpメンバーへ提供しました。
このRolesでいくつことができますか。[Rolesページ](https://console.cloud.google.com/iam-admin/roles/)で確認できます。

**Filter table**のところに*Storage Admin*を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/63c78020-fc7f-752e-8ca9-cd80071cce04.png)
**Storage Admin**を選らんでStorage Adminが提供する権限が表します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/13a43ad0-a8d0-9363-c080-b15dd8b082b1.png)

## カスタム IAM 役割を定義します
以上の続きですが、*huong_le@xxxxxx-s.co.jp*メンバーにバケットの削除権限を提供したい場合、カスタムIAMを作成しないとね～
Roles/Storage Adminページ上にある**Create From Role**ボタンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/9efa186a-fb69-af76-4541-718184a9d783.png)
カスタムしましょ
―Title：Custom Storage Admin
―Descipttion：Created on: 2020-03-19 Based on: Storage Admin
―ID：CustomStorageAdmin
―Role launch stage: Alpha
―*storage.buckets.delete*コレクションのチェックを外します

又は、このメンバーに*Cloud SQL Viewer*権限を提供したい場合、
**Add permissions**ボタンを選択して*Cloud SQL Viewer*ののコレクションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/a3e57433-cd08-2c28-8e69-6c9485e01e0d.png)

結果は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/571524a8-cd51-014f-7920-8133b30c1a4a.png)

*Custom Storage Admin* Roleが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/5fc71170-16e9-7c0a-4976-67dd841cd49f.png)
このRoleを*huong_le@xxxxxx-s.co.jp*メンバーに提供します。
[IAMページ]()へ戻って先ほど作成したPolicyを編集します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/408963a3-e581-3438-303c-cba5f8560211.png)

では、huong_le@xxxxxx-s.co.jpメンバーがバッケトを削除してみよう～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/03e0be44-77f7-5681-ef5c-061897a2efdc.png)
出来ないでしょね！
そして、SQLの状況が見えますか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/a49f4ac5-802a-8691-f1b5-35a82b121c63.png)
見えますよね～
:footprints: 
五つメンバータイプにはサービスアカウントは他のメンバーとは違います。。。
サービスアカウントって何だろう？
# [サービス アカウントを管理します](https://cloud.google.com/iam/docs/service-accounts)
Cloud IAMの[サービスアカウントページ](https://console.cloud.google.com/iam-admin/serviceaccounts/)にサービスアカウントを管理します。
サービス アカウントは、**ユーザーではなく**、アプリケーションや仮想マシン（VM）インスタンスで使用される特別なアカウントです。
アプリケーションからGCP上のリソースにアクセスする際はサービスアカウントによる認証処理が必要となります。
サービスアカウントを使用して、承認された API 呼び出しを行います。
:writing_hand: GCPプロジェクト作成する時、Compute EngineサービスアカウントとApp Engineサービスアカウントが自動的に作成されます。
:point_right: GCE、GKEおよびGAEのそれぞれの環境で稼働するアプリケーションから各類リソースへアクセスができます。
その他の環境で稼働するアプリケーションならば専用のサービスアカウントを追加しないといけない。（[最大100個です](https://cloud.google.com/iam/quotas?hl=ja#top_of_page)）

実際にサービスアカウントを作成してみよう～
## 制限された特権によってサービスアカウントを管理します
**Create service account**ボタンを選択しサービスアカウントを作成します。
Service account ID：*dsk-le*
Service account description: *Create at 2020/03/19 18:18*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/40ec76e2-5083-5cc8-651e-46a37182647b.png)
ここまでは、*dsk-le@ace-le-202004.iam.gserviceaccount.com*アカウントが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/6420da7d-24f7-3263-97d5-5e735aad46ee.png)

次はこのサービスアカウントによる役割を設定します。
Role：Cloud sql admin
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/b5abce7d-5d62-188a-88fa-a2982290921b.png)

サービスアカウントをアクセスできるメンバーを設定します。
Service account users role：*[Google account email]*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/7a816b37-858e-e0e9-0b9c-742a201a39c0.png)
サービスアカウントキーを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/d4485aa3-be8a-cd25-1ed9-23fce5a5d0a0.png)

今回は、JSON形式を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/ec2ca8e2-5ac0-c01f-0598-8986e49727a0.png)

JSONファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/380e29b6-7904-0265-6f3a-9cf5352c6a78.png)

:ok_hand: サービスアカウントが既に作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/4088d701-85b7-d35e-ae99-c8724ffce27d.png)


##[サービスアカウントをVMインスタンスに割り当ています](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances?hl=ja#changeserviceaccountandscopes)
以前に言いました、
> *"GCPプロジェクト作成する時、Compute EngineサービスアカウントとApp Engineサービスアカウントが自動的に作成されます。"*

ということは、VMを作成すればCompute EngineサービスアカウントはDefaultが設定されます。
[Compute Engineページを開いて](https://console.cloud.google.com/compute/)VMを作成してましょ
### Service accountはdefaultで設定します
VMをCreateするボタンをクリックして以下の情報を設定します。

| Name | vm-custom-service |
|:--|:--|
| Region | us-central1 |
| Zone | us-centra1-c |
| Machine type | f1-micro |
| Service account | *設定なし* |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/32964f52-9ca4-7ca8-48cb-c3fd76a8a824.png)
【Create】ボタンをクリックして *vm-custom-service* が作成されます。
このVMをクリックして*Service account*のところにDefaultアクセス権限を確認します。
デフォルトサービスアカウント: *576862306389-compute@developer.gserviceaccount.com*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/9290dcfc-1ba2-8b4e-846c-3b41bf677121.png)
**Storage***(Read only)*は例としてアクセスしてみます。
ストレージのリソースを準備しておきます。
BUCKET_NAME: *Storageのバケット作成は[ここ](https://cloud.google.com/storage/docs/creating-buckets)を参考*
OBJECT_NAME: *バケットのオブジェクト作成は[ここ](https://cloud.google.com/storage/docs/uploading-objects)に参考*
例、
BUCKET_NAME: *bucket-from-editer-ace-le-202004*
OBJECT_NAME: *sample1.txt*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/055b52e4-2bc7-6eed-d83d-38c41ef4590f.png)

VMのterminalを起動する為、SSHをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/83c7df90-8f95-8b94-7993-784603368200.png)
次のコメントを実行します
`gsutil rm gs://[BUCKET_NAME]/[OBJECT_NAME]`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/e194d9da-cba5-8180-6f37-c051ac3e0ef7.png)
しかし、次のコメントを実行します
`gsutil ls gs://bucket-from-editer-ace-le-202004`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/b0d8513a-5cb7-ed12-652f-dc5fd620185b.png)
バケットのオブジェクトを削除できませんが、観覧できます。なぜならストレージのアクセスはRead only権限です。
### Service accountはカスタムサービスアカウントで設定します
以前に作成したVMはサービスアカウントをデフォルトからカスタムサービスアカウントへ変更します。
*順番は、変更する為一旦VMを中止します。VMを修正ボタンクリックして修正した後に再起動します。*

VMを中止
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/74d69810-47a0-6376-5940-c50be94704e9.png)
サービスアカウント変更
以前に作成した**dsk-le**サービスアカウントを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/eaaa11f6-a698-766a-9e3b-3a51bf85fdb5.png)
VMを再起動してSHHを開きます。以前の実行したコメントはもう一度実行します。
`gsutil rm gs://[BUCKET_NAME]/[OBJECT_NAME]`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/5be83910-0c0a-d9ab-6e83-49bf58e942da.png)
何故なら*bucket-from-editer-ace-le-202004*バケットは*dsk-le@ace-le-202004.iam.gserviceaccount.com*メンバーにアクセス権限を提供することが忘れました:tongue:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/6d08b442-fec4-83c7-89a2-eee193069332.png)
:ok_hand: ストレージへアクセスできると確認します。
`gsutil ls gs://[BUCKET_NAME]/[OBJECT_NAME]`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/d688c57f-1549-403c-18ec-2ce76acec57a.png)
:ok_hand: アクセスできましたよね。次のカスタム権限を確認します
`gsutil rm gs://[BUCKET_NAME]/[OBJECT_NAME]`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/fef95c99-9256-7424-f358-56a8b30f1079.png)
結果は、sample1.txtファイルが削除されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/968c6121-1208-64f0-5fba-d89ff776809d.png)
:writing_hand: サービスアカウントを使ってユーザーアカウントに権限を提供したくても開発するときサービスアカウントキーの情報を設定すれば提供するリソースへアクセスできるという得点です。

## 別のプロジェクトのサービスアカウントにアクセス権を付与します
Google Cloud Platform Console 内で、プロジェクトリストから*プロジェクトA*を選択します。
プロジェクトB: dataproc
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/60fd4f9f-9272-4113-83c6-93d495febbec.png)
[メンバー] ボックスに、*プロジェクトA*の「サービス アカウントのメールアドレス」を入力します。
[役割] プルダウンを展開し、[Storage Admin] を選択します。
プロジェクトA: ACE-le-202004
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/5d05ea7a-8e28-6efa-0e6b-4c5567d27f9d.png)
ということはProjectAに作成したサービスアカウントはProjectBで利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/842f1913-98e2-719d-caad-32a7e2be4936.png)


# お疲れ様です
IAMの仕事はちょっとでも分かりましたか＾・〜
サービスアカウントキー（JSONファイルなど）の利用方法を説明するつもりがありましたが記事が長かったので別の記事にすると思いますので待ってね〜

また、[プロジェクトとマネージドサービスの監査ログ](https://cloud.google.com/iam/docs/roles-audit-logging)も大切だと思いますから、参考してね。

最後まで読んで頂きまして有難うございます( ´ ▽ ` )b