S3 のオブジェクト に対して、特定のFQDN を用いた場合のみアクセスさせたい場合の対処法

S3 のオブジェクト に対して、特定のFQDN を用いた場合のみアクセスさせたい場合、S3 バケットポリシーに特定の HTTP Referer へのアクセス制限を追加してください。
2021.09.14

困っていた内容

example.com という URL のサイトを作成しています。

サイト内で S3 オブジェクトを参照しています。

S3 のオブジェクト に対して、特定のFQDN を用いた場合のみアクセスしたいと考えています。

どのような方法がありますか?

どう対応すればいいの?

example.com からのアクセス(読み取り)のみを許可する場合は、S3 のバケットポリシーに以下の設定を追加してください。

{
  "Version":"2012-10-17",
  "Id":"http referer policy example",
  "Statement":[
    {
      "Sid":"Allow get requests originating from example.com.",
      "Effect":"Allow",
      "Principal":"*",
      "Action":["s3:GetObject","s3:GetObjectVersion"],
      "Resource":"arn:aws:s3:::EXAMPLE-BUCKET/*",
      "Condition":{
        "StringLike":{"aws:Referer":["http://example.com/*"]}
      }
    }
  ]
}

やってみた

S3 の静的ウェブサイトホスティング機能を用いて、testhayakawa.xxx.classmethod.xxx に以下の HTML にてページを作成しました。 その際に、別の S3 バケット: test-hayakawa-public から画像を取得する img タグを記述しています。

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>My Website Home Page</title>
</head>
<body>
  <h1>Welcome to my website</h1>
  <p>Now hosted on Amazon S3!</p>
  <p><img src="https://test-hayakawa-public.s3.ap-northeast-1.amazonaws.com/image.png"></p>
</body>
</html>

S3 バケット: test-hayakawa-public のバケットポリシーは以下となっています。

{
    "Version": "2012-10-17",
    "Id": "http referer policy example",
    "Statement": [
        {
            "Sid": "Allow get requests originating from www.example.com and example.com.",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::test-hayakawa-public/*",
            "Condition": {
                "StringLike": {
                    "aws:Referer": "http://testhayakawa.xxx.classmethod.xxx/*"
                }
            }
        }
    ]
}

リファラとして testhayakawa.xxx.classmethod.xxx からのみオブジェクトを取得できる設定をしているため、画像が読み込まれます。

S3 バケット: test-hayakawa-public のバケットポリシーを以下に変更します。

{
    "Version": "2012-10-17",
    "Id": "http referer policy example",
    "Statement": [
        {
            "Sid": "Allow get requests originating from www.example.com and example.com.",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::test-hayakawa-public/*",
            "Condition": {
                "StringLike": {
                    "aws:Referer": "http://hogehoge.xxx/*"
                }
            }
        }
    ]
}

リファラとして testhayakawa.xxx.classmethod.xxx を許可していないため、画像が読み込まれなくなりました。

注意点

カスタムブラウザなどによって、リファラ値は偽装が可能なため、不正アクセスをブロックする用途には向いていないとお考え下さい。

参考資料

特定の HTTP Referer へのアクセスの制限 - バケットポリシーの例 - Amazon Simple Storage Service