Google Cloud Platform(GCP)のCloud IAM

### IAMとは
Identity and Access Managementの略で、Google Cloud Platformのリソースに対して、誰（メンバー）がどのようなアクセス権（役割）を持つか定義し、アクセス制御を管理すること。IAMによって、よりきめ細やかなアクセス権を付与し、他のリソースへの望ましくないアクセスを防ぐことができる。また、セキュリティに関する最小権限の原則を導入できるため、リソースに対する必要なアクセス権のみ付与できる。

### IDに関する概念

Cloud IAMでは、次のタイプのメンバーが存在する。

* Googleアカウント
* サービスアカウント
* Googleグループ
* G Suiteドメイン
* Cloud Identityドメイン

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/8e20df22-9d01-66b9-26b1-4fff4b36b163.png)


##### Googleアカウント
Google Cloud Platformを利用する開発者、管理者。Googleアカウントに関連付けられているメールアドレス（gmail.com のアドレス）がIDとなる。

##### サービスアカウント
Googleアカウントのような個々のエンドユーザー（Google Cloud Platformを利用する開発者、管理者）ではなく、アプリケーションやリソース（仮想マシン等）に属している特別なGoogleアカウント。アプリケーションはサービスアカウントを使用して、Googleアカウントユーザーの関与を必要とせずにGoogl のサービスAPI呼び出しやリソースアクセスができる。サービスアカウントは、アカウント固有のメールアドレスで識別される。
サービスアカウントにはいくつかの種類が存在する。

###### ユーザー管理サービスアカウント
Compute Engine APIがプロジェクトで有効になっている場合、デフォルトでCompute Engineサービスアカウントが作成される。アカウント名は以下の形式。

```
[PROJECT-NUMBER]-compute@developer.gserviceaccount.com
```

プロジェクトにGoogle App Engineアプリケーションが含まれている場合、デフォルトのApp Engineサービスアカウントがプロジェクトにデフォルトで作成される。アカウント名は以下の形式。

```
[PROJECT-ID]@appspot.gserviceaccount.com
```

プロジェクトごとに最大100 個のサービスアカウント（デフォルトのCompute EngineサービスアカウントとGoogle App Engineサービスアカウントを含む）を作成することができ、ユーザーが管理するサービスアカウントとなる。

###### Google管理サービスアカウント
ユーザー管理サービスアカウントに加えて、プロジェクトのIAMポリシーまたはCloud Platform Consoleにいくつかの追加サービスアカウントが表示されることがある。これらのサービ アカウントはGoogleが作成、所有、管理するため、Google管理サービスアカウントとなる。例として、以下のようなアカウントが存在する。

* Google APIサービスアカウント

個々のエンドユーザ（開発者）の代わりに内部Googleプロセスを実行するように設計されており、Cloud Platform Console の [サービス アカウント] セクションには一覧表示されない。アカウント名は以下の形式。

```
[PROJECT_NUMBER]@cloudservices.gserviceaccount.com
```

##### Googleグループ
Googleアカウントやサービスアカウントの集合（グループ）。各Googleグループには固有の名前とメールアドレスが関連付けられている。Googleグループを使用することで、個々のGoogleアカウントまたはサービスアカウントに対して1つずつアクセス制御を付与または変更するのではなく、一度にグループ全体に対してアクセス制御を付与または変更できるので、管理が容易となる。

##### G Suiteドメイン
1つの組織内の全てのメンバーの仮想グループ。各メールアカウントはusername@yourdomain.comの形式となる。

##### Cloud Identityドメイン
1つの組織内の全てのメンバーの仮想グループ。G Suiteドメインと似ているが、Cloud Identityドメインユーザーは、G Suiteのアプリケーションと機能にアクセスすることはできない。詳細は「[Cloud Identity について](https://support.google.com/cloudidentity/answer/7319251?hl=ja&visit_id=1-636478307412818913-1918089182&rd=1)」を参照。

### アクセス管理に関する概念

##### リソース
GCPの各種リソース（プロジェクト、GCEインスタンス、Cloud Storageバケット等のサービス）に対するアクセス権をユーザに付与することが可能。

##### 権限と役割
GCPでは、権限によってリソースに対して許可されているオペレーションが決定する。ただし、権限をユーザーに直接割り当てることはできないため、代わりに役割をユーザーに付与することになる。役割とは所謂ロール（Role）のこと。役割を付与することで、そのユーザはその役割に含まれる全ての権限が付与される。
※権限と役割のイメージ
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/23101/5c9001ca-49a6-09e9-a295-7f1bcde9fd75.png)

詳細な役割は「[役割について](https://cloud.google.com/iam/docs/understanding-roles)」を参照。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/23101/6facf388-d8d5-3ddf-4f16-0ffb7019d489.png)

##### ポリシー
誰がどの種類のアクセス権を持つかの定義の集合である「Cloud IAM ポリシー」を作成することで、ユーザーに役割を付与することができる。ポリシーはリソースに紐づけられ、そのリソースがアクセスされると常にアクセス制御が強制される。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/23101/3252a041-f95a-a3b6-85fc-eea7b38b8e3f.png)

### 参考
* [GCPのIAM](https://cloud.google.com/iam/?hl=ja)
* [GCPのIAM概要](https://cloud.google.com/iam/docs/overview?hl=ja)
* [サービスアカウント1](https://cloud.google.com/iam/docs/service-accounts?hl=ja)
* [サービスアカウント2](https://cloud.google.com/compute/docs/access/service-accounts?hl=ja)
* [サービスアカウント3](https://cloud.google.com/iam/docs/understanding-service-accounts?hl=ja)