公開日:

AWS S3のバケットポリシーで”aws:Referer”を加えるとアクセスできない

タイトルの通り。もう何時間も溶かした。今深夜の2時半で、ターミナルの文字が浮き出ているように見えるくらい疲れているが備忘録。

S3で特定のドメインからのみのアクセスを許可したい

EC2上でWebアプリケーションが動いていて、S3上に動画ファイルが存在する。

Webブラウザを通してそのS3上にある動画を見たい、というとき、まあCORSやって、S3上のオブジェクトを公開して、というふうにするんじゃないかと思う。

しかし、他の不特定多数にリンクが広まってしまってダウンロードされるのが困る、という場合が多々ある。

そうしたときにS3のバケットポリシーでアクセス制限をすることが可能である。

参考: https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/example-bucket-policies.html

ここでは以下のJSON例が書かれている。

{
  "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:::DOC-EXAMPLE-BUCKET/*",
      "Condition":{
        "StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
      }
    }
  ]
}

なるほどなるほど。”Condition”:{“StringLike”:{“aws:Referer”: を追加してやればいいんだな、と思い追加する。

するとアクセスできない。403エラーである。どうしたものか。

注意書きに「使用するブラウザのリクエストに HTTP referer ヘッダーが含まれることを確認します。」と書かれているので、Chromeの開発者ツールで確認するも含まれていない。これじゃないのか?

Djangoで開発しているのでそれかと思い調べるもない、ALBも使っているのでそれとNginxがなんか悪いんじゃないかと思い調べるもない……どうして。

そう思ったとき、例が「HTTP」であることに気づいた。

そう、私が作成していたWebアプリケーションはHTTPS化されているので、リファラが飛ばないのである。いや常識かもしれないけど私は知らなかったので……ごめんなさい……。

そこで

<meta name="referrer" content="origin">

を追加して強制的にリファラをヘッダに含めることにしたらうまくいった。

めでたしめでたし(涙