はじめに
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で復号化するために権限を許可している。
まとめ
最小の権限を付与するというのは難しく、トライアンドエラーでやっていた部分なので
参考となれば幸いです。