· HARUBOUYA · design · 21 min read

Cloudflare Pagesで行うべきセキュリティ設定

無料の範囲でできることを、優先度の高い順に並べます。常時HTTPS、HSTS、ボット対策、メールのなりすまし防止、セキュリティヘッダーまでまとめます。画面の場所と押すボタンを具体的に書きます。

クラウドの記号を盾と南京錠で囲んだイラスト

静的サイトを Cloudflare Pages で公開すると、それだけである程度は守られます。ただし既定のままでは穴が残ります。

公開したその日から、自動化されたアクセスが来ます。管理画面を探す巡回、古い脆弱性を試す通信、ドメインを騙ったメールの送信などです。どれも狙い撃ちではなく、機械的に全世界のドメインへ向けられているものです。

ここでは無料の範囲でできる設定を、効果の大きい順に並べます。

前提:設定する場所が2つに分かれている

最初に混乱する点です。同じ Cloudflare の管理画面でも、設定の置き場所が2か所あります。

場所何を設定するか行き方
Pagesプロジェクト公開の設定、独自ドメインの接続、レスポンスヘッダー左メニュー「Workers & Pages」→ プロジェクト名
ドメイン(ゾーン)HTTPS、HSTS、DNS、ボット対策、ファイアウォール「アカウント ホーム」→ ドメイン名

セキュリティ設定のほとんどはドメイン側です。Pagesプロジェクトの画面をいくら探しても見つかりません。

優先度の一覧

順位設定費用手間失敗したときの影響
1常時HTTPS無料1分なし
2メールのなりすまし防止無料10分設定次第でメールが届かなくなります
3www の名前解決無料5分なし
4ボット対策無料1分一部の自動アクセスが止まります
5セキュリティヘッダー無料15分設定次第で表示が壊れます
6HSTS無料3分元に戻すのが難しいです
7プレビューURLの検索除外無料3分なし
8ファイアウォールの個別ルール無料30分設定次第で検索エンジンを締め出します

上から順に片付ければよいです。6番のHSTSだけは、理解してから触ってください。

1. 常時HTTPS

最優先です。http:// で来た通信を、自動的に https:// へ転送する設定です。

通信が暗号化されていないと、公衆無線LANなどの経路上で内容を読まれたり、書き換えられたりする可能性があります。読むだけのサイトでも、書き換えられて別の内容を表示されるのが問題です。

手順

  1. 「アカウント ホーム」→ ドメイン名をクリック
  2. 左メニュー「SSL/TLS」→「概要」をクリック
  3. 暗号化モードが「オフ」になっていないことを確認
  4. 左メニュー「SSL/TLS」→「エッジ証明書」をクリック
  5. 「Always Use HTTPS」をオンに切り替え

暗号化モードが「オフ」のままだと、4番の項目自体が画面に出てきません。見つからない場合は3番を先に確認してください。

注意

サイト内の画像やスクリプトを http:// で読み込んでいる場合、この設定だけでは解決しません。ブラウザは読み込む前に判定するためです。該当する場合は、記述側を https:// か相対パスに直します。

2. メールのなりすまし防止

見落とされやすいですが、優先度は高いです。

何が起きるか

ドメインを取得すると、そのドメインを差出人に偽装したメールを、誰でも送れる状態になります。「@自分のドメイン」から送られた請求書や依頼のメールが、取引先に届く可能性があります。

防ぐ仕組みは3つです。

仕組み役割
SPFどのサーバーからの送信を認めるかを宣言
DKIM送信時に電子署名を付け、改ざんを検知
DMARC上記2つに合格しなかったメールの扱いを指示

分岐:メールを受け取るか

ここで対応が2つに分かれます。先に決めます。

状況やること
そのドメインでメールを受け取りません送信を全面的に禁止する設定
問い合わせ用のアドレスを使いたいです転送の仕組みを設定したうえで、送信元を宣言

受け取らない場合

  1. ドメインの画面で、左メニュー「DNS」→「設定」をクリック
  2. 「メールのなりすまし防止」の項目からウィザードを開始
  3. 「このドメインからメールを送信しない」に相当する選択肢を選びます
  4. 提案されたレコードを確認して適用

追加されるのは次の内容です。手で入れる場合の値は次のとおりです。

種類名前内容意味
TXT@v=spf1 -allどのサーバーからの送信も認めません
TXT_dmarcv=DMARC1; p=reject;合格しないメールは受信側で拒否

p=none で止めません。参考記事でよく見かける値ですが、これは「様子を見るだけで何もしない」という意味です。なりすましは防げません。送らないドメインであれば、最初から p=reject でよいです。

受け取りたい場合

Cloudflare には無料の転送機能があります。独自ドメイン宛のメールを、普段使っているアドレスへ転送する仕組みです。

  1. ドメインの画面で、左メニュー「メール」→「メールルーティング」をクリック
  2. 画面の指示に従い、転送先のアドレスを登録
  3. 転送先アドレス側に届く確認メールのリンクを開きます
  4. 必要なDNSレコードの追加を承認

MXレコードは自動で追加されます。手で書く必要はありません。

この場合、DMARCは段階的に上げます。

段階値期間の目安
1v=DMARC1; p=none;2週間
2v=DMARC1; p=quarantine;2週間
3v=DMARC1; p=reject;以降

いきなり3段階目にすると、正規のメールまで拒否される場合があります。送信に使っているサービスをすべて把握してから上げます。

3. www の名前解決

example.com は開けるが www.example.com は開けない、という状態になりやすいです。Cloudflare の管理画面に警告として表示されます。

放置してよいものではありません。名刺やメールに www 付きで書かれた場合、到達しません。

対応は2択

方法挙動向いている場合
A. wwwもPagesに接続どちらのURLでも同じ内容を表示手間をかけたくありません
B. wwwをルートへ転送www は自動的に www なしへ移動推奨

Bを推す理由です。同じ内容が2つのURLで見られる状態は、検索エンジンから見て重複にあたります。どちらを正としてよいか判断させる手間が増えます。

Bの手順

  1. Pagesプロジェクトの画面で「Custom domains」タブをクリック
  2. 「Set up a custom domain」から www.(自分のドメイン) を追加
  3. DNSレコードが自動生成されることを確認
  4. ドメインの画面へ戻り、左メニュー「ルール」→「リダイレクト ルール」をクリック
  5. テンプレートから「www をルートへリダイレクト」に相当するものを選択
  6. 内容を確認して保存

転送の種類は 301(恒久的) を選びます。302(一時的)だと、検索エンジンが正規のURLを切り替えてくれません。

4. ボット対策

自動化されたアクセスに、計算負荷の高い処理を課す機能です。攻撃側の採算を悪化させます。

手順

  1. ドメインの画面で、左メニュー「セキュリティ」→「設定」をクリック
  2. 絞り込みで「ボットトラフィック」を選択
  3. 「ボット ファイト モード」をオンに切り替え

検索エンジンなど、Cloudflare が正規と認めているクローラは通過します。有効化してもSEOへの影響はありません。

注意点

内容影響
個別ルールで除外できません自分の監視ツールやAPIも止まる可能性あり
JavaScript検出が自動で有効化通常のサイトでは影響なし

自作のスクリプトから定期的にサイトを叩いている場合は、先に確認してください。

5. セキュリティヘッダー

ブラウザに対して「この範囲を超えた動作はさせない」と指示する仕組みです。Pages では _headers という名前のファイルを置くだけで設定できます。

置く場所

拡張子なしのテキストファイルです。public フォルダの直下に置きます。

public/_headers

書き方

1行目に対象のURLパターン、2行目以降に字下げしてヘッダー名と値を書きます。

/*
  X-Frame-Options: DENY
  X-Content-Type-Options: nosniff
  Referrer-Policy: strict-origin-when-cross-origin
  Permissions-Policy: camera=(), microphone=(), geolocation=()

各行の意味は次のとおりです。

ヘッダー何を防ぐか
X-Frame-Options: DENY他サイトの枠内に自分のサイトを埋め込ませません。偽サイトへの悪用を防ぎます
X-Content-Type-Options: nosniffファイルの種類をブラウザに推測させません
Referrer-Policy他サイトへ移動する際、どのページから来たかを渡す範囲を制限
Permissions-Policyカメラ、マイク、位置情報の使用を一律で禁止

4行とも、静的サイトであれば副作用なく入れられます。

上級者向け:CSP

Content-Security-Policy は最も強力ですが、最も壊れやすいです。読み込むスクリプトの許可先を1つずつ列挙する形になるため、タグマネージャーや外部の計測ツールを使っている場合、設定を誤ると計測が止まります。

入れる場合は、まず監視だけを行う Content-Security-Policy-Report-Only から始めます。いきなり本番へ適用しません。

制限事項

内容上限
ルール数100件まで
1行の文字数2,000文字まで

もう1点あります。サーバー側で処理を行う機能(Pages Functions)の応答には、このファイルの指定が適用されません。静的なファイルのみが対象です。

6. HSTS

ここから注意が必要です。

「このサイトには今後必ずHTTPSで接続すること」をブラウザに記憶させる仕組みです。一度記憶させると、指定した期間が過ぎるまで取り消せません。

何が危険か

HTTPSをやめた場合、または証明書に問題が起きた場合、記憶している期間中は訪問者がサイトに一切アクセスできなくなります。「あとで戻す」ができない設定です。

手順

  1. 左メニュー「SSL/TLS」→「エッジ証明書」をクリック
  2. 「HSTSを有効にする」をクリック
  3. 警告文を読み、「理解しました」を選択
  4. 「次へ」をクリック
  5. 設定項目を入力
項目推奨理由
Enable HSTSオン
Max Age Headerまず1か月問題があっても1か月で解除されます
Apply HSTS policy to subdomainsオフサブドメインがHTTPS未対応だと到達不能になります
Preloadオフ後述
No-Sniff Headerオン害がありません
  1. 「保存」をクリック

Preload を有効にしない理由

ブラウザに最初から組み込まれるリストへ登録する機能です。一度載ると、解除の申請から実際に反映されるまで数か月かかります。個人サイトで得られる効果に対して、取り返しのつかなさが釣り合いません。

進め方

1か月で設定 → 1か月運用して問題なし → 6か月へ延長 → 問題なし → 12か月

急いで長くしません。

補足:最小TLSバージョン

同じ画面に「最小TLSバージョン」という項目があります。ただし Pages のホスト名に対しては設定できない仕様です。ここは触らなくてよいです。

7. プレビューURLを検索結果に出さない

Pages は、本番用ブランチ以外への反映時にプレビュー用のURLを自動生成します。既定では誰でも閲覧可能で、検索結果にも出る可能性があります。

公開前の内容が検索に載ると面倒です。_headers に1行加えて防ぎます。

https://:project.pages.dev/*
  X-Robots-Tag: noindex

:project の部分はそのまま書いてよいです。Cloudflare 側で置き換えられます。

閲覧そのものを制限したい場合は、Pagesプロジェクトの「設定」→「プレビュー アクセス」から制限をかけられます。ただしアクセス管理の初期設定が必要になるため、個人サイトでは検索除外までで十分です。

8. ファイアウォールの個別ルール

ここまでで大半は足ります。特定の攻撃が継続している場合のみ追加します。

先に現状を見る

  1. 左メニュー「セキュリティ」→「分析」をクリック
  2. 期間を「過去24時間」に設定
  3. アクセスされているパス、国、User Agent を確認
見えたもの対応
/wp-login.php /.env などへのアクセス該当パスを遮断
同一IPから短時間に大量レート制限
通常の閲覧のみ何もしません

攻撃が来ていないのにルールを足さないでください。誤って正規の訪問者を締め出すほうが損失は大きいです。

遮断ルールの例

  1. 「セキュリティ」→「セキュリティ ルール」→「ルールを作成」→「カスタム ルール」
  2. 条件を設定
項目値
フィールドURI パス
演算子次を含みます
値/wp-
アクションブロック

存在しないパスのため、遮断しても正規の訪問者に影響はありません。

やってはいけない設定

設定何が起きるか
日本以外を一律ブロック検索エンジンの巡回サーバーは国外。検索結果から消えます
セキュリティレベルを最高に固定一般の訪問者にも確認画面が頻発

国で絞る場合は、必ず「検証済みボットを除外する」条件を併せて設定します。

設定後の確認

確認するもの方法
HTTPSへの転送ブラウザで http:// から始まるURLを入力し、https:// に変わることを確認
wwwwww. 付きで開き、www. なしへ移動することを確認
セキュリティヘッダー外部のヘッダー診断サービスにURLを入力
メール設定外部のDMARC診断サービスにドメインを入力
誤遮断の有無「セキュリティ」→「イベント」で直近の遮断内容を確認
検索への影響Search Console の「クロールの統計情報」を1週間後に確認

最後の2つが重要です。設定した直後ではなく、1週間後に見てください。影響は遅れて出ます。

失敗例

失敗何が起きるか代わりにやること
HSTSを12か月で設定問題が起きても1年間戻せません1か月から始めます
HSTSのPreloadを有効化解除に数か月かかります個人サイトでは使いません
DMARCを p=none のまま放置なりすましを検知するだけで防げません送らないドメインは p=reject
メールを使う予定なのに送信を全面禁止自分が出したメールが届きません先に受け取るかどうかを決めます
CSPをいきなり本番へ適用計測タグやスクリプトが止まります監視専用の設定から始めます
国で一律ブロック検索エンジンを遮断し、検索結果から消えます検証済みボットを除外条件に入れます
攻撃がないのにルールを量産誤遮断だけが増えますまず分析画面で現状を見ます
_headers を字下げせずに書きます設定が読み込まれません2行目以降は必ず字下げ

まとめ

  • セキュリティ設定の大半は Pages ではなくドメイン側の画面にあります
  • 最優先は常時HTTPSです。1クリックで終わり、副作用もありません
  • メールのなりすまし防止は見落としやすいです。送らないドメインでも設定が要ります
  • DMARCは p=none で止めません。送らないなら p=reject まで進めます
  • www は転送で統一します。転送は301を選びます
  • ボット対策は無料で効果が大きいです。検索エンジンへの影響なし
  • セキュリティヘッダーは public/_headers に4行書くだけです。CSPだけは慎重に
  • HSTSは取り消せない設定です。1か月から始め、段階的に延ばします
  • ファイアウォールの個別ルールは、実際に攻撃が来てから追加します

最初にやることは、常時HTTPSをオンにすることです。1分で終わり、他のどの設定よりも効果が大きいです。

Share:

参考になったら、いいねを押してください。

コメント

    お名前とコメントは、確認後にこのページで公開されます。メールアドレスや電話番号などは書かないでください。

    Back to Blog

    Related Posts

    View All Posts »
    LPの制作を外注するときの指示書の書き方

    LPの制作を外注するときの指示書の書き方

    「いい感じに作ってください」では出てきません。目的・読者・必須項目・NG・計測要件を書いて渡します。1枚に何を書けば、出てきたものをその場で判断できるかを整理します。