全体を Allow したあとに、制限したいパスに対して Deny を追加すれば
可能。
例えば以下の場合。
https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/aaa/
*
→ インターネットに全公開
https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/bbb/
*
→ IP アドレス AAA.BBB.CCC.DDD からのアクセスのみ許可
このようなポリシーになる。
{
"Id": "Policy1234567890",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt0123456789",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::masutaka-hoge/*",
"Principal": "*"
},
{
"Sid": "Stmt9876543210",
"Action": [
"s3:GetObject"
],
"Effect": "Deny",
"Resource": "arn:aws:s3:::masutaka-hoge/bbb/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "AAA.BBB.CCC.DDD"
}
},
"Principal": "*"
}
]
}
S3 の Console の Bucket の Permissions → Bucket Policy で上記ポリ
シーを設定する。
ポリシーはそこから辿れる AWS Policy Generator から作成する。
結果
インターネットの任意のホストからのアクセス。
$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/aaa/aaa.txt
aaa
aaa
aaa
$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/bbb/bbb.txt
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>5B876BEDB07E4200</RequestId><HostId>jr8SuXmK87eoccoKG6fuC1KZTjtXRdDF3A13sNv419efcOMGKih0wcBKl+cWj0IzV+jwRQ1xEsA=</HostId></Error>%
IP アドレス AAA.BBB.CCC.DDD からのアクセス
$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/aaa/aaa.txt
aaa
aaa
aaa
$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/bbb/bbb.txt
bbb
bbb
bbb
所感
個人的には気持ち悪い運用だと思う。間違えた場合に気づくことが難しく、
監視もやりづらいので、積極的には関わりたくはない。
参考にした記事: S3 IP制限|cloudpack.media