S3バケットに対してIP制限をかけたい

調べたらすぐ出てくるのだが、結構古い内容も多くなかなか正解にたどり着けなかった。 S3はAWS re:Inventなどでちょこちょこ機能追加されてコンソールで設定できる内容が多くなっており、その影響を受けてバケットポリシーを追加するだけではIP制限をかけることができなくなっている。

よって2020/02/14時点の内容をメモしておく。たぶん1年後にはまた操作が変わっていると思われる…

バケットポリシーの設定

バケットポリシーでホワイトリスト形式でIPアドレス制限を行う。

ポイントはリソースで “バケット名"と"バケット名/*“を許可して上げること。 全てDenyにしなくともAllowエフェクトがある場合には許可されているIP以外は拒否されるようだ。

{
    "Version": "2012-10-17",
    "Id": "PolicyId2",
    "Statement": [
        {
            "Sid": "AllowIPmix",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::your-bucket-name/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "AllowedIPaddress1",
                        "AllowedIPaddress2"
                    ]
                }
            }
        },
        {
            "Sid": "AllowIPmix",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::your-bucket-name",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "AllowedIPaddress1",
                        "AllowedIPaddress2"
                    ]
                }
            }
        }
    ]
}

コンソールでの設定

次にコンソールから以下のパブリックアクセスを許可するようポチッとする。

上記の設定でアクセス権限タブに黄色で「パブリック」というマークが付与されるはず。

アクセス確認

上記の設定でIP制限のかかったバケットが出来上がったはず。 バケット直下に適当な画像などを置いて、許可されているIPと許可されていないIPからそれぞれアクセスしてみると制限がかかっていることが確認できると思う。