AWSのS3で直リンクを防止するバケットポリシー
AWSのS3で直リンクを防ぐ方法を紹介ます。
AWS(Amazon Web Service)のS3(Simple Storage Service)にはWebホスティング機能がります。WebホスティングとしてS3を使うとき、気になってくるのは直リンクです。前回、「nginxで直リンクを防止する方法」でnginxを使った場合の直リンク防止方法を紹介しましたが、それをS3でも実装する方法です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Public Read Bucket Objects",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::media.kosukety.org/*"
},
{
"Sid": "Referer Deny",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::media.kosukety.org/*",
"Condition": {
"Null": {
"aws:Referer": false
},
"StringNotLike": {
"aws:Referer": [
"/*",
"/*"
]
}
}
}
]
}
「Resource」部分には自分で設定したバケットの名前を指定します。そして、「Condition」の「aws:Referer」の中に自分のWebサイトを書いておきます。アスタリスクによるワイルドカードが使用できるようです。
まず、最初の条件で許可に関する指定をして、次の条件で拒否の関する指定をします。AWSのドキュメントによると拒否の条件の方が優先されるみたいです。この拒否の条件を設定することで、自分のWebサイト以外からのアクセスを拒否することができます。
ただ、これだけだと、画像のURLを直接ブラウザーに指定した場合にも拒否されてしまいますので、「Null」の項目を設定しておきます。これを設定しておくと、ブラウザーで直接アクセスされた場合にアクセスできるようになります。また、WordPressのプラグインJetpackのCDN、Photonを使用している場合、この設定をしておかないと、どうもWebサイトの画像に直接アクセスできないとCDN上の画像が削除されるようで、WordPress上でPhotonを使った画像表示ができなくなります。
これで、他のWebサイトのためにリソースを無駄遣いしなくて済むようになりますね。AWSなので、アクセス数の巨大な大手サイトから直リンクされると、それだけデータ転送量がかかります。自分のサイトではないWebサイトのためにお金を無償で提供するほど慈悲深くはないですからね。
そうならないためにも、直リンクを防ぐ設定をしておきましょう。