最小限のAWS IAM PolicyでAWS メディアサービスを操作したい！

こんにちは:sunny:
streampackのrisakoです:girl_tone1:
今年の4月に20新卒が入社し、ついに私も社会人2年目となりました。
時間が経つのはあっという間ですね。20新卒に負けないようにこれからも知識を吸収したいと思います！！

今回のテーマは、IAM Policyについてです。
AWS Cloud Practitionerの試験にも出るくらい基礎知識ですが、意外と奥が深いという印象です。
#IAM Policyとは？
IAM Policyとは、IAM UserやIAM Group作成後は権限が付与されていない状態のため、新たに付与してあげる権限のことです。
その際に、ユーザーに付与する権限は、最小限のアクセス権またはタスクの実行に必要なアクセス許可のみ付与するのが理想です。
一気に全部の行動を許可してしまってはいけないんですね:point_up:
もし、最小限の権限以上のタスクの実行が必要になった場合はその都度Policyを追加していきます。

では、最小限のタスクを実行できるPolicyを作成してみましょう！
###実行できるのはこれだけ！
- MediaLive 起動/停止
- MediaLive 設定変更
- MediaPackageの設定変更（Startover windowのON・OFF）

#Let's try!
- MediaLiveの操作に必要そうなもの

```
            "Action": [
                "medialive:ListInputs",
                "medialive:ListInputSecurityGroups",
                "medialive:ListChannels",
                "medialive:DescribeInput",
                "medialive:DescribeInputSecurityGroup",
                "medialive:DescribeChannel",
                "medialive:UpdateChannelClass",
                "medialive:UpdateInputSecurityGroup",
                "medialive:UpdateInput",
                "medialive:UpdateChannel",
                "medialive:StartChannel",
                "medialive:StopChannel"
            ],
```

- MediaPackageの操作に必要そうなもの

```
            "Action": [
                "mediapackage:ListTagsForResource",
                "mediapackage:ListOriginEndpoints",
                "mediapackage:ListChannels",
                "mediapackage:DescribeOriginEndpoint",
                "mediapackage:DescribeChannel",
                "mediapackage:UpdateChannel",
                "mediapackage:UpdateOriginEndpoint"
            ],
```
一度このPolicyを割り当てたユーザーでコンソールにログインします。

- MediaLive
Start/Stopはできました。
ただ権限が足りなくて設定変更はできません。
設定変更するとIAM roleの部分にエラーが出ています。
今回は使用しませんが、Harvest jobsにも同じエラーが出ています。
![スクリーンショット 2020-06-10 16.31.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429615/091d7383-9137-88c7-8ed1-0c3ff21dd1a6.png)


- MediaPackage
Startover windowのON・OFFはできますが、APIに接続できないエラーとCloudFront Distributionにも同様のエラーが出ています。
<img width="1069" alt="mediapackage 1 CF error.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429615/8e73cf4a-2956-942f-fa72-03db1d019807.png">
<img width="1125" alt="mediapackage 1 erroe.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429615/582b99cb-038e-3b94-01ae-5648050aa0d5.png">

## このエラーを消したい！
- MediaLive
設定変更できないのは、`"iam:PassRole"`と `iam:ListRoles`が足りていないためでした。
この権限がないと設定変更はできないようです。


- MediaPackage
まずCloudFront Distributionのエラーは、単純にDistributtionを読み込める権限を付与するだけでいいようです。なので、下記を追加。
`
"cloudfront:GetDistribution",
"cloudfront:CreateDistributionWithTags",
 "cloudfront:ListDistributions"
`
次にAPIのエラーです。
エラー内容を見ると権限が足りていないようなので、下記を追加。
`           "tag:GetResources"
            "health:DescribeEventAggregates",
            "cloudwatch:GetMetricData",
            "cloudwatch:GetMetricStatistics"
`
Harvest jobsのエラーは下記の権限追加で消えました。
` "mediapackage:ListHarvestJobs"`
＊追加すると「識別されないアクション」と表示されてしまいますが、権限は付与されているようです。

#最終的なポリシー
今回、実行したいアクションに必要な最小限のポリシーはこれだけでした。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "tag:GetResources",
                "medialive:UpdateInput",
                "cloudwatch:GetMetricData",
                "medialive:StartChannel",
                "medialive:StopChannel",
                "medialive:DescribeInputSecurityGroup",
                "medialive:DescribeInput",
                "cloudfront:GetDistribution",
                "medialive:UpdateChannelClass",
                "iam:PassRole",
                "mediapackage:ListHarvestJobs",
                "health:DescribeEventAggregates",
                "medialive:ListInputSecurityGroups",
                "medialive:ListChannels",
                "medialive:DescribeChannel",
                "mediapackage:DescribeChannel",
                "mediapackage:UpdateOriginEndpoint",
                "medialive:ListInputs",
                "medialive:UpdateChannel",
                "mediapackage:ListTagsForResource",
                "iam:ListRoles",
                "cloudfront:CreateDistributionWithTags",
                "cloudwatch:GetMetricStatistics",
                "mediapackage:DescribeOriginEndpoint",
                "mediapackage:UpdateChannel",
                "mediapackage:ListChannels",
                "medialive:UpdateInputSecurityGroup",
                "cloudfront:ListDistributions",
                "mediapackage:ListOriginEndpoints"
            ],
            "Resource": "*"
        }
    ]
}
```
#最後に
今回改めてPolicyと向き合ってみてわかったことは、一つのサービスに複数のサービスが結びついていた為、思った以上に最小限のPolicyを設定するのが難しかったということです。
なんども試行錯誤してPolicyを追加しているうちに、どこまでが「最小限の権限」なのかわからなくなることがあったので、「何が実行できて、何が実行できない」のか確認しつつPolicyを設定する必要があると感じました。

最後まで読んでいただきありがとうございました:bow:
#参考
[IAM でのセキュリティのベストプラクティス]
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html