S3では、以下の記事のようなリソースポリシーの設定を行うと、特定IPやVPC Endpointからのみアクセスに限定したS3バケットを作成することが可能です。
明示的な拒否(Deny)にホワイトリストで穴を開けていくような設定となります。
例えばアクセス元のIPやVPC Endpointを穴として開けます。ただ、Athenaのように内部的にはAWSのサービスからS3にアクセス来るものに関しては、アクセス元を特定方法が特殊になります。
IP制限されたS3バケットポリシーの例
IP制限されたS3バケットポリシーを作ってみます。
明示的なDenyを使った強い制限のバケットポリシーとなります。この設定の場合、Condition
でDenyの例外としてホワイトリスト設定されたIPアドレスと、VPC EndpointからのみS3バケットにアクセス可能です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::otomo-bucket", "arn:aws:s3:::otomo-bucket/*" ] }, { "Effect": "Deny", "NotPrincipal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::otomo-bucket", "arn:aws:s3:::otomo-bucket/*" ], "Condition": { "NotIpAddress": { "aws:SourceIp": "MYIP/32" }, "StringNotEquals": { "aws:sourceVpce": "vpce-s3endpoint" } } } ] }
Athenaからのアクセス方法
方法① IAMロールをホワイトリストに登録(userid)
IAMロールのIDをS3バケットポリシーのホワイトリストに登録する方式。
IAMロールのIDは以下のコマンドで取得可能です。
$ aws iam get-role --role-name AthenaRoleName --query 'Role.RoleId' AXXXXXXXXXXXXXXXXXXX
S3のバケットポリシーの例です。
{ "Effect": "Deny", ----------------------------------- 省略 ----------------------------------- "Condition": { "StringNotLike": { "aws:userid": [ "AXXXXXXXXXXXXXXXXXXX:*" ] },
ポイント
ロール単位なので、比較的細かな制御が可能です。
例えば、ワイルドカード部分をインスタンスIDにすれば特定インスタンスからのアクセスに制限することも可能(参考URL)
例 AXXXXXXXXXXXXXXXXXXX:i-0xxxxxxxxxxxxxxxx
ホワイトリストとして登録するため、Athenaを利用する人やサーバーが頻繁に変わる場合などは、S3のバケットポリシーを編集する回数が増えるので、運用が煩雑になりそうです。
考慮点
- IAMロールをAssumeする必要がある。Accsess Key + Secret Access Keyのみ対応しているような、IAMロールのAssume機能を実装していないソフトウェアからはAthenaの利用ができません
- IP制限はIAMロール側などで実装する必要があります
方法② Athenaからのアクセスをホワイトリストに登録(CalledVia)
Athenaからのアクセスをホワイトリストに登録する方式です。 CalledVia
という項目で設定可能です。
S3のバケットポリシーの例です。
{ "Effect": "Deny", ----------------------------------- 省略 ----------------------------------- "Condition": { "ForAnyValue:StringNotEquals": { "aws:CalledVia": [ "athena.amazonaws.com" ] }
ポイント
Athenaの利便性を損なうことなく、IP制限済みのS3バケットを利用することが可能。
ただ、S3リソースポリシーとしては、AthenaはOKという比較的大雑把な制御になる。IAMポリシー側で注意して制御をする必要がある。
考慮点
- AthenaはOKという比較的大雑把な制御なので、セキュリティレベルを下げないためには、IAM側で厳密な制御が必要です
- IP制限はIAMロール側などで実装する必要があります