AWS開発用アカウントのIAM権限(結局Admin)

## はじめに
AWSを使ってシステムのプロトタイプを作成していると、Roleをリソースに付与するなどの作業で、その都度IAM権限が必要になる。
ので、ちょいちょい「xxxの権限必要なんですけど…」との問い合わせをもらうことになる。

- LambdaでS3やCloudWatchのトリガーを受け取るためのロール付与
- GlueでS3をクロールするためにS3アクセスのポリシーを作成
- ECSで自動起動・停止の設定をする
- etc...

## 最初は都度対応していたが…

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

この辺を読んで、最初は以下の対応で済ませていた。

- 開発者用ユーザーグループを作成
- 開発用ポリシーをユーザーグループに付与して、ポリシーを編集して権限を随時追加

編集していたポリシーの例。

```json
　　　~
        {
            "Effect": "Allow",
            "Action": [
                "iam:*ServerCertificate*",
                "iam:PassRole",
                "iam:GetRole",
                "iam:CreateRole",
                "iam:ListRoles",
                "iam:ListPolicies",
                "iam:PutRolePolicy",
                "iam:ListRolePolicies",
                "iam:ListAttachedRolePolicies",
                "iam:CreateServiceLinkedRole",
                "iam:DeleteServiceLinkedRole",
                "iam:CreatePolicy",
                "iam:AttachRolePolicy"
                …
            ],
            "Resource": "*"
        }
　　　~
```

S3とLambdaでやり取りする程度の作業なら、これでよかったが…

## キリがないので、一時的にAdmin権限を付与

段々開発が進むにつれて、「権限お願いします」のやり取りが増えてきて、もうこれキリが無いなということに。

[システム開発プロジェクトにおけるIAMポリシー権限はどうしたらいいですか](https://dev.classmethod.jp/articles/iam-role-base-permission/)


>|役割|権限|
>|:---:|:---:|
>|管理者|root アカウントは普段使いしない、MFAで保護|
>|アプリチーム|必要な権限を広めで|
>|インフラチーム|Admin 相当|
>|運用チーム|運用の範囲次第|
>
>アプリチームには広めの権限を与えます。
>使うリソースごとの FullAccess を付与することもありです。
>AWS CDK や Serverless Framework 等を使う場合は AdminstratorAccess を求められるかもしれませんが、円滑なアプリ開発のために許容しましょう。


↑を参考に、一時的に「AdministratorAccess」を開発用ユーザーグループに付与して、開発が済んだら外すことにした。
(上の記事でいうところの、アプリチームとインフラチームの作業を合わせてやっているので)

## 禁止する操作も追加しておく
上のサイトを参考に、禁止操作も付け加えておく。

```json
　　　~
        {
            "Sid": "DenyBoundaryDelete",
            "Action": [
                "iam:DeleteUserPermissionsBoundary",
                "iam:DeleteRolePermissionsBoundary",
                "iam:PutRolePermissionsBoundary",
                "iam:PutUserPermissionsBoundary"
            ],
            "Effect": "Deny",
            "Resource": "*"
        },
        {
            "Sid": "DenyCloudTrailAndConfigChange",
            "Action": [
                "cloudtrail:DeleteTrail",
                "cloudtrail:PutEventSelectors",
                "cloudtrail:StopLogging",
                "cloudtrail:UpdateTrail",
                "config:DeleteConfigurationRecorder",
                "config:DeleteDeliveryChannel",
                "config:DeleteRetentionConfiguration",
                "config:PutConfigurationRecorder",
                "config:PutDeliveryChannel",
                "config:PutRetentionConfiguration",
                "config:StopConfigurationRecorder"
            ],
            "Effect": "Deny",
            "Resource": "*"
        },
        {
            "Sid": "DenyAnyActionsAdminUser",
            "Action": [
                "iam:ChangePassword",
                "iam:Delete*",
                "iam:Detach*"
            ],
            "Effect": "Deny",
            "Resource": "*"
        }
　　　~
```

本当は"iam:Create*"とかも加えたかったが、ロールやポリシーを作れないと困るので、ひとまずこれで。

以下を参考に随時修正予定。

[AWS のサービスのアクション、リソース、および条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html)