AWS IAMについてメモ

###### 更新履歴

2022/07/29
「ポリシーのJSON要素」の追記

# 背景
仕事でAWSを触る機会が増えてくるので、忘備録として作成する。（随時更新予定）

# 内容

主にAWSのドキュメントをベースとし、Qiita、zennなどの記事を参考にして、わかりやすくまとめることを目標にする。

内容は[このページ](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)のWhat is IAM?についてまとめる。



<details><summary>AWS登録について</summary>

## AWSに登録
[こちら](https://portal.aws.amazon.com/billing/signup#/start/email)からアカウントを作成する。
作成方法は割愛。

初期設定は[こちらの記事](https://qiita.com/tmknom/items/303db2d1d928db720888)を参考。

</details>

## AWS IAMとは

Identity and Access Managementの略で、AWSのサービスやリソースへのアクセス許可を適用することができる。

サービス：S3やEC2、Lambdaなど、AWSが提供しているサービスのこと。

リソース：使用している各サービスのこと。
例えば、S3に画像を複数保存している場合はS3のリソースを使用している。
※使用していないリソースが残っていると無駄に請求が来るので、適宜終了させる。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/check-for-active-resources/

## IAMの仕組み

IAMはアカウントの認証と承認を制御するためのインフラストラクチャを提供する。
次の要素が含まれる。（調査中）

- Terms
- Principal
- Request
- Authentication
- Authorization
- Actions or operations
- Resources

## AWSのユーザー

ルートユーザーはIAMアカウントを作成できる。作成されたアカウントは、個別のアカウントではなく、ルートユーザーアカウント内のユーザーになり、それそれにcredentials（認証情報）が与えられる。
※IAMユーザーと書いているが、アプリケーションに対してもIAMユーザーを発行できる。

<img width="90%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631339/5a5a2a97-4f59-6b40-a910-f77240ed2dad.png">

### ルートユーザーとIAMユーザーの違い

#### ルートユーザー
- 全てのサービス、リソースに無制限にアクセスできるユーザー。　
- アカウント作成時のメールアドレスとパスワードでログインできる。
- 基本的にルートユーザーを使用することは推奨されていない。
- ルートユーザーに権限を制限できるのは、組織内のサービス制御ポリシー（SCP）のみ。

#### IAMユーザー
- ルートユーザーによって作成されたユーザー。
- アクセスできるサービス、リソースは、作成時に決まる。

### フェデレーション（Federation）
上記のAWSのユーザーの説明では、アプリケーションに対しても、IAMを割り当てることができると書いたが、アプリユーザー全員にIAMユーザーを作成するわけにはいかないので、フェデレーションを使用する。
GoogleやFacebookなどで管理しているユーザーIDを使用して、AWSリソースへの一時的なアクセス権を与えることができる。

## 権限とポリシー

IAMユーザーを作成しただけでは、どのサービスにもアクセスはできない。そのため、ポリシーをユーザーにアタッチしてサービスを使用できるようにする必要がある。

### ポリシー
ポリシー：AWSが用意しているJSON（AWSリソースにアクセスするための権限設定）

IAMユーザー作成時に「既存のポリシーを直接アタッチ」から追加することができる。
S3で検索すると、以下の9つが表示される。

<img width="90%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631339/bec108b0-0991-abc0-9b58-625ec79270b2.png">

これらのポリシーはJSON形式で記述されており、`AmazonS3ReadOnlyAccess`の場合は以下のようになっている。

<img　width="90%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631339/c4ac08ea-19d4-7a29-3af9-edaf9b0e82eb.png">

これらのポリシーにチェックを入れて（アタッチ）、IAMユーザーを作成すると、アタッチしたポリシーのサービスにアクセスすることができるようになる。

#### ポリシーのJSON要素

ポリシーはJSONで書かれている。
主な要素は以下。

- Version：ポリシーを処理するために使用される構文ルールを指定する。
現行は"2012-10-17"。使用しないと、ポリシー変数などの機能が使用できない。

- Statement：ポリシーの主要要素で、省略できない。以下に主な要素を示す。
  - Effect：必須要素。
リソースへアクセスを明示的に許可(Allow)、拒否(Deny)にする。これは、ポリシーの評価論理に関わる。

  - Action：必須要素（ActionかNotActionのどちらか）。
許可もしくは拒否する特定のアクションの設定をする。記入方法は「"AWSサービス名":"サービスのアクション名"」。各サービスのアクション名はAWSの[API Reference](https://docs.aws.amazon.com/index.html)から調べることができる。
AWS Documentation->各サービスページ->API Reference->サイドバーにあるActions

  - Resource：必須要素（ActionかNotResourceのどちらか）。
Statementで扱うオブジェクトを指定する。ARNを使用してリソースを特定する。

  - Principal：リソースへの許可、拒否するPrincipalを設定する。
AWSアカウントやIAMユーザー、ロールなどがPrincipalに当たる。

  - Condition：ポリシーを実行するタイミングの条件を指定する。
 


### グループ

IAMユーザーをグループ化するもの。
一人一人に同じポリシーをアタッチするのではなく、IAMユーザーをグループ化して、そのグループにポリシーをアタッチする。この時、グループ内のすべてのユーザーはグループに関連付けられているアクセス許可を持っていて。個々のユーザーはアタッチされているポリシーのサービスにアクセスできる。

### フェデレーションユーザーとロール

フェデレーションを使用したユーザーは一時的な権限しか持っていない。IAMユーザーのように永続的に権限を持たせるために、ロールを使用する。

ロール：AWSのサービスに権限を与える要素のこと。
AWSのサービスや別アカウントに複数のアクセス権限を持たせることができる。


# 参考記事

- IAMの仕組み
[Principal](https://qiita.com/yut0201/items/16bdc51eefcd41c18958#%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%91%E3%83%AB)

- フェデレーションの参考記事
[ID プロバイダーとフェデレーション](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers.html)
[ウェブIDフェデレーションってなんだろ？](https://zenn.dev/mn87/articles/a0231e417a883e)
[WebIdentityFederationとCognito](https://qiita.com/ita-k/items/ec4eb0377890c3f53931)

- 権限とポリシー
[ポリシーを理解する](https://dev.classmethod.jp/articles/aws-iam-policy/)
[AWS IAM の概念をざっくり理解する](https://blog.serverworks.co.jp/re-getting-started-iam)
[ポリシーのJSON要素](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements.html)
[AWSサービスのAPIリファレンス](https://docs.aws.amazon.com/index.html)

- その他
[IAM でのセキュリティのベストプラクティス](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html)