今回は、S3のバケットポリシーについて、実際の事例ベースでサンプルをご紹介しようと思います。
よくあるのは、Webホスティング機能を使っていて、「一部にしか公開したくない」とか「特定フォルダ以下を除き公開したい」といったリクエストがよくあります。
そこで、そういった利用シーンに応じたポリシーサンプルをババーンと大公開です。
それでは早速いってみたいと思います。
WebホスティングでANY公開する
これは、公式ドキュメントでも公開されているものですね。
「your-backet-name」の箇所は実際のバケット名に合わせてください。
{
"Id": "Policy1445583370774",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1445583369663",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::your-backet-name/*",
"Principal": "*"
}
]
}
拠点IPからのみアクセス許可する
サイトは非公開で、特定のIPだけサイトへのアクセスを許可するポリシーです。
いわゆるホワイトリスト方式です。
下記のサンプルでは、「203.0.113.51」と「198.51.100.2」のIPを許可する例です。
{
"Id": "Policy1437113956086",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1437113953451",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::your-backet-name/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"203.0.113.51/32",
"198.51.100.2/32"
]
}
},
"Principal": "*"
}
]
}
特定IPだけ拒否する
上記とは逆に、サイトは全公開で、特定のIPだけサイトへのアクセスを拒否するポリシーです。
ブラックリスト方式ですね。
ポイントは、先ほどのポリシーとは違い、Condition
の条件にNotIpAddress
を使っているという点です。
下記のサンプルでは、「203.0.113.51」と「198.51.100.2」のIPを拒否する例です。
{
"Id": "Policy1445573554804",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1445573553373",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::your-backet-name/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"203.0.113.51/32",
"198.51.100.2/32"
]
}
},
"Principal": "*"
}
]
}
応用例
サイトは全公開で、指定のフォルダだけ指定のIPだけサイトへのアクセスを許可するポリシーです。
(指定フォルダへのアクセスは、指定IP以外は拒否します。)
下記のサンプルでは「folder」というフォルダに対して、指定IPからのみアクセスできるようになっています。
その他のフォルダのページは全公開です。
ポイントは、対象のarn
でポリシーを2つに分けているという点です。
下記のサンプルでは、「203.0.113.51」と「198.51.100.2」のIPのみ「folder」というフォルダにアクセスできます。
その他のオブジェクトに対しては、全公開になります。
{
"Id": "Policy1445573059412",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1445572735113",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::your-backet-name/*",
"Principal": "*"
},
{
"Sid": "Stmt1445573058285",
"Action": [
"s3:GetObject"
],
"Effect": "Deny",
"Resource": "arn:aws:s3:::your-backet-name/folder/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"203.0.113.51/32",
"198.51.100.2/32"
]
}
},
"Principal": "*"
}
]
}
ポリシージェネレータ
上記のポリシーは、全てポリシージェネレータで作成したものです。
ポリシージェネレータは、リファラー制限などが指定できなかったりしますが、簡単にポリシーが作成できて便利です。