IP制限かかっているS3バケットにAthenaでアクセスする

S3では、以下の記事のようなリソースポリシーの設定を行うと、特定IPやVPC Endpointからのみアクセスに限定したS3バケットを作成することが可能です。

aws.amazon.com

明示的な拒否(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 という項目で設定可能です。

aws.amazon.com

S3のバケットポリシーの例です。

        {
            "Effect": "Deny",
-----------------------------------
     省略
-----------------------------------
            "Condition": {
                "ForAnyValue:StringNotEquals": {
                    "aws:CalledVia": [
                        "athena.amazonaws.com"
                    ]
                }
ポイント

Athenaの利便性を損なうことなく、IP制限済みのS3バケットを利用することが可能。

ただ、S3リソースポリシーとしては、AthenaはOKという比較的大雑把な制御になる。IAMポリシー側で注意して制御をする必要がある。

考慮点
  • AthenaはOKという比較的大雑把な制御なので、セキュリティレベルを下げないためには、IAM側で厳密な制御が必要です
  • IP制限はIAMロール側などで実装する必要があります