やりたいこと
やったこと
以下のような 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/32
を xxx.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 になってしまうので原因が分かり辛い
ということで, バケットポリシーを登録する際には注意しましょう.