【Athena】Athena専用IAMポリシーの作成

はじめに

IAMポリシーを必要なものに絞って作成することはセキュリティの観点で重要です。
AWSでデータ分析をする上で初期に利用されるであろうAthenaについて
Athenaのみを実行するIAMポリシーを作成しました。

また、今回、S3にエクスポートした内容を含めて検索するようにしたいため
KMS の権限も付与する。

結論

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BaseAthenaPermissions",
            "Effect": "Allow",
            "Action": [
                "athena:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "BaseGluePermissions",
            "Effect": "Allow",
            "Action": [
                "glue:GetDatabase",
                "glue:GetDatabases",
                "glue:CreateTable",
                "glue:DeleteTable",
                "glue:BatchDeleteTable",
                "glue:UpdateTable",
                "glue:GetTable",
                "glue:GetTables",
                "glue:BatchCreatePartition",
                "glue:CreatePartition",
                "glue:DeletePartition",
                "glue:BatchDeletePartition",
                "glue:UpdatePartition",
                "glue:GetPartition",
                "glue:GetPartitions",
                "glue:BatchGetPartition",
                "glue:StartColumnStatisticsTaskRun",
                "glue:GetColumnStatisticsTaskRun",
                "glue:GetColumnStatisticsTaskRuns"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "BaseQueryResultsPermissions",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload",
                "s3:CreateBucket",
                "s3:PutObject",
                "s3:PutBucketPublicAccessBlock"
            ],
            "Resource": [
                "arn:aws:s3:::[AthenaのSQL履歴を格納するバケット名を指定]",
                "arn:aws:s3:::[AthenaのSQL履歴を格納するバケット名を指定]/*"
            ]
        },
        {
            "Sid": "BaseAthenaDataPermissions",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::[データが入っているバケット名を指定]",
                "arn:aws:s3:::[データが入っているバケット名を指定]/*"
            ]
        },
        {
            "Sid": "BaseS3BucketPermissions",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "AllowKMSDecrypt",
            "Effect": "Allow",
            "Action": [
              "kms:Decrypt",
              "kms:DescribeKey"
            ],
            "Resource": [
                "arn:aws:kms:ap-northeast-1:[AWSアカウントID]:key/[KMS ID]"
            ]
        }
    ]
}

詳細に説明していく。

BaseAthenaPermissions

Athena全体に権限を許可している。 もう少し絞れば良さそうだが、実行できなくなる可能性のでこの通りとした。

BaseGluePermissions

Glue Data Catalogにアクセスするため、この権限にしている。 さらに権限を絞るのであれば、 glue:CreateTable, glue:DeleteTable は削除しても良さそう。

BaseQueryResultsPermissions

Athenaのクエリを保存するS3バケットの権限を設定している。

BaseAthenaDataPermissions

Athenaで検索する対象のデータが格納されているS3フォルダの権限を許可している。

BaseS3BucketPermissions

AWSコンソールで BaseQueryResultsPermissions に必要なS3バケットを選択するときに利用する権限なので全体を許可している。 IaCなどで設定する場合、この権限は不要。

AllowKMSDecrypt

S3に個別にKMSを設定されている場合、そのKMSで復号化するために権限を許可している。

まとめ

最小の権限を付与するというのは難しく、トライアンドエラーでやっていた部分なので
参考となれば幸いです。

参考

docs.aws.amazon.com