IAMポリシーによるEC2インスタンス操作制限

# はじめに
IAMポリシーによるEC2インスタンスの操作制限について調べた内容の記事です。

# IAMポリシーについて
IAMポリシーはAWSリソースに対する操作権限を記述したもので、IAMユーザー・IAMグループ・IAMロールに対しアタッチすることで操作権限を制御することができます。ポリシーはjson形式で記述されます。

# 操作制限の具体例
今回はIAMポリシーによる操作制御の具体例として、EC2インスタンスに対して以下の操作を許可するために必要なポリシーを調べました。各操作はマネージメントコンソールから行うことを想定しています。

- EC2インスタンスが見れるだけ
- 既存のEC2インスタンスの起動・停止を許可
- EC2インスタンスの作成を許可
- 既存のIAMロールをアタッチしたEC2インスタンスの作成を許可

## EC2インスタンスが見れるだけ
AWS管理ポリシーの arn:aws:iam::aws:policy/ReadOnlyAccess のみをアタッチします。
これはAWSリソースに対する読み取りアクセスのみを許可するポリシーです。

## 既存のEC2インスタンスの起動・停止を許可
既存のEC2インスタンスの起動・停止を許可するポリシーです。
許可する対象としてEC2インスタンスに自身のユーザー名のOwnerタグがつけられているものに限定しています。
ポリシーは以下の2つの記述からなります。

- EC2インスタンスの起動・停止の許可
- EC2インスタンスの情報表示の許可

```json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/Owner": "${aws:username}"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:DescribeInstances",
            "Resource": "*"
        }
    ]
}
```

## EC2インスタンスの作成を許可
EC2インスタンスの作成を許可するポリシーです。
以下の2つの記述からなります。

- EC2インスタンスの情報表示・コンソール出力の許可
- EC2インスタンスの作成の許可

ちなみにこのポリシー下では既存のIAMロールをEC2インスタンスにアタッチすることができません。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "ec2:GetConsole*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*::image/ami-*",
                "arn:aws:ec2:*:*:key-pair/*",
                "arn:aws:ec2:*:*:security-group/*"
            ]
        }
    ]
}
```

## 既存のIAMロールをアタッチしたEC2インスタンスの作成を許可
既存のIAMロールをアタッチしたEC2インスタンスの作成を許可するポリシーです。
1つ上で説明したポリシーに加え以下の3つのアクションを許可しています。

- iam:Get*
- iam:List*
- iam:PassRole

上の2つはIAMの情報取得のための権限です。
iam:PassRoleはサービスにロールを渡す権限で、EC2インスタンスにIAMロールを設定する際に必要となります。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "ec2:GetConsole*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*::image/ami-*",
                "arn:aws:ec2:*:*:key-pair/*",
                "arn:aws:ec2:*:*:security-group/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:Get*",
                "iam:List*",
                "iam:PassRole"
            ],
            "Resource": "*"
        }
    ]
}
```
# 参考
- ポリシーについて  
  https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html
- EC2に対するアクション  
  https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonec2.html
- IAMに対するアクション  
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/list_identityandaccessmanagement.html