ようへいの日々精進XP

よかろうもん

【俺の一行チップス】S3 バケットポリシーをミスるととても辛いが役に立つ

やりたいこと

  • S3 バケットポリシーにてオブジェクトに対する IP アドレス制御を施したい
  • でも, タイポなくポリシーを登録しないと 403 Forbidden が返ってくるのでデバッグが辛い

やったこと

以下のような S3 バケットポリシーを書いた.

{
    "Version": "2012-10-17",
    "Id": "Allow-from-IP",
    "Statement": [
        {
            "Sid": "Allow-from-IP-addresses",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket.example.com/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "xxx.xxx.xxx.1/32",
                        "xxx.xxx.xxx.2/32"
                    ]
                }
            }
        }
    ]
}

このバケットポリシーを書くことで, IP アドレスによるオブジェクトアクセス制限が設定される. また, 許可された IP アドレスからであれば, 以下のように, Website Hosting を有効にしなくても curl にてオブジェクトにアクセス出来るようにもなるので地味に便利.

$ curl -I https://s3-ap-northeast-1.amazonaws.com/your-bucket.example.com/test.txt
HTTP/1.1 200 OK
... 略 ...
Server: AmazonS3

設定に誤りがあればなんてこんとないバケットポリシーなんですが...

辛い

うっかり, 以下のようにバケットポリシーをタイポしてしまった場合... (xxx.xxx.xxx.2/32xxx.xxx.xxx.2/32/32 とタイポしてしまった...)

{
    "Version": "2012-10-17",
    "Id": "Allow-from-IP",
    "Statement": [
        {
            "Sid": "Allow-from-IP-addresses",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket.example.com/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "xxx.xxx.xxx.1/32",
                        "xxx.xxx.xxx.2/32/32"
                    ]
                }
            }
        }
    ]
}

マネジメントコンソールからポリシーを登録してもエラーにならず登録できてしまう. それに気付かずに許可しているはずの IP からアクセスしても 403 Forbidden になってしまう...

$ curl -I https://s3-ap-northeast-1.amazonaws.com/your-bucket.example.com/test.txt
HTTP/1.1 403 Forbidden
... 略 ...
Server: AmazonS3

二行でまとめると...

  • CIDR の記述まではチェックしてくれないので, typo してても警告しない
  • 許可しているはずの IP からアクセスしても 403 Forbidden になってしまうので原因が分かり辛い

ということで, バケットポリシーを登録する際には注意しましょう.