前提
- Windows
- NodeJSアプリ
- Heroku CLIインストール済 &
heroku login
実行済 - Expedited WAFのプラン決定済 → https://elements.heroku.com/addons/expeditedwaf#pricing
- 当該アプリに付与するカスタムドメイン名決定済
- 当該ドメインのDNSへのCNAMEレコード・Aレコードの追加・削除が可能
手順その1(Expedited WAF導入前に最低限のアプリを作成してhttps://カスタムドメイン名
にアクセス可能としておく)
- Herokuダッシュボードにブラウザでアクセス
- Herokuアプリを作る
- 当該アプリのSettingsタブを開く
- Buildpacks欄のAdd buildpackボタンからnodejsを追加(他にも追加予定のビルドパックがある場合は先に追加しておく)
- コマンドプロンプトで任意のフォルダに移動し、以下を実行して最低限のアプリを作成
heroku git:clone -a <アプリ名> cd <アプリ名> echo { ^"scripts^": { ^"start^": ^"node index.js^" } } > package.json echo require('http').createServer((_, res) =^> res.end('ok')).listen(process.env.PORT) > index.js git add . git commit -m "minimum app" git push heroku master
- ブラウザに戻り、SSL Certificates欄のConfigure SSLボタンからACMを有効化
- Domains欄のAdd domainボタンから使用予定のカスタムドメイン名を追加
- 表示されたDNS Target(
app-xxx.xxx.herokuspace.com
形式)を使用して、DNSにCNAMEレコード(★1)を一時的に追加 (DNS作業1/3、ExpeditedWAFからのアプリ正常稼働確認用一時レコード追加)- Record Name:<カスタムドメイン名>
- TTL:60(後で本レコードを削除する予定があるため短めにしておく)
- Class:IN
- Type:CNAME
- Canonical Name:<DNS Target>
- Domains欄のACM Statusが
Dns Verified
になることを確認 - ブラウザまたはコマンドプロンプトで
curl -I https://<カスタムドメイン名>
を実行し、HTTPステータス200 OK
が返ることを確認
手順その2(Expedited WAFインストール・セットアップ)
- ブラウザに戻り、Resourcesタブを開く
- Add-on Services欄でExpedited WAFを検索して押下、プランを選択してインストール
- アドオン名Expedited WAFを押下
- Select Domainボタンを押下
- 表示されたドメイン所有者確認用のCNAME NAME・CNAME CONTENTを使用して、DNSにCNAMEレコード(★2)を一時的に追加 (DNS作業2/3、ExpeditedWAFからのドメイン所有者確認用一時レコード追加)
- Record Name:<CNAME NAME>(枠外に表示されるTLDを含めたFQDNで指定)
- TTL:60(後で本レコードを削除する予定があるため短めにしておく)
- Class:IN
- Type:CNAME
- Canonical Name:<CNAME CONTENT>
- 「Check for DNS CName」ボタンを押下(★2を検知して勝手に画面が進むかも)
- WAF Buildingが終了してメールが届く&次の画面が表示されるまで待つ(約11分)
- 表示されたAレコード値(IPアドレス)を使用して、DNSに以下の操作を行う (DNS作業3/3、一時レコード削除、WAF経由アクセス用正式レコード追加)
- ★1のCNAMEレコードを削除
- ★2のCNAMEレコードを削除
- 以下のAレコードを追加
- Record Name:<カスタムドメイン名>
- TTL:3600(標準的な値)
- Class:IN
- Type:A
- Value(IPアドレス):<表示されたAレコード値>
- 「Refresh DNS Results」ボタンを押下し、完了メッセージが表示されることを確認
- コマンドプロンプトで
nslookup -type=CNAME <カスタムドメイン名>
を実行し、結果が当該ドメインのDNSサーバ情報のみであることを確認 (削除後2〜5分してから実行) - コマンドプロンプトで
nslookup -type=CNAME <★2のRecord Name>
を実行し、Non-existent domain
になることを確認 (削除後2〜5分してから実行) - コマンドプロンプトで
nslookup -type=A <カスタムドメイン名>
を実行し、結果が表示されたAレコード値であることを確認 - コマンドプロンプトで
curl -v https://<カスタムドメイン名>
を実行し、結果がok、かつHTTPステータスが200、かつServerヘッダがSucuri/Cloudproxyである(WAF経由での応答)ことを確認
手順その3(Expedited WAF設定)
文中のLearn Moreとかは以下やその子ページへのリンク
https://expeditedsecurity.com/
https://expeditedsecurity.com/heroku/
注意事項
- HerokuアプリのSettingsのカスタムドメイン・SSL証明書を削除しないこと
(WAFからの通信が通らなくなる) - WAFで
/.well-known/acme-challenge/
をブロックしないこと
(Let's EncryptからのACMEチャレンジが失敗する)
→ https://letsencrypt.org/ja/docs/challenge-types/ - 認証必要なURLや動的コンテンツを返却するURL等の末尾に「.jpg」等の拡張子をつけないこと
(静的ファイルだと思われてWAFがキャッシュしてしまう)
→ http://docs.expeditedsecurity.com/article/30-asset-file-caching
以上