思考停止でFullAccess許可しないためのIAMポリシー例

AWSベストプラクティスですがIAMユーザーに必要以上に広い権限を与えないようにしないといけません。
必要以上の権限を与えすぎると、アカウント流出時に広範囲な被害受けたり、調査が必要になったりますし、IAMを使うプログラムやオペレーションで意図しない操作を行ってしまったりと非常に危険です。

個人的によく設定してるものをいくつか紹介。

S3の特定のバケットの読み書き

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:Delete*",
                "s3:Get*",
                "s3:List*",
                "s3:Put*"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}

DynamoDBの特定テーブルの読み書き

SESでメール送信のみ

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "*"
        }
    ]
}

CloudFrontのインバリデーションのみ

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudfront:CreateInvalidation",
                "cloudfront:GetDistribution",
                "cloudfront:GetInvalidation",
                "cloudfront:GetStreamingDistribution",
                "cloudfront:GetDistributionConfig",
                "cloudfront:ListDistributions",
                "cloudfront:ListInvalidations",
                "cloudfront:ListStreamingDistributions"
            ],
            "Resource": "*"
        }
    ]
}

IAMユーザー

アカウントのコストと利用状況のみ確認できる

IAMユーザー自身にMFAの設定権限を与える