streampack の Tana です。

概要

動画や画像などを配信しているリンクなどがあると思いますが、外部サービスにリンクを貼られるなど、使われたくないケースがあるかと思います。サーバサイドでは nginx などで制御できますが、急激なスパイクやトラフィックなどを意識したくないので、CDN(CloudFront) できればなぁっと思ってたら、AWS WAF で制御することができることをつい最近知りました(汗)

AWF WAF
https://console.aws.amazon.com/waf/home

細かな IP制限、パラメータ制限、地域制限なども可能ですし、
対象リソースを CloudFront だけでなく、ALBAPI Gateway も連携対象にすることができます。

今回は直リンク(Hot-linking防止)ではアクセスできないようにし、s3のドメインからのみ許可してみます。

設定方法

Web ACLs から作成するとわかりにくいので、String and regex matching から作成します。

String and regex matching: 条件設定

どういう条件を対象にするかを設定します。
URLやパラメータ、Header など細かな条件を指定できます。
domain-check という名前で作成し、今回はHeaderのリファラーをチェックします。

Rule

ルールを作成します。複数の条件を紐づけることができます。
domain-rule という名前で新規に作成、先ほど作成した条件の domain-check というのを紐付けます。

Web ACLs 設定

domain-ruleを紐付けし、今回事前に作成しておいた、CloudFrontを指定します。

Edit ACLs

Edit ACLs にて、条件を指定します。
条件にマッチしたもののみ許可! という設定にしてます。
つまり、s3 経由でないとアクセスさせません。

直リンクでアクセスしてみる

期待通りに、アクセスできません。

s3 経由で html にアクセス

下記の html を作成し、CloudFront の動画を参照してみます。

test.html

<video width="640" height="360" controls>
  <source src="http://xxxxx.cloudfront.net/tmp/test.mp4" type="video/mp4">
</video>

動画にアクセスすることができました。

結論

WAFを使えば、UI上で簡単に登録し、制限をかけることができました。
もっと細かにルール・条件を作成すれば、より強固なものが提供できそうです。
リクエスト数によって課金されるようなので、必要なリソースのみ制限をかけるのが良さそうです。

元記事はこちら

WAF を使って hot-linking 対応