はじめに
Heroku アプリに WAF を入れたくて調べたところ、Expedited WAF というアドオンを見つけました。
ただ、日本語の情報があまりなく、既存の記事と実際の画面で一部やり方が変わっていたりして、けっこう手間取ったので今回設定した手順を一通りまとめておきます。
カスタムドメインのドメイン移行(旧ドメイン → 新ドメイン)をやりつつ WAF を導入した、というケースで書いていますが、新規導入でもだいたい同じ流れです。
前提
- Heroku アプリにカスタムドメインを追加済み(
heroku domains:add済み) - DNS で CNAME が Heroku の DNS Target に向いている
- Heroku CLI インストール・ログイン済み
1. WAF をプロビジョニングする
CLI でアドオンを追加します。
heroku addons:create expeditedwaf:basic --app <YOUR_APP_NAME>
旧ドメイン用の WAF が既にある場合は、新しい WAF アドオンが別で追加されます。移行中は両方アクティブなのでダウンタイムなし。
追加できたら、Heroku Dashboard の Overview > Add-ons に「Expedited WAF」が出ているはずです。
2. WAF ダッシュボードでドメインを選ぶ
- Heroku Dashboard で対象アプリを開く
- Overview > Add-ons の「Expedited WAF」をクリック
- WAF 管理画面が別タブで開く
-
「Choose the Domain」 で WAF を適用したいドメイン(例:
example.your-domain.com)を選んで 「Select Domain」
3. ドメインの所有権を確認する(DNS 検証)
WAF 側がドメインの持ち主かどうか確認するために、CNAME レコードの追加を求められます。
3-1. 検証用の CNAME 情報をメモる
「Verify your Domain Ownership」 ページに以下が表示されます。
| 項目 | 例 |
|---|---|
| CNAME NAME(名前) | _XXXXXXXX.your-subdomain |
| CNAME CONTENT(値) | XXXXXXXX.XXXXXXXX.XXXXXXXX.sectigo.com |
この値をメモしておきます。
3-2. DNS に検証用 CNAME を追加する
DNS 管理画面で以下を追加。
| タイプ | ホスト名 | VALUE |
|---|---|---|
| CNAME | CNAME NAME の値 | CNAME CONTENT の値 |
既存のサブドメインの CNAME とは別のレコードなので、上書きしないように注意。
3-3. DNS 検証を実行する
- WAF 管理画面に戻る
- 「Check for DNS CName」 をクリック(放置していても数分で自動検出される)
- WAF のビルドが始まる
ビルドは 10〜20 分くらいかかるので待ちます。
※数時間かかる場合もあるので注意
4. DNS を A レコードに切り替える
ビルドが終わると 「Final Step」 画面が出ます。
4-1. WAF の A レコード IP をメモる
画面に表示される A レコードの IP アドレスをメモします。
4-2. DNS を切り替える
DNS 管理画面で以下の順番で操作します。
- 対象サブドメインの CNAME を削除(Heroku DNS Target を指しているやつ)
- A レコードを追加
| タイプ | ホスト名 | 値 |
|---|---|---|
| A | your-subdomain |
WAF 画面に表示された IP |
CNAME と A レコードは同じホスト名に共存できないので、CNAME を先に消してから A レコードを追加してください。
4-3. 稼働確認
WAF 管理画面の 「Refresh DNS Results」 をクリックして、正常に動いていることを確認します。
5. SSL 証明書の確認
WAF 経由で SSL がちゃんと効いているか確認しておきます。
echo | openssl s_client -servername <YOUR_DOMAIN> -connect <WAF_IP>:443 2>/dev/null | openssl x509 -noout -subject -issuer -dates
-
subjectにドメイン名が入っている -
datesの有効期限が妥当
これが出ていれば OK です。
6. WAF プランのアップグレード
basic プランだと機能が限られるので、本番では必要に応じてアップグレードします。
- Heroku Dashboard で対象アプリを開く
- Resources タブで「Expedited WAF」の 「Modify Plan」 をクリック
-
advanceなど必要なプランを選んで保存
7. 旧ドメインの WAF を削除する(ドメイン移行の場合)
旧ドメインに WAF の A レコードが残ったままだと WAF が二重になってしまうので、旧ドメインの DNS を Heroku 直結に戻します。
7-1. 旧ドメインの DNS を確認する
dig <OLD_DOMAIN> +short
- IP アドレスが返ってくる → WAF 経由になっている
-
xxx.herokudns.comが返ってくる → Heroku 直結
7-2. 旧ドメインの DNS を戻す
- DNS 管理画面で A レコードを削除
- CNAME を追加(値は Heroku Dashboard の Settings > Domains にある DNS Target)
7-3. 動作確認してから WAF を消す
- 旧ドメインでアクセスできるか確認
- 新ドメインでアクセスできるか確認
- 問題なければ旧ドメインの WAF アドオンを削除
IP 制限の設定
WAF の管理画面から、特定の IP だけ通す設定ができます。
やりたいこと
サイト全体に IP 制限をかけて、許可した IP 以外はアクセスできないようにする。
設定手順
- WAF 管理画面を開く
- Protect Pages > IP Allowlist に移動
- Allow IPs に許可する IP アドレスを追加
-
IP Restricted Pages に
/を指定
/ を入れておくと全ページが制限対象になり、Allow IPsに入っていないIPからはアクセスできなくなります。
API エンドポイントや静的ファイルも含めて全部制限されるので、特定のページだけ制限したい場合は /admin のように制限したいパスを指定してください。
IP 制限の移行時の注意点
ドメイン移行で WAF を作り直すと、IP Allowlist の設定は引き継がれないので手動で設定し直す必要があります。
手順としてはこの順番でやると安全です。
- 新ドメインの WAF に同じ Allow IPs を登録(DNS 切り替え前にやる)
- IP Restricted Pages に
/を設定 - DNS を切り替える
- 新ドメインで IP 制限が効いているか確認
- 問題なければ旧ドメインの WAF を削除
DNS 切り替え前に IP Allowlist を設定しておかないと、切り替え直後に制限なしの状態ができてしまうので注意。
ハマったところ
WAF ビルドが始まらない
DNS の CNAME 設定が間違っていたことが原因でした。
SSL 証明書が出てこない
ACM(自動SSL証明書管理)が有効になっていなかったのが原因で、以下のコマンドで有効化したら解決しました。
heroku certs:auto:enable --app your-app-name
CNAME と A レコードの共存エラー
DNS の仕様で同じホスト名に CNAME と A は共存できません。A レコードを追加する前に CNAME を消してください。
まとめ
やることをざっくり並べると
-
heroku addons:createで WAF アドオンを追加 - WAF ダッシュボードでドメインを選択
- 検証用 CNAME を DNS に追加してドメイン所有権を確認
- CNAME → A レコードに切り替えてトラフィックを WAF 経由にする
- SSL 証明書が有効か確認
ドメイン移行のときは、新ドメインの WAF が安定してから旧ドメインの WAF を消せば、ダウンタイムなしで移行できます。