Heroku アプリケーションに WAFとCDNを導入する

## (おさらい）WAFとは
Web Application Firewall ですね。ウェブアプリケーションの脆弱性を悪用した攻撃対策に導入されるケースがあります。
導入の際に理解しておいてほしいこととして、WAFは脆弱性攻撃を**緩和**するのであって、脆弱な点を消し去るモノではありません。つまりは、脆弱なアプリケーションは脆弱なママです。脆弱な点は根本的に解決（＝脆弱なコードを修正する）ことが必要であることはお忘れ無く。
## Heroku で WAF といえば、sqreen??
以前は、sqreen というWAFが、Heroku Add-onとして利用可能でした。しかし、sqreenは、2021年2月11日にDatadogに買収され、現在は、Herokuアプリケーションに追加できません。
### [参考] sqreenについて
sqreenは、最近、よく導入されるアプリケーションの前段に配置されるSaaSタイプのWAFではなく、HerokuにおいてはWeb Dynoの
プロセスの1つとして動作し、利用言語に応じた(例えば、PHPの脆弱性を防御する仕組みは、Javaアプリケーションには適用しない)ファイアーウォールを提供するというWAFでした。
## 現在（2021/12/17）Heroku Add-onとして提供されているWAFは、Expedited WAF
Expedited WAFは、SaaSタイプのWAFでHerokuアプリケーションの前段に配置され、Herokuアプリケーションへのアクセスは、WAFを経由することになります。
![waf-diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/43bbb0f3-ce1a-f986-be7d-bbc432a54391.png)
## Expedited WAF 大雑把なインストール手順
Expedited WAFのインストールはDNS設定に精通していれば、特に難しいことも無く、DNSを数回編集するだけです。
### 事前準備
WAF適用するHerokuアプリケーションに事前準備が必要です。といっても難しいことは無く

1. カスタム（独自）ドメインの設定
1. StandardもしくはProfessional Dynoに変更
1. （ACMの適用）

です。この時に設定する、カスタムドメインが、そのままWAFに自動設定されるので、WAF適用後に運用するドメイン名を設定します。

### Add-onの追加
特に難しいことありませんね。ダッシュボードやCLIでExpedited WAFを追加します。プランの途中変更も可能なので、各プランの機能や制限の詳細な事前確認は必要はないかもです。まずは導入してみましょう。
![Screen Shot 2021-12-17 at 18.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/34f5aa2d-8a4b-888a-4cb9-5da08e253119.png)
### ひたすらDNSの設定
DNSの設定に慣れていていれば、悩む場面も無いと思われます。何度にわけてDNSを操作するので、DNSのTTL設定は一旦短しておいた方が、作業の生産性は高いかもしれません。

### 実はWAF奥が深い世界
と、まぁ、簡単にExpedited WAFを導入できたわけなのですが、マジメに？！WAF運用するのはかなり大変です。というのも、WAFの設定（ポリシーと呼ばれることが多い）の強度を上げすぎると、そもそもアプリケーションの動きが予期しない状態になったり、強度を下げると、攻撃を素通りさせてしまったりします。また、新たな攻撃方法が生み出されれば、その攻撃に対応したポリシーの設定をする等のバランスをとる作業が恒久的に必要です。
Expedited WAFが防御する攻撃や設定方法については[公式ドキュメント](https://docs.expeditedsecurity.com/)を参照してください。OWASP TOP 10への対応として、[How to Block the Latest OWASP Top 10 Vulnerabilities on Heroku](https://expeditedsecurity.com/heroku/how-to-block-owasp-top-ten-vulnerabilities-on-heroku/)も公開されています。
## Expedited WAF以外の機能紹介
Expedited WAFは「WAF」あるので、WAFだと認識されているケースも多い（という私もそう思っていた）のですが、実は、WAF以外の機能も提供されているので紹介します。

### IPベースのトラフィックコントロール
いわゆる、IPアドレスのホワイトリスト、ブラックリストです。アクセスを禁止するIPアドレス、許可するIPアドレスを設定できます。ブラックリスト設定されたIPアドレスからのアクセスがあるとForbidden(HTTP 403)でアクセスできなくなります。
![403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/d32070a0-02be-c9c1-e9a1-c0898682c4e1.png)
### 国別トラフィックコントロール
特定の国からのアクセスをブロックします。ウェブサイトではあまりみかけませんが、国ごとに著作権管理されている動画などを配信しているウェブサイトポータル等では、有効な機能かもしれません。
![country.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/b61c0f1d-7ac6-9489-6f11-c4b5dc44c238.png)
### ユーザーエージェントベースのトラフィックコントロール
BOTからのアクセスを制限したい場合などに有効です。
![bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/ca8aa317-6188-88b5-10d8-9962777e48d0.png)
### HTTP リクエストメソッドの制限
GET,HEAD,POST,DELETE,PUT等のメソッド制限できます。
![head.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/393cca94-90c6-7bab-bba4-153a0ccd2789.png)
### その他、様々な攻撃からの防御
匿名プロキシーからのアクセス禁止、DDoS(HTTPフラッド)の防御、HTMLフォーム投稿利用の禁止、等の機能も提供されています。
## 本題?!のCDN
個人的には、全てのウェブサイトでCDN(Content Delivery Network)を利用すべきと思っています。そして、WAFとCDNを組み合わせる際、どういった順序するか悩ましいところですが、Expedited WAF 実はCDNの機能も備えています。
すべてをキャッシュするFull site profileと、HTMLはキャッシュせず、画像、js、CSSなどをキャッシュする Asset only profileの使い分けが可能で、Asset only profileの場合は、HTTPヘッダーの[Cach-Control](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control)を使ってページごとにキャッシュする時間の制御も可能です。
## Expedited WAFのCDNの効果を測定する
Expedited WAF導入でどのくらいに速度効果が見込めるのか簡単にテストしてみました。
オリジンとなるHerokuアプリケーションは米国Common Runtime(バージニア）に配置。個人的都合で、川崎市内からアクセスした場合の応答速度を計測しました。計測には、tcpベースでpingっぽいコトのできる[psping](https://docs.microsoft.com/en-us/sysinternals/downloads/psping)を利用しています。
### オリジン(herokuアプリケーション)に直接アクセスした場合(川崎<->バージニア)
![direct.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/86d43f5d-ef1c-89d4-f8af-67adb97d66a0.png)
### Expedited WAF経由でアクセスした場合(川崎<->どっか[おそらく東京]CDNのエッジ)
![waf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/c7c9cfa7-57b3-ecf4-2ea8-b82dd92e9dc0.png)
CDN経由の場合、多少の揺らぎがありますが、かなりの高速化がおこなわれているのがわかりますし、なにより、Expedited WAF以外にCDNを導入しなくて良い(≒別途費用がかからない）のが楽ちんで良いです。
### [超ご参考]Epedited WAFの裏側
ホワイトリスト・ブラックリストでアクセス制限した場合に表示される画面等からもわかるのですが、Expedited WAFの裏側は[sucuri](https://sucuri.net/)のサービスを利用しているようで、テストに使ったウェブサイトのPTRレコードは、cloudproxy10038.sucuri.netでした。なんとなく、CDNのエッジぽい命名規則という感じです。
sucuriという企業、日本では、聞いたことがない企業かもしれませんが、2017年にGoDaddy（これまた聞いたことないかもしれませんが、世界最大のドメインレジストラです）に買収されたウェブサイトのセキュリティ企業です。
## Expedited WAFは、簡単で早いWAF&CDN
今までも、Herokuアプリケーション構築時に、WAFが必要な場合は、このExpedited WAFを紹介していたのですが、今回、あらためて調べてみると、特にコンシューマ向けウェブサイトをHeroku上に構築する場合、導入しておいて損しないのが、このExpedited WAFではないかと、深く思いました。
オススメ。