【AWS IAMとは？】初心者にもわかりやすく解説

# はじめに
この記事ではAWSのIAMについて説明していきます。
初心者にとって非常にややこしいAWS IAMについて図解を交えつつ説明していきます。

# IAMとは？
そもそもIAMとは何でしょうか？
IAMとはAWSのサービスの「認証」と「認可」の設定を行うことができるサービスになります。

```
認証: 相手が誰（何）なのか確認すること
認可: リソースへのアクセス権限を与えること
```

AWSを利用する時に一番最初に行う作業は「rootユーザーからIAMユーザーを作成する」ことです。

rootユーザーはAWSアカウント開設時に作成されるユーザーで、権限が非常に強く、通常利用が推奨されていません。

AWSアカウント開設したら、とりあえずIAMユーザー作成すると覚えておきましょう。


# IAMのきほん
IAMでは、以下の機能が用意されています。

```
1. IAMユーザー
2. IAMグループ
3. アクセスキー
4. IAMポリシー
5. IAMロール
```

こちらの機能をそれぞれ説明していきます。

## IAMユーザー
◼︎ 概要図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286094/cd5fea13-1a02-fec0-8fa5-177bf74ab5f3.png)

AWSには２つの異なるタイプのユーザーが存在します。

```
1. ルートユーザー(管理者アカウント)
2. IAMユーザー
```

### ルートユーザー(管理者アカウント)
AWSアカウント作成した初期状態では、作成時に使用したメールアドレスとパスワードでアクセス可能で、AWSアカウントのすべてのリソースに対して完全なアクセス権限を持ちます。

この完全なアクセス権限を持つユーザーをルートユーザーと呼びます。

### IAMユーザー
ルートユーザーは全てのサービスとリソースに完全なアクセス権限を持ちます。
ただ、なんでも出来てしまう為日常的には利用しないよう推奨されています。

**通常は付与された権限の範囲内でAWSリソースのアクセスが可能なIAMユーザーを利用するケースが多いです。**

IAMユーザーの認証にはパスワードとアクセスキー※の２パターン存在します。

※ アクセスキーはアクセスキーIDとシークレットアクセスキーのペアになります。詳細はアクセスキーの項目を参照ください。


◼︎ 比較表

|  | ルートユーザー | IAMユーザー |
| ---- | ---- | ---- |
| AWSサービス/リソースへのアクセス権限 | フル権限 | IAM管理者※により許可された範囲の権限 |
| ログインID | AWSアカウント登録時のEmail | IMA管理者により作成されたユーザー名 |
| 運用時の利用 | 日常の操作には利用しない | 日常の管理作業に利用 |

※　AdministratorAcess管理権限（AWSサービスに対する全てのアクセス権限）を付与されたIAMユーザーをIAM管理者と言います。

## IAMグループ
IAMユーザーは１つのAWSアカウントあたり5,000ユーザーまで作成可能です。
ユーザーごとにユーザー名/パス/所属グループ/権限を設定できます。

IAMグループはIMAユーザーの集合を管理します。
１つのAWSアカウントあたり100グループまで作成可能です。
グループごとにユーザー名/パス/権限を設定できます。

◼︎ 比較表

|  | IAMユーザー | IAMグループ |
| ---- | ---- | ---- |
| AWSアカウントの上限 | 5,000 | 100 |
| 設定可能情報 | ユーザー名、パス、所属グループ、権限 | ユーザー名、パス、権限 |
| 特徴 | ユーザーが作成された時は何も権限がない | グループを他のグループに入れる事は出来ない。グループは認証情報を持たない |

◼︎ IAMグループ概要図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286094/e3246714-1bd5-8472-bd52-aff1934a621d.png)


## アクセスキー
アクセスキーは、IAMユーザーの認証情報になります。

IAMユーザーの認証情報には、AWSマネージメントコントロールにログインするときのユーザー名/パスワードに加えて、AWSサービスへのAPI操作が可能なアクセスキーID/シークレットアクセスキーが存在します。

**アクセスキーID/シークレットアクセスキーの２つを合わせてアクセスキーと呼びます。**

アクセスキー ID (例: AKIAIOSFODNN7EXAMPLE) 
シークレットアクセスキー (例: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY) 

## IAMポリシー
IAMポリシーはAWSへのアクセスに関する権限設定を表します。

IAMポリシーは複数のユーザー/グループ/ロールにアタッチできる管理ポリシーと個々のIAMユーザー/グループ/ロールに直接権限を設定するインラインポリシーが存在します。

◼︎ 比較表

| IAMポリシーの分類 | 特徴 | 
| ---- | ---- | 
| 管理ポリシー | 複数のIAMユーザー/グループ/ロールにアタッチできるポリシー。それぞれ最大10までの管理ポリシーをアタッチ可能。(AWSがデフォルトで準備している)| 
| インラインポリシー（カスタマー管理ポリシー） | 自分でJSONを記述してポリシーを設定する。個々のIAMユーザー/グループ/ロールに直接権限を設定するポリシー |

### IAMポリシー設定方法
IAMポリシーに設定するアクセス権限はJSON形式で記載しEffect/Action/Resource/Conditionを設定します。

◼︎ サンプルIAMポリシーJSON

``` json
{
    "Version": "2012-10-17",
    "Statement": [
        {
	    "Effect": "Allow",
            "Action": [
                "S3:PutObject",
                "S3:GetObject",
                "S3:DeleteObject*"
            ],
            "Resource": "arn:aws:s3:::*/*",
	    "Condition": {
		"IpAddress": {
			"aws:SourceIp": "172.31.1.0/24 "
		}
	    }
        }
    ]
}
```

**Effect**ではACtionで指定されるアクセス権限に対してAllow(許可)またはDeny(拒否)を指定します。

**Action**ではEffectの対象となるAWS操作を指定します。

**Resource**では、操作対象となるAWSリソースを指定します。

ARNの記載例

```
arn:aws:service:region:account:resource

service: AWSサービス名
region: AWSリージョン
account: AWSアカウントID
resource: AWSリソース名
```

**condition**ではアクセス権限が有効となる為の条件を指定します。

具体的にサンプルIAMポリシーJSONを分解して説明していきます。

``` json
{
    "Version": "2012-10-17", IAMポリシーの文法バージョン
    "Statement": [
        {
	    "Effect": "Allow", 設定を許可を許可する
            "Action": [
                "S3:PutObject",　   S3に更新処理を許可する
                "S3:GetObject",　   S3に取得処理を許可する
                "S3:DeleteObject*"  S3の削除処理に関する全てを許可する
            ],
            "Resource": "arn:aws:s3:::*/*", S3バケットリソースを指定する
	    "Condition": {
		"IpAddress": {
			"aws:SourceIp": "172.31.1.0/24 " IPがこの条件の時のみ有効にする
		}
	    }
        }
    ]
}
```

## IAMロール
IAMロールはAWSサービスやアプリケーションなどのエンティティに対してAWS操作権限を付与するための仕組みです。

もう少し簡単に一言で言うと、IAMロールはポリシーを複数アタッチして権限をひとまとめにしたものです。

例）S3の読み込み権限とEC2のフルアクセス権限をまとめたHogeRole1を作成する
![](https://storage.googleapis.com/zenn-user-upload/ru7u32zh7cfmyviterob6dm1qj82)



### IAMポリシーとIAMロール
|   | IAMロール |　IAMグループ |
| ---- | ---- | ---- |
| 概要 | AWSのリソース（EC2とか）に付与するもので、IAMポリシーをグループ化したもの | AWSへのアクセスに関する権限設定 |