SYNON 記事 Cloudflare・インフラ

社内システムのクラウド化と
セキュリティ確保

Cloudflare 構築手順書 + 運用計画書

フェーズ1(追加費用 ¥0 の8施策)と Zero Trust 接続基盤(WARP + Tunnel)を、画面操作・CLI・設定値レベルまで記載した実務文書

作成日: 2026-08-15 対象: 従業員約50名 / 受託開発 / 大阪1拠点 オリジン: AWS EC2 認証: Google Workspace SSO プラン: Cloudflare Free + Cloudflare One Free

0エグゼクティブサマリ

「社内システムを AWS EC2 に置いたまま、VPNアプライアンスも専用線も買わずにどうやってセキュリティを保つか」——その設計と、手を動かす手順と、動かし続けるための運用を1冊にまとめた文書です。

答えの骨格は多層防御(Defense in Depth)です。1つの製品で守るのではなく、境界の違う4つの層をそれぞれ塞ぎます。

Cloudflare グローバル網 ① WAF / DDoS / CDN / SSL Free Managed Ruleset / Custom Rules ×5 Full(strict) + Origin CA + AOP Smart Tiered Cache ② DMARC Management 集約レポート(RUA)の収集・解析 SPF / DKIM / MTA-STS と併用 ③ Gateway (DNSフィルタ) Security Categories = All security risks C2 / Malware / Phishing / DGA を遮断 ④ Zero Trust (WARP + Tunnel) Network ポリシー: dst 10.0.1.0/24 + @synon.co.jp のみ Allow Tunnel 終端(EC2からの常時接続) ④+DEX 合成テストで到達性を常時監視 外部の訪問者・攻撃者 コーポレートサイトへ 取引先のメールサーバ なりすまし被害の当事者 社員端末 50台 Cloudflare One Client (旧 WARP client) Split Tunnel: 10.0.1.0/24 のみ Google Workspace SSO + 端末登録 コーポレートサイト オリジンは Cloudflare IP のみ許可 Origin CA + mTLS(AOP) Google Workspace MX は変更しない(共存) AWS VPC 10.0.0.0/16 cloudflared × 2 (別AZ) アウトバウンド 7844 のみ 社内Webシステム 10.0.1.10:443 / インバウンド全閉 常時接続
図1: 4層の多層防御アーキテクチャ全体像。①〜④はフェーズ1の施策番号に対応

結論を先に:この構成が成立する条件と、成立しない条件

成立する(¥0で十分な保護が得られる) 社員数が50名以下で、退職者のシート回収を運用に組み込める/ログの保存要件が「24時間を超えるものは自前でAPI退避する」で許容できる/「Cloudflare 自体が落ちたら社内システムに入れない」というリスクを break-glass 経路の事前整備で受け入れられる/顧客との契約で稼働率を Cloudflare に依存する形でコミットしていない。
成立しない状況必要な投資目安コスト
51人目が入社する / 業務委託が増えるCloudflare One Standard約 $7/user/月(50名で約$350/月)
誰がいつどこにアクセスしたかの完全な生ログを長期保存する必要がある同上(保持30日)同上
Slack にアラートを直接飛ばしたい(Webhook を使いたい)ゾーンを1つだけ Pro 化約 $20/月
顧客に稼働率をコミットしているBusiness プラン(100% Uptime SLA)約 $200+/月
最も費用対効果が高い有償化は「1ゾーンだけ Pro(約$20/月)」 これだけでアカウント全体の Webhook 通知が解禁され、Slack 連携・WAF 強化がまとめて手に入ります。

着手前に必ず読む:本調査で判明した「前提のズレ」

(A) synon.co.jp の現状(公開DNSの実測結果・2026-08-15時点)

synon.co.jp メール認証の現状診断 × NS ns1〜ns5.xserver.jp Cloudflare DNS ではない → ② DMARC Management が使えない(①が必須の前提) MX ASPMX.L.GOOGLE.COM ほか計5件 Google Workspace で確定。MX は今後も変更しない ! SPF v=spf1 +a:svXXXXX.xserver.jp +a:synon.co.jp +mx include:spf.sender.xserver.jp +mx include:...hubspotemail.net ~all include:_spf.google.com が無い → Workspace からの送信が SPF を通っていない可能性が高い DNSルックアップ 8/10 で余裕なし。+mx が2回重複 × DKIM google._domainkey → レコードなし 未設定。転送メール・MLで DMARC を通すには DKIM が必須 ! DMARC v=DMARC1; p=none; rua= が無く、レポートが一切集まっていない=誰が騙っているか見えていない DNSSEC / MTA-STS / TLS-RPT いずれも未設定(DS なし=移管時の事故リスクは無い)
図2: 実測した現状。①DNS移管は「実施済み」ではなく「これから」で、②はそれに完全に依存する
最優先アクション — DNS移管の意思決定を待たずに、今日から着手できる作業が2つあります (1) Google Workspace の DKIM 有効化、(2) SPF に include:_spf.google.com を追加。この2つは現在の Xserver DNS のままで実施でき、この案件で最も費用対効果が高い作業です。Gmail は2025年11月から非準拠トラフィックへの強制を段階的に強化しており、放置は「送ったメールが届かない」に直結します。

(B) 2026年の改称とダッシュボード再編

既存の日本語ブログ記事・技術記事の手順は、ダッシュボードのパスがほぼ通用しません。

旧称(〜2025)現行(2026年8月)
Zero Trust(製品総称)Cloudflare One
WARP clientCloudflare One Client(CLI は warp-cli のまま)
Gateway with WARP(サービスモード)Traffic and DNS mode
DNS only(サービスモード)DNS-only mode(MDMの値は 1dot1
Gateway > PoliciesTraffic policies > Firewall policies(DNS / HTTP / Network タブ)
Settings > Network > DNS LocationsNetworks > Resolvers & Proxies > DNS locations
Settings > WARP ClientTeam & Resources > Devices > Device profiles
Settings > Devices > Device postureReusable components > Posture checks
Access > TunnelsNetworking > Tunnels / Networking > Routes
Settings > AuthenticationIntegrations > Identity providers
Logs / AnalyticsInsights > Logs
MDM 配布時の最重要訂正 DNS専用モードの service_mode の値は dns-only ではなく 1dot1 です。dns-only と書くと黙って既定の warp にフォールバックし、意図と違うモードで50台が動きます。

(C) 2026年に「もう存在しない」設定

項目状況
Security Level(Off〜High の6段階)事実上廃止。新ダッシュボードでは "Always protected" 固定。連動する threat score は常に 0 を返すため、threat score ベースのルールは作ってはいけない
Brotli を Free でオンにするFree の既定圧縮は Zstandard。Brotli は Pro 以上の既定。旧手順は不要
Zone HoldsEnterprise 限定に変更。Free では利用不可
Cloudflare Exposed Credentials Check非推奨(deprecated)

1全体アーキテクチャと脅威モデル

現状(As-Is)と目標(To-Be)

現状 (As-Is) ① 社内システムへは AWS Client VPN 証明書配布と接続トラブルの運用負荷 ② サイトが直公開(WAF / DDoS / CDN なし) 改ざん・DDoS・脆弱性攻撃に無防備 ③ メール認証が未整備 DKIMなし・SPF不完全・DMARC監視なし なりすましが取引先に届き、自社の正規メールも届かない ④ 端末側のフィルタリングなし C2通信・フィッシング到達を止められない ⑤ 到達性の能動監視なし 「繋がらない」の申告が第一報になる 目標 (To-Be) — 追加費用 ¥0 WARP + Tunnel プライベート経路 公開ホスト名不要・EC2インバウンド全閉のまま DNS移管で WAF/DDoS/CDN/SSL を同時有効化 Full(strict) + Origin CA + mTLS(AOP) DKIM/SPF修復 → DMARC Management 12週で p=none → quarantine → reject MTA-STS / TLS-RPT も Workers で ¥0 Gateway DNS フィルタを全50台へ All security risks を Block(MDM配布) DEX 合成テスト + 可用性アラート SLO 98% を下回ったら自動で気づく
図3: 現状の5つの問題と、フェーズ1で到達する目標状態

なぜ「WARP + Tunnel のプライベートネットワーク経路」なのか

方式内容採否
A. Access(公開ホスト名方式)app.synon.co.jp を公開し、Cloudflare Access で認証をかける❌ 不採用
B. WARP + Tunnel(プライベートネットワーク経路)公開ホスト名を作らず、10.0.1.10 に WARP 経由でのみ到達させる採用
Bを選ぶ3つの理由 1. 公開ホスト名を作りたくない — A方式は Access のログイン画面がインターネットに晒されます。B方式は「アプリを入れた端末」からしか到達経路が存在しません。
2. EC2 の「外向きのみ」ポリシーを維持できる — グローバルIPすら不要です。
3. 接続元を端末に限定できる — WARP のデバイス登録が事実上の第1関門になります。
Bの代償(正直に) ブラウザだけでは繋がりません。必ず Cloudflare One Client のインストールが必要です。また端末に到達経路を作る以上、Split Tunnel の設定ミスが即座に全社の接続断につながります(Step 7 で詳述)。

認証方式:Google Workspace SSO を採用する

項目内容
主認証(全社員)Google Workspace SSO(既存の Workspace テナントを IdP として利用)+ @synon.co.jp ドメイン制限 + WARP 端末登録
フォールバック(1名のみ)One-time PIN を IdP としては残すが、Login Methods セレクタで break-glass アカウント1件に限定
「メールアドレス+パスワード」で認証したい実質的に実現。Google Workspace のログイン画面がまさにこれで、かつ Google 側の 2段階認証プロセス(2SV)も同時に効きます

なぜ Google Workspace か

#理由
1グループベースのアクセス制御ができるようになる。これが最大の理由です。OTP 認証では IdP のグループメンバーシップが評価されず、Gateway ポリシーは User Email の正規表現でしか書けませんでした。Google Workspace 連携なら User Group Names セレクタが使え、「internal-app-users グループのメンバーだけが 10.0.1.10:443 に到達できる」という設計が可能になります
2既に全社が使っているものを使う。新たなIdPの契約も、社員が覚える新しいパスワードも不要です
3Google 側の 2SV が実質的にそのまま効く。ユーザーは Google のログイン画面で 2SV を突破しない限り Cloudflare に戻ってこられません
4退職者対応が一元化される。Google Workspace のアカウント停止が起点になります(ただし後述の通り、それだけでは Cloudflare は切れません)
5OTP 固有の事故が消える。メールセキュリティ製品のリンク自動スキャンが PIN を先に消費してしまう「This One-Time PIN has already been used」という国内でも頻発する事故が、構造的に発生しなくなります

重要:Cloudflare には「Google」と「Google Workspace」の2つの統合がある

2026年8月時点でも2つは統合されておらず、別物です 選択を間違えるとグループが一切取得できません。公式ドキュメント(google.mdx)の原文:「Unlike the instructions for Google Workspace, the steps below will not allow you to pull group membership information from a Google Workspace account.」本件では「Google Workspace」一択です。
Google(汎用)Google Workspace ← これを使う
プロトコルOIDC(素の Google OAuth)OIDC + Admin SDK Directory API
グループ取得不可(これが唯一の差別化点)
OAuth 同意画面の AudienceExternalInternal
Admin SDK API の有効化不要必須
Google Admin Console 側の作業不要必須(Trust internal apps + 管理者による認可)
個人 Gmail でのログイン可能(ポリシー次第で誰でも)不可(Internal 設定が遮断)
API の typegooglegoogle-apps

採用しない選択肢と、その理由

選択肢判断理由
Google Workspace を SAML で連携Cloudflare に「Google Workspace を SAML IdP として使う」専用統合は存在しません。Generic SAML + カスタム SAML アプリで実装は可能ですが、グループ属性を手動マッピングする必要があり運用が複雑化します。OIDC 版で十分です
OTP を完全に削除するGoogle 障害時・OAuth設定ミス時の唯一の脱出経路が消えます。IdP としては残し、Login Methods セレクタで break-glass 1名に限定するのが正解です
Google Workspace 自体を Cloudflare Access で保護する公式に「Google Workspace アカウントが Access で保護されている場合、Google Workspace IdP 統合はサポートされない」と明記。認証ループになります。将来もこの構成にしないでください

Google Workspace 採用に伴う3つの制約(必ず理解しておくこと)

#制約影響と対策
1🔴 SCIM プロビジョニングが非対応(Google Workspace は Cloudflare の SCIM 対応 IdP に含まれない)自動デプロビジョニングもシート自動解放もできません。退職時は Cloudflare 側で手動の Revoke + Remove が必須(第2部 第13章)
2🔴 グループの変更は、ユーザーが再認証するまで Cloudflare に反映されない(継続同期なし)「Google グループから外したのでアクセスも切りたい」→ 即座には切れません。Gateway Allow ポリシーに check_session(12〜24時間)を設定し、強制再認証で反映させるのが唯一の実用的な手段です
3IdP ベースの MFA 強制ポリシーが作れないCloudflare の Authentication Method セレクタが対応するのは Okta / Microsoft Entra ID / Generic OIDC / Generic SAML のみで、Google Workspace は対象外です。→ Google Admin Console 側で 2SV を強制してください(Cloudflare 側では要求できないため、Google 側で必ず閉じる)
移行時の最大の落とし穴 デバイス登録は永続で、IdP を切り替えても既存50台は再登録不要・接続も維持されます。ところが再認証していないユーザーの ID は「OTP でログインした状態=グループ情報なし」のままです。この状態でグループベースのポリシーを有効化すると、そのユーザーは社内システムに到達できなくなります。全員の再認証完了を確認してから締めること(Step 7 に手順を組み込み済み)。

フェーズ1で守れるもの/守れないもの

守れないもの(Free の対象外)必要な機能プラン
悪性サイトの中身を安全に見せるBrowser Isolation
SaaS 上のデータの持ち出し検知CASB / DLP(フル機能)
特定の外部宛通信の送信元IP固定Egress ポリシー
メール本文のフィッシング検査Email Security(旧 Area 1)
※無料の Retro Scan は Microsoft 365 専用で Google Workspace では使えない
稟議での注意 上記4つを「Cloudflare にすれば無料でできる」と書いてはいけません。これは Free の対象外です。

第1部 構築手順書

Step 0(事前準備)から Step 8(移行と切り戻し)まで。依存関係のある順序で記載しています。

2実施順序とロードマップ

依存関係があるため、この順序を守ってください。特に ① → ②(DMARC Management は Cloudflare DNS 必須)と ③ → ④(DEX は Cloudflare One Client が動いていないとテストが走らない)は絶対です。

W0 W1 W2 W3 W4 W5 W6 W7 W8+ Step 0 事前準備 棚卸し/権限 Step 2-A ★先行 DKIM有効化 / SPF修正 / TLS-RPT Step 1 ① DNS移管 移管 + WAF/DDoS/SSL Step 6 ⑥⑦⑧ Analytics等 Step 2-B ② DMARC 有効化 12週ランプアップ: none → quarantine → reject Step 7 Zero Trust基盤 cloudflared / Tunnel / Routes Step 3 ③ DNSフィルタ パイロット5台 労使周知・規程改定 説明会+書面 Step 3 全50台展開 MDM配布 (Jamf / Intune) Step 4 ④ DEX 合成テスト Step 5 ⑤ Turnstile 自社+標準化 Step 8 VPN廃止判断 2週ゼロ確認 ①→②依存 ③→④依存
図4: 8週間の実施ロードマップ。赤の破線は絶対に守るべき依存関係
ステップ内容前提工数
W0Step 0事前準備(棚卸し・アカウント・2FA・権限)4h
W0Step 2-ADKIM 有効化・SPF 修正(DNS移管を待たずに先行実施2h
W1–2Step 1① DNS を Cloudflare へ移管(WAF/DDoS/CDN/SSL)Step 08h + 待機48h
W2Step 6⑥⑦⑧ Web Analytics / Tiered Cache / Security CenterStep 11h
W3Step 2-B② DMARC Management 有効化Step 12h(以降12週の運用)
W3–4Step 7Zero Trust 基盤(cloudflared / Tunnel / Routes)Step 08h
W4Step 3③ Gateway DNS フィルタ(パイロット5台)Step 76h
W5労使周知通信ログ取得の説明会・規程改定手続きStep 3
W5–6Step 3③ 全50台へ展開(MDM)周知完了8h
W6Step 4④ DEX 合成テスト・通知Step 3/73h
W7Step 5⑤ Turnstile 自社フォーム適用4h
W8–Step 8Client VPN 廃止判断Step 7

3Step 0 — 事前準備・権限設計

棚卸し(これを飛ばすと必ず事故ります)

棚卸し対象確認すること情報源
DNS レコード全件Xserver の全レコード。特に MX / SPF / DKIM / 各種検証用 TXT / サブドメインXserver 管理画面からゾーンファイルをエクスポート
メール送信元Google Workspace / HubSpot / Xserver / 複合機・スキャナ / 社内バッチ(cron, 監視)/ 各SaaS(見積・請求・チケット)各部門へのヒアリング必須
社員の自宅LAN10.0.1.x を使っている家庭用ルータ・Docker・VMware がないか全社アンケート
オフィスのグローバルIP固定か動的か(Gateway の DNS location の方式決定に直結)ISP 契約
既存VPN・セキュリティ製品端末に入っている VPN、AV、EDR、DLP資産管理台帳
Google Workspace の管理権限特権管理者アカウントが誰か/Admin Console の「API controls」を触れるか/2SV の強制状況Google 管理コンソール
GCP プロジェクト既存プロジェクトを流用するか新規作成するか(Admin SDK は無料枠のため請求先は不要の見込み)GCP Console
Zero Trust チーム名OAuth のリダイレクトURIに埋め込まれるため着手前に確定させる(後から変更すると IdP 設定と全端末の再設定が必要)Zero Trust > Settings
顧客契約の制約「再委託先の事前承諾」「国内保管」条項の有無法務・営業

Cloudflare アカウントの初期設定

アカウント作成cloudflare-admin@synon.co.jp のような共有可能なアドレスで作成します(個人の私用メールで作ると退職時に引き継げません)。
🔴 ただし Cloudflare ダッシュボードへのログインを Google SSO に依存させないでください。社内システムの認証を Google Workspace に寄せる以上、ダッシュボードまで Google 依存にすると Google 障害時に設定変更すらできなくなります。メールアドレス+パスワード+TOTP の管理者を最低2名確保してください(Step 7 の break-glass 設計と対になります)。
自身の2要素認証を有効化My Profile > Authenticationセキュリティキー(WebAuthn / Touch ID / YubiKey)+ TOTP アプリの2つ以上を登録。バックアップコードは印刷して物理金庫に保管(管理部門長が保管、インフラ担当は場所のみ把握)。
メンバー招待Manage Account > Members から必要なメンバーのみを招待。
2FA Enforcement を有効化Super Administrator のみが設定可能。Free でも利用可。有効にすると、招待された新メンバーは招待を受諾する前に2FAの有効化が必須になります。
2FA Enforcement トグルの正確な画面位置は公式ドキュメントに明記がありません。Manage Account > Members 画面上部、または Manage Account > Configurations にあります。実機で確認し、本書に追記してください。

権限設計(50名企業の推奨割当)

Cloudflare ダッシュボードのメンバーは8名以内に抑えます。50名全員を招待する必要はありません(社内システムの「利用者」であることと、ダッシュボードのアカウントは別物です)。

対象人数ロール理由
代表取締役 / 管理部門長1Super Administrator請求・メンバー管理・Super Admin の引き継ぎ。技術者に依存させない
インフラ管理者(主)1Super Administrator日常運用の最終権限。Super Admin は計2名まで(バス係数1を避けつつ増やしすぎない)
インフラ管理者(副)1–2Administrator請求・メンバー管理を除く全操作
開発リーダー2–3Cloudflare Zero Trust Read Only + 担当ドメインの Domain DNS障害切り分けのログ閲覧と、担当ドメインのDNS変更のみ
情シス / 監査担当1Administrator Read Only棚卸し・監査。変更権限は不要
その他従業員44招待しない
「Cloudflare Zero Trust PII」ロールの扱い Gateway のログに含まれるメールアドレス・デバイスID・送信元IPは、既定では Super Administrator しか見られません。この PII 閲覧権限は、人間のロールには原則付与せず、ログ退避用のAPIトークンにのみ付与してください。これが個人情報保護法上の「アクセス権限の最小化」の実装になります。

API トークンの作成ルール

パス:Manage Account > API Tokens > Create Token > Create Custom Token

項目ルール
Global API Key絶対に使わない(アカウント全権・個別失効不可)
スコープZone は当該ゾーンのみ、Account 権限は必要なもののみ
Client IP Address FilteringEC2 の Elastic IP に限定
TTL90日。無期限トークンを作らない
ローテーション四半期ごと(新規発行 → 疎通確認 → 旧トークン削除)
保管AWS Secrets Manager(EC2 の IAM Role で取得)。.env の平文置きは禁止
命名規約用途-環境-作成年月(例:logexport-prod-202608

4Step 1 — ① DNS移管 / WAF / DDoS / SSL

目的synon.co.jp の権威DNSを Xserver から Cloudflare に移し、WAF・DDoS防御・CDN・SSL を一気に有効化する。同時に、②DMARC Management の前提条件を満たす。

移管の48時間前にやること

# 現在のレコードを全件記録(移管後の突合に使う)
dig NS  synon.co.jp +short
dig     synon.co.jp +short
dig MX  synon.co.jp +short
dig TXT synon.co.jp +short
dig www.synon.co.jp +short
dig DS  synon.co.jp +short          # ← 空であることを確認(DNSSEC未使用)
DNSSEC の順序を間違えるとドメインが全断します 「DS削除 → TTL失効を待つ → NS変更 → Cloudflare で DNSSEC 有効化 → 新しい DS を登録」の順序が絶対です。古い DS のTTLが失効する前にNSを変えると、検証リゾルバが SERVFAIL を返します。

ダウンタイムを最小化する移管順序(公式推奨)

「まず全部グレー雲で移管 → 証明書発行を確認 → 後からオレンジ雲」 1 全件グレー雲で登録 有効な edge certificate が 発行される前に プロキシしないため 2 レコード検証 apex / サブドメイン / メールレコードを 1件ずつ目視確認 3 NS変更 レジストラで Cloudflare の2つに変更 反映まで最大24時間 4 Active確認 ゾーンが Active に Universal SSL が Active であること 5 オリジン許可 EC2/Xserver で Cloudflare IP レンジを 許可(443のみ) 6 オレンジ雲へ ここで初めて apex と www をプロキシに 切り替える プロキシ(雲)の判断 — 最大の事故ポイント 必ずグレー雲(DNS only) MX / SPF / DKIM / DMARC の TXT(型として常にDNS-only) mail. / smtp. / imap. / pop. の A レコード vpn. (UDP)/ bastion. (SSH 22番)/ autodiscover プロキシすると SMTP/IMAP/POP が HTTPプロキシに吸われ、メールが全滅 オレンジ雲(Proxied) synon.co.jp(apex)/ www / Webアプリのサブドメイン プロキシ対応ポートはこれだけ: HTTP 80, 8080, 8880, 2052, 2082, 2086, 2095 HTTPS 443, 2053, 2083, 2087, 2096, 8443
図5: 移管の6ステップと、プロキシ状態の判断基準
Universal SSL の範囲に注意 カバーされるのは synon.co.jpwww.synon.co.jp のような第1階層までです。app.dev.synon.co.jp のような第2階層以降はカバーされません。Free での回避策は「深い階層を使わない設計にする」か「該当ホストをグレー雲にする」のいずれかです(Total TLS / ACM は有償)。

SSL/TLS を Full (strict) にする

✕ Flexible — 絶対に使わない 訪問者 🔒 鍵マークが出る Cloudflare オリジン (EC2) HTTPS(暗号化) HTTP(完全な平文) パスワード・セッションCookieが傍受されうる ✓ Full (strict) — これにする 訪問者 🔒 実際に安全 Cloudflare クライアント証明書を提示 オリジン (EC2) Origin CA 証明書を設置 443 は CF の IP のみ許可 HTTPS HTTPS + 証明書検証 + AOP (mTLS) を有効化すれば、実IPが漏れても直接アクセスを遮断できる
図6: Flexible が危険な理由と、Full (strict) + Origin CA + AOP の構成
Automatic SSL/TLS に任せないこと 2025年以降、新規ゾーンの既定は「Automatic SSL/TLS」(Cloudflare がオリジンを検出して自動選択)です。Automatic は「オリジンが対応していれば上げる」方式なので、意図せず Flexible 相当に留まる可能性があります。明示的に Custom SSL/TLS → Full (strict) を選択してください。

Origin CA 証明書の発行と設置

パス:SSL/TLS > Origin Server > Origin Certificates > Create Certificate Free 可

設定項目推奨値
秘密鍵の生成Cloudflare に生成させる(既定)
鍵タイプRSA(互換性重視)または ECC
ホスト名synon.co.jp, *.synon.co.jp(最大200 SAN。IPアドレスは SAN に指定不可
鍵フォーマットPEM(nginx / Apache)。Windows・Tomcat は PKCS#7
server {
    listen 443 ssl;
    http2 on;
    server_name synon.co.jp www.synon.co.jp;

    ssl_certificate     /etc/ssl/cloudflare/origin.pem;   # 発行された Origin Certificate
    ssl_certificate_key /etc/ssl/cloudflare/origin.key;   # 秘密鍵(発行時のみ表示。必ず保存)

    ssl_protocols       TLSv1.2 TLSv1.3;
}
sudo chmod 600 /etc/ssl/cloudflare/origin.key
sudo chown root:root /etc/ssl/cloudflare/origin.key
sudo nginx -t && sudo systemctl reload nginx
Origin CA 証明書はパブリックに信頼されていません Cloudflare のプロキシ経由のトラフィックでのみ有効です。つまり「オリジンがプロキシ済みレコード経由のトラフィックしか受けない」構成が前提です。グレー雲で直接アクセスされるホストには使えません。

Authenticated Origin Pulls(mTLS)

パス:SSL/TLS > Origin Server > Authenticated Origin Pulls > Zone-level を On Free 可

# 段階1:まず optional で検証が動くことを確認
ssl_verify_client optional;
ssl_client_certificate /etc/nginx/certs/cloudflare-origin-pull-ca.pem;

# 段階2:動作確認後に強制へ
ssl_verify_client on;
いきなり on にしないでください ヘルスチェックや監視エージェント(外形監視、Mackerel 等)も遮断されます。必要なら別ポート・別vhostを用意してください。

エッジ証明書の追加オプション(すべて Free 可)

設定推奨値備考
Always Use HTTPSOn全HTTPを301でHTTPSへ
Automatic HTTPS RewritesOnHTML内の http:// 内部リンクを自動書換(mixed content対策)
Minimum TLS VersionTLS 1.2ホスト名単位の設定は ACM(有償)が必要
TLS 1.3On(既定)
HSTS段階導入① Always Use HTTPS で1〜2週様子見 → ② max-age 1ヶ月 / includeSubDomains OFF / Preload OFF → ③ 6ヶ月→12ヶ月 → ④ includeSubDomains と Preload は最後
HSTS 有効化後にやってはいけないこと DNSレコードを Proxied → DNS only に変更する/Cloudflare を Pause する/HTTPS を HTTP にリダイレクトする/SSL証明書を無効化する。いずれもサイトがアクセス不能になります。
また vpn.mail. などHTTPS化していないサブドメインが1つでもあるなら、includeSubDomains を有効にしてはいけませんPreload は事実上取り消せません。

WAF:Free で実際に使えるもの

機能Free での実態
Cloudflare Free Managed Ruleset✅ 既定でデプロイ済み 「影響度が高く広範に悪用されている脆弱性」を緩和(Log4Shell クラスの緊急パッチ枠と理解する)。カスタマイズ不可
Cloudflare Managed Ruleset / OWASP Core Ruleset
Custom Rules5本までLog アクションは Enterprise 限定 → 「まずログで様子見」ができない
Rate Limiting Rules1本のみ期間10秒固定、使えるフィールドは Path と Verified Bot のみ、IPカウントのみ
IP Access Rules50,000本。ただし国単位ブロックは Enterprise 限定
User Agent Blocking10本
Security Level廃止済み("Always protected" 固定)
Custom Rules 5本の推奨配分(Free の枠は5本しかない) 1 管理画面パスをオフィスIP + 日本国内に限定 (starts_with(http.request.uri.path,"/wp-admin") or http.request.uri.path eq "/wp-login.php") and not ip.src in {203.0.113.10} Managed Challenge 2 不要エンドポイントの遮断(WordPress ブルートフォースの温床) http.request.uri.path eq "/xmlrpc.php" Block 3 社内向けパスの日本限定(Free でも ip.geoip.country は使える) starts_with(http.request.uri.path,"/internal/") and ip.geoip.country ne "JP" Block 4 機微ファイルパスの一括遮断 path contains "/.env" or "/.git/" or "/wp-config" or ends_with(".sql") or ends_with(".bak") Block 5 空けておく — インシデント時の緊急ブロック用 単純な UA ブロックは User Agent Blocking(10本)へ逃がして枠を節約
図7: Custom Rules 5本の推奨配分。Free は Log アクションが使えないため、まず Managed Challenge で1週間運用してから Block に昇格する

Rate Limiting(1本しか作れない)

最も価値の高い場所 = ログインエンドポイントに使います。式は http.request.uri.path eq "/wp-login.php"、しきい値は10秒あたり20リクエスト、アクションは Block(Mitigation timeout 10秒)。

Free の Rate Limiting の限界 期間が10秒固定なので、「数分にわたる低速な総当たり」には無力です。ログイン試行の緩和は、アプリケーション側(WordPress なら Limit Login Attempts 等)と併用してください。

Bot Fight Mode:有効にする前に必ず読むこと

3つの重大な制約ドメイン全体に適用され、パス・URL単位の除外が一切できない ② 正規の API / モバイルアプリのトラフィックもチャレンジされうる ③ Ruleset Engine の外で動くため、WAF Custom Rules や Page Rules の Skip で回避できない

判断:コーポレートサイトのみなら On 推奨。ただし /api/ を持つ社内アプリ、CI からの疎通監視、外形監視(UptimeRobot 等)がある場合は誤爆します。API を提供しているなら Off にして Custom Rules で代替するほうが安全です。

DDoS 防御

項目内容
自動で効いているもの全プラン(Free 含む)で L3〜L7 の標準・アンメータードDDoS防御が常時有効。追加費用・帯域上限なし。HTTP DDoS Attack Protection managed ruleset は常に有効で無効化できない
Free で変更できることoverride を1つだけ作成できる(感度とアクションを全体に適用)。複数の override は不可、フィルタ式で対象を絞ることも不可
推奨:override は作らない 既定の感度が最も広く保護します。Security Events で正規ユーザーのブロックが確認された場合に限り、感度を1段階下げる override を1つだけ作ってください。

Step 1 の完了確認

# NS が Cloudflare になっているか
dig NS synon.co.jp +short

# apex がプロキシ済み(Cloudflare の anycast IP)か
dig synon.co.jp +short
curl -sI https://synon.co.jp | grep -i "server\|cf-ray"     # server: cloudflare

# MX と SPF が壊れていないか(移管前後で不変であること)
dig MX  synon.co.jp +short
dig TXT synon.co.jp +short | grep spf1

# HTTP → HTTPS リダイレクト
curl -sI http://synon.co.jp | head -1                        # 301 を期待

# 証明書チェーン
openssl s_client -connect synon.co.jp:443 -servername synon.co.jp </dev/null 2>/dev/null \
  | openssl x509 -noout -issuer -subject -dates

# 最小TLSバージョン(1.1 が拒否されること)
openssl s_client -connect synon.co.jp:443 -tls1_1 </dev/null   # handshake failure を期待

# オリジン直叩きが遮断されているか(AOP 設定後)
curl -kI https://<オリジンIP>/ -H "Host: synon.co.jp"       # 400 / handshake error を期待

# 遮断ルールの動作確認
curl -sI https://synon.co.jp/xmlrpc.php                        # 403 を期待
curl -sI https://synon.co.jp/.env                              # 403 を期待

外部診断:SSL Labsssllabs.com/ssltest/)で A 以上を目標。

5Step 2 — ② DMARC Management

Step 2-A: 今日から実施可能(Xserver DNS のまま) ① Google Workspace の DKIM 有効化 2048bit / セレクタ google → google._domainkey に TXT を公開 ② SPF の修正 include:_spf.google.com を追加(これが無いと SPF が通らない) 重複する +mx と冗長な a: を削除 → 8ルックアップ → 5に ③ TLS-RPT の設定(5分) _smtp._tls TXT v=TLSRPTv1; rua=mailto:tls-reports@synon.co.jp Step 2-B: Step 1(DNS移管)完了後 ④ DMARC Management 有効化 Email > DMARC Management > Enable → rua= が自動追記される ⑤ 12週の段階的ランプアップ p=none → p=quarantine → p=reject 各段階に「次に進む判定基準」を必ず設ける ⑥ MTA-STS(Workers でポリシーをホスト) testing で2週間 → TLS-RPT に failure ゼロを確認 → enforce
図8: ② の依存関係。Step 2-A は DNS移管の意思決定を待たずに着手できる
Cloudflare DMARC Management とは DMARC の集約レポート(RUA)を Cloudflare がホストするメールボックスで受信・解析し、ダッシュボードに可視化する無料機能です。追加されるのは rua= 1つだけで、ゾーンの MX は変更されません。Google Workspace と完全に共存します。
前提条件は「ゾーンが Cloudflare DNS 上にあること」「Apex ドメインであること」の2点のみ。プランは Free で可。

SPF の修正(現行の何が問題か)

RFC 7208 の10ルックアップ制限 — 超えると PermError(SPF全体が無効) 現行(8 / 10 — 余裕なし・かつ Google が入っていない) a:svXXXXX a:synon mx include:spf.sender.xserver.jp (×3) mx 重複 include:hubspot _spf.google.com が無い ← 致命的 → Workspace の送信IPが許可されていない。+mx は Google の「受信用」MXホストを許可しているだけで送信には無価値 推奨(5 / 10 — 安全域を確保) include:_spf.google.com include:spf.sender.xserver.jp include:...hubspotemail.net ~all 残り5ルックアップの余裕 変更点と根拠 include:_spf.google.com を追加 — これが無いと Workspace 送信が SPF を通らない(最重要) mx を2つとも削除 — Google の MX は受信専用でありゼロの価値。かつ重複していた / a: を削除 — Webサーバから直接送信していないなら不要
図9: SPF の DNS ルックアップ数(before / after)。~all は p=reject に到達するまで維持する
絶対にやってはいけないこと SPF レコードを2本以上公開する(RFC で PermError)。「Google用」「HubSpot用」と分けて書くのは誤りで、必ず1本にまとめて include を並べます。

DMARC の段階別レコード(2026年の DMARCbis 対応)

2026年5月に RFC 9989(DMARCbis)が発行され、RFC 7489 を廃止しました pct= は完全に廃止されました。新規に書かないでください。代わりに np=(存在しないサブドメインへのポリシー)と t=(テストモード)が新設されましたが、Gmail / Yahoo / Microsoft の t= 対応状況は未確認のため、t= に依存した設計は避け、ポリシー自体を段階的に上げる方針で進めます。
# フェーズ1:監視
v=DMARC1; p=none; rua=mailto:RUA_ID@dmarc-reports.cloudflare.net; fo=1; ri=86400; adkim=r; aspf=r

# フェーズ2:隔離
v=DMARC1; p=quarantine; sp=quarantine; rua=mailto:RUA_ID@dmarc-reports.cloudflare.net; fo=1; ri=86400; adkim=r; aspf=r

# フェーズ3:拒否
v=DMARC1; p=reject; sp=reject; np=reject; rua=mailto:RUA_ID@dmarc-reports.cloudflare.net; fo=1; ri=86400; adkim=s; aspf=r
タグ推奨値理由
sp=明示指定サブドメインのポリシー。未指定だと p= を継承。p=quarantine 以降は明示すべき
np=reject(フェーズ3)実在しないサブドメインの詐称を遮断。実在する送信元に影響しないためリスクが低く効果が高い
adkim=rsDKIM のアライメント。HubSpot 等がサブドメイン署名を使う場合、s にすると落ちる
aspf=r を維持SaaS はエンベロープFromにサブドメインを使うことが多く、s は壊れやすい
pct=書かないRFC 9989 で廃止

12週間のランプアップ計画

W1–2 可視化 p=none ・DMARC Management 有効化 ・TLS-RPT 設定 ・Postmaster Tools 登録 ・2週間分のデータを溜める W3–4 認証の修復 p=none のまま ・DKIM 有効化 / SPF 修正 ・HubSpot の DKIM 有効化 ・複合機/バッチを SMTP  リレー経由へ W5–8 隔離 p=quarantine ・sp=quarantine も明示 ・MTA-STS を testing で ・社内からの「届かない」  報告を密に監視 W9–12 拒否 p=reject ・np=reject も追加 ・安定後 SPF を -all へ ・MTA-STS を enforce へ ・adkim=s を検討 各段階の「次に進む判定基準」— これを飛ばすと必ず事故る W4 → W5(quarantine へ) DMARC pass 率 95%以上 かつ 残りの fail がすべて「なりすまし」と特定できている 正体不明の正規らしき送信元が1つでも残っていたら進まない W8 → W9(reject へ) pass率 98%以上が2週間連続 / 配送トラブル報告ゼロ / 迷惑メール率 0.3%未満 さらに1週間の切り戻し猶予を見る 切り戻しの準備 ポリシー変更の前に _dmarcTTL を300秒に下げておく。問題があれば即座に前段階に戻せる
図10: DMARC の12週ランプアップと、各段階のゲート条件

集約レポートの読み方

最重要ポイント:auth_resultspolicy_evaluated を区別する auth_results = SPF/DKIM の認証そのものの結果。policy_evaluated = アライメント(Fromドメインとの一致)を加味したDMARC 判定。
auth_results/spf/result = pass なのに policy_evaluated/spf = fail極めて頻出します。「SPF認証は通ったが、認証されたドメイン(bounce.hubspot.com)が From(synon.co.jp)と揃っていない」=アライメント失敗で、SaaS経由送信の典型パターンです。
「正規なのに落ちる」パターンなぜ落ちるか対処
転送メール(個人の自動転送)転送サーバのIPが SPF にないため SPF は構造的に必ず fail。DKIM は本文が改変されなければ passDKIM を必ず有効化する。これが DKIM 必須の最大の理由
メーリングリスト件名に [ML名] 付加・フッタ追加で DKIM署名が壊れるML側で From Rewriting を設定
SaaS の From に自社ドメイン(HubSpot, kintone, freee, Zendesk)エンベロープFromがSaaSのバウンスドメイン → aspf失敗SaaS 側で DKIM 署名を有効化し、指定された CNAME/TXT を自社DNSに公開
複合機・スキャナSMTP直送 or ISPリレー経由。IPがSPFになく DKIM もないWorkspace の SMTP リレー経由に変更(推奨)② 別サブドメインに分離 ③ 固定IPなら ip4: を追加
チケット/問い合わせシステム顧客のメールを自社ドメインFromで再送信自社サブドメインに寄せて専用 SPF/DKIM。または From を書き換え Reply-To で顧客を指す
社内バッチ(cron, Zabbix)サーバから直接 sendmailWorkspace SMTP リレー / SES 等の正規経路に集約
実務の原則 count の大きい順に上から潰す。通数1〜2件の謎IPを追うより、数百件のSaaSを直すほうがランプが進みます。

MTA-STS(Cloudflare Workers で無料ホスト)

MTA-STS が守るのは synon.co.jp が受信するメール(外部 → Google Workspace の経路)です。自社が送るメールの保護ではありません。

// mta-sts policy server for synon.co.jp
const POLICIES = {
  "mta-sts.synon.co.jp": `version: STSv1
mode: testing
mx: aspmx.l.google.com
mx: alt1.aspmx.l.google.com
mx: alt2.aspmx.l.google.com
mx: alt3.aspmx.l.google.com
mx: alt4.aspmx.l.google.com
max_age: 86400
`,
};

export default {
  async fetch(request) {
    const url = new URL(request.url);
    if (url.pathname !== "/.well-known/mta-sts.txt") {
      return new Response("Not Found\n", { status: 404 });
    }
    const policy = POLICIES[url.hostname];
    if (!policy) return new Response("Not Found\n", { status: 404 });

    return new Response(policy, {
      status: 200,
      headers: {
        "Content-Type": "text/plain; charset=utf-8",   // RFC 8461 で必須
        "Cache-Control": "public, max-age=3600",
      },
    });
  },
};
Worker を作成Workers & Pages > Create > Create Worker → 名前 mta-sts → Deploy → Edit code で上記を貼り付けて Deploy
カスタムドメインを設定Worker の Settings > Domains & Routes > Add > Custom domainmta-sts.synon.co.jp を追加(Cloudflare が DNS レコードと TLS 証明書を自動発行)
TXT レコードを追加_mta-sts TXT に v=STSv1; id=20260815T120000;
ワイルドカードの落とし穴 RFC 8461 のワイルドカードは最左1ラベルのみを置換します。*.google.comaspmx.l.google.comマッチしません5つすべてを明示列挙するのが唯一安全です。
また id はポリシーを変更するたびに必ず変更してください(変えないと受信側がキャッシュを更新しません)。

やらないこと(判断の記録)

施策判断理由
BIMI❌ 見送りVMC は $780〜1,350/年+商標登録コスト(数万〜十数万円+弁理士費用、登録まで半年〜1年)。価値は B2C の大量配信でのブランド認知であり、50名規模の B2B では投資対効果が成立しない。そもそも現状は DKIM すらなく前提条件を1つも満たしていない
Cloudflare Email Routing❌ apex では絶対に有効化しない公式に「Email Routing 稼働中は同じドメインで他のメールサービスを稼働させられない」と明記。有効化すると Google Workspace の MX が削除され、全社のメールが停止します
Email Security(旧 Area 1)❌ 見送り有償。無料の Retro Scan は Microsoft 365 専用で Google Workspace では使えない
DNSSEC△ 後日タスク.co.jp(JPRS)での DS 登録手順は Cloudflare のドキュメント範囲外。指定事業者に DS 登録の可否を個別確認してから実施。優先度は MTA-STS / TLS-RPT より後

2026年の送信者要件

「5,000通」のカウントに注意 — 50名企業でも他人事ではありません 24時間以内・個人Gmailアカウント宛・同一プライマリドメインからの合計です。サブドメインも合算されます。そして —— バルク送信者ステータスに有効期限はありません。一度でも5,000通を超えると恒久的にバルク送信者として分類されます。

synon.co.jp は SPF に HubSpot が入っており、マーケティングメール配信基盤があります。メルマガで Gmail アドレス5,000件を1日で叩けば、その瞬間から永久にバルク送信者です。最初からバルク送信者要件(SPF+DKIM+DMARC+ワンクリック解除)を満たす設計にしてください。

Step 2 の完了確認スクリプト

#!/bin/bash
D=synon.co.jp
echo "=== NS (Cloudflare移管の確認) ==="   ; dig +short NS $D
echo "=== MX (Google Workspace) ==="       ; dig +short MX $D
echo "=== SPF (1本だけであること) ==="      ; dig +short TXT $D | grep spf1
echo "=== DKIM ==="                        ; dig +short TXT google._domainkey.$D
echo "=== DMARC ==="                       ; dig +short TXT _dmarc.$D
echo "=== MTA-STS ==="                     ; dig +short TXT _mta-sts.$D
curl -sS https://mta-sts.$D/.well-known/mta-sts.txt
echo "=== TLS-RPT ==="                     ; dig +short TXT _smtp._tls.$D
echo "=== DNSSEC ==="                      ; dig +short DS $D
最も確実な確認方法 外部の Gmail アカウント宛にテスト送信し、「メッセージのソースを表示」で spf=pass / dkim=pass header.i=@synon.co.jp / dmarc=pass3つすべてが pass であることを確認します。

6Step 3 — ③ Gateway DNS フィルタ

目的:社員端末50台の DNS クエリを Cloudflare Gateway に流し、マルウェアのC2通信・フィッシング・DGA ドメインへの到達を 名前解決の段階で 遮断する。

方式選定:2つの経路と、なぜ両方使うのか

(a) DNS location — 補助 複合機 / NAS 会議室端末 / 来客WiFi オフィスルータ DNS参照先を変更 DoH エンドポイント *.cloudflare-gateway.com ✕ 在宅・出張時は効かない ✕ ユーザー識別できない(拠点単位) ✓ クライアントを入れられない機器を拾える ✓ DoH なら固定IP不要 (b) Cloudflare One Client — 主軸 社員ラップトップ オフィス / 自宅 / 出張先 One Client service_mode: 1dot1 アカウント別 DoH <ACCOUNT_ID>.cloudflare-... ✓ どこにいても保護される(唯一の方法) ✓ ユーザー/デバイス単位で識別・ポリシー化 ✕ 50台への配布が必要(MDM推奨) Gateway DNS ポリシー — first-match(上から順に評価、最初にマッチで確定) #1 Allowlist Domain in list 「Allowed domains」 → Allow #2 Security Categories in「All security risks」 C2/Malware/Phishing/DGA... → Block(最優先で入れる) #3 Content Categories Adult / Gambling 等 最初は Allow で監視6週 → Allow → Block へ #4 SafeSearch Search Engines #5 個別 Blocklist Domain in「Blocked domains」
図11: 2つの配信経路(両方使う)と、DNSポリシーの優先順位。例外の Allow は必ず Block より上に置く
固定IP要件の落とし穴 共有 anycast IPv4 リゾルバを平文で使う場合、送信元グローバルIPの登録が必須です。大阪オフィスが動的IPなら、平文IPv4は諦めて DoH を使ってください。専用IPv4は Enterprise 限定です。

サービスモードの決定:1dot1warp

これがこの構成における最大の設計判断 段階1: 1dot1(DNS only)— 4〜6週 ✓ DNSフィルタリング ✓ 証明書インストール不要 ✓ 既存VPNとの衝突リスクが低い(ルーティングに触らない) ✓ 社員のプライバシー懸念が小さい ✕ 社内プライベートIP(10.0.1.10)へ到達できない ✕ DEX traceroute 不可 段階2: warp(Traffic and DNS) ✓ DNSフィルタリング ✓ 社内プライベートIP へ到達できる(本構成に必須) ✓ DEX の private IP テストが可能になる ✓ HTTPポリシー / DLP / AVスキャンが使える(有償機能含む) ✕ 証明書配布が実質必須 ✕ 既存VPN・在宅回線との衝突リスク 中〜高 ⚠ 重要な設計上の衝突 「DNS専用フィルタリング」と「④DEX で社内システムを traceroute 監視」と「社内システムへの WARP 経由アクセス」は 1dot1 では両立しません 段階1で運用を安定させてから段階2に進むことで、トラブルシュートの切り分けが劇的に楽になります。
図12: サービスモードの段階導入。dns-only ではなく 1dot1 が正しい値

Security Categories(即 Block してよい)

個別に選ばず、Security Categories in All security risks の1本で全部入ります。含まれるのは Command and Control & Botnet / Malware / Phishing / Spyware / DGA Domains / DNS Tunneling / Cryptomining / Compromised Domain / Brand Embedding / Scam など。

Block してはいけないもの Private IP Address カテゴリは Block しないでください(社内システムへの到達が壊れます)。また、コンテンツカテゴリ側の Security Risks は Security Categories とは別物で、公式に「信頼済みドメインの巻き添えを避けるため Block しないこと」と明記されています。

Content Categories(社内で揉めやすいもの)

対象判断勘所
アダルト(Adult Themes)✅ Blockほぼ無条件で可。ここから始める
ギャンブル(Gambling)✅ Block競馬・パチンコ情報も含むため一部反発の可能性
SNS(Internet Communication 配下)⚠️ 慎重に最も揉める。広報・採用・マーケが業務利用。全社Blockは非推奨
ストリーミング(Entertainment 配下)⚠️ 慎重にYouTube は業務利用が多い。帯域理由でのBlockは在宅勤務では無意味
求人サイト(Job Search & Careers)Blockしない転職活動の監視と受け取られ労務リスクに直結
モニターファースト展開(公式推奨) Gateway に「Monitor」アクションはありません。同じ条件のポリシーを Allow アクションで作り、ログにマッチ件数を溜めて誤検知を洗い出してから、アクションを Block に切り替えるのが公式手順です。

ブロックページと証明書

パス:Zero Trust > Settings > Custom Pages > Account Gateway block page > Customize

Mailto リンクに情シス窓口を入れる it-support@synon.co.jp を設定してください。これが異議申立・解除申請の導線になり、「勝手にブロックされた」という不満を「申請すれば通る」に変えます。
用途証明書
DNSフィルタリングそのもの不要
DNSブロック時に REFUSED を返すだけ不要
DNSブロック時にカスタムブロックページを表示必要
HTTPポリシー / TLSインスペクション / DLP / AV必要
2つの重要な注意DNS ポリシーは、ポリシーごとに個別にブロックページ表示を ON にする必要があります(HTTPポリシーと違う)
② 段階1(1dot1 / 証明書なし)では、ブロックページも無効にして REFUSED 運用にするのが一貫します。「証明書は入れないがブロックページは出したい」は不可です。
③ 既定の Cloudflare 証明書は 2025-02-02 に失効しています。既存アカウントを流用する場合は有効期限を必ず確認してください。

50台へのロールアウト

MDM パラメータ(正確な値)

パラメータ推奨値説明
organizationsynonZero Trust チーム名
service_mode段階1: 1dot1 → 段階2: warp⚠️ dns-only という値は存在しません
switch_locked段階1: false → 定着後 trueユーザーによるOFF禁止
auto_connect11分後に自動再接続
onboardingfalse管理配布ではオンボーディング画面を出さない
support_urlmailto:it-support@synon.co.jp問い合わせ導線
<dict>
  <key>organization</key>      <string>synon</string>
  <key>service_mode</key>      <string>1dot1</string>
  <key>onboarding</key>        <false/>
  <key>auto_connect</key>      <integer>1</integer>
  <key>switch_locked</key>     <false/>
  <key>display_name</key>      <string>シノン株式会社</string>
  <key>support_url</key>       <string>mailto:it-support@synon.co.jp</string>
</dict>
OS設定ファイルの配置場所
WindowsC:\ProgramData\Cloudflare\mdm.xml
macOS(MDM管理下)/Library/Managed Preferences/com.cloudflare.warp.plist
macOS(非管理)/Library/Application Support/Cloudflare/mdm.xml
ポリシーファイルは最小限にしてください MDM のポリシーファイルはダッシュボード設定を上書きします。公式も「ポリシーファイルには組織名と onboarding フラグ程度に留める」ことを推奨しています。残りをダッシュボードのデバイスプロファイルで管理すれば、運用変更のたびに50台へ再配布せずに済みます。
# Windows(Intune)サイレントインストール
msiexec /i "Cloudflare_WARP_2026.6.905.0.msi" /qn ORGANIZATION="synon" SUPPORT_URL="mailto:it-support@synon.co.jp"
macOS 配布の2つの落とし穴Intune で macOS に配布する場合、line-of-business (LOB) 方式を使ってはいけません(公式に明記)。.pkg 用の配布方式を使ってください。Windows の MSI は LOB でOK。
System Extension / PPPC の承認ペイロードが必要ですが、bundle identifier / team identifier は公式ドキュメントに記載がありません。先に1台で手動インストールし、出現するダイアログとインストール結果から採取してください。これを配らないと50台それぞれでユーザーがクリックする必要があり、失敗率が上がります。

デバイスプロファイル(ダッシュボード側)

パス:Zero Trust > Team & Resources > Devices > Cloudflare One Client > Configure(反映に最大10分)

設定既定推奨
Captive portal detection無効必ず有効化
Auto connect01〜5 分
Lock device client switch無効段階的に有効化
Service modeTraffic and DNS段階1は DNS only mode
Allow device to leave organization無効無効のまま
Device tunnel protocolMASQUEMASQUE のまま

動作確認

# 状態確認
warp-cli status                      # → Ok(Connected)
warp-cli -l status                   # 接続過程の詳細ログ
warp-cli settings                    # モード・プロファイルの確認
warp-diag                            # ログ・設定を一括収集

# DNSフィルタリングの実動作確認(公式手順)
dig malware.testcategory.com         # macOS/Linux
nslookup malware.testcategory.com    # Windows
状態期待される応答
ブロックページ無効status に REFUSED
ブロックページ有効NOERROR かつ応答IPが 162.159.36.12 / 162.159.46.12
Windows の nslookup は DoH モードで IPv6 アドレスマッピングの問題により失敗します。 検証には dig(Windows版)またはブラウザ確認(https://1.1.1.1/help)を使ってください。

日本のネットワーク環境における落とし穴

(1) キャプティブポータル(公衆Wi-Fi)— 最重要 新幹線・空港・カフェ・ホテルのWi-Fiは認証ページを通すまで通信を遮断します。VPNクライアントが先に繋がろうとすると、認証ページに到達できずネットに一切繋がらない状態になります。

対策3点セット:① Captive portal detection を有効化(既定は無効) ② Device tunnel protocol = MASQUE(UDP 443。通常のHTTPSに見えるため遮断されにくい) ③ switch_lockedtrue にしない、または「Allow admin override codes」を有効化してユーザーが手動で一時切断できる逃げ道を残す

導入初期は switch_locked: false にしてください。出張者が新幹線でネットに繋がらず業務停止すると、施策全体への信頼が失われます。運用が安定してからロックするほうが結果的に速く定着します。
落とし穴対策
(2) 家庭用ルータの DNS ハイジャック
国内ISP配布ルータ(HGW)は53番を透過的に横取りする
DoH / MASQUE を使えば構造的に回避できます(平文53番を使わないため傍受できない)。展開初期は複数の回線種別(フレッツ、ケーブル、モバイル)で検証
(3) 既存VPNとの競合
ルーティング / DNS / ファイアウォールを両者が制御しようとする
IPトラフィックは Split Tunnel で相互に除外。DNS解決はどちらか一方に統一起動順序は Cloudflare One Client を先に1dot1 ならルーティングに触らないため衝突がほぼ発生しない
(4) 社内UTM(FortiGate / YAMAHA 等)DoH: 162.159.36.1 / 162.159.46.1、MASQUE: 162.159.197.0/24 UDP 443、Orchestration API: api.devices.cloudflare.com を許可。プロセスは warp-svc.exe, warp-updater.exe
既知の制限:Cloudflare One Client は Windows Server では動作しません。Windows 11 24H2 でパフォーマンス低下の可能性、macOS 15.0〜15.4 はファイアウォール設定の調整が必要です。

ログと労務上の配慮(実施前に必ず読む)

全DNSクエリが、個人(メールアドレス・デバイス名)に紐づいて記録されます 記録されるフィールド:Query name / Action / Resolver decision / Resolved IPs / Policy name / Email / User ID / Device name / Device ID / Matched categories / Source IP / 地理情報 ほか

Free の保持期間は DNS logs = 24時間。これはインシデント調査が事実上できない長さです(週明けに金曜の事象を追えない)。第2部の外部退避が必須になります。
#労務上の必須対応内容
1就業規則/情報セキュリティ規程への明記通信ログを取得すること、目的(マルウェア感染・情報漏えいの防止、不正アクセスの検知)、保存期間、閲覧権限者の範囲
2責任者と権限の明定責任者=管理部門長、実施者=インフラ管理者(主)、閲覧権限は Zero Trust: PII Read 保有者に限定
3運用ルールの策定平常時は個人単位のログを閲覧しない。インシデント検知時または本人同意時にのみ、責任者の承認を得て閲覧する」を明文化
4適正性の確認四半期に一度、PII閲覧の実施記録を管理部門長がレビュー
5事前の周知導入前に説明会+書面で周知。労組がなければ従業員代表への説明。抜き打ち導入は労務トラブルの典型的な火種
6目的外利用の禁止人事評価・勤怠管理には使用しない旨を明記。特に Job Search & Careers カテゴリをブロックしない/ログを人事目的で見ないことは重要
信頼を得るコツ 規程には「取得しない情報」も明記してください。例:「Gateway は HTTP のボディを記録しない」——これは公式ドキュメントで裏付けのある事実です(エラー時のみ先頭512バイトを30日間保持する例外あり)。

7Step 4 — ④ DEX 合成テスト

目的:「繋がらない」の第一報が社員からの申告になる状態をやめ、能動的に監視して先に気づく

Free 可
DEX は全 Zero Trust プランで利用可能
10
Free の DEX テスト上限(Standard 30 / Ent 50)
5〜60分
テスト間隔の指定範囲
7日
DEXログ保持(全プラン一律)
DEX 合成テストの構成 代表10台(DEX rules) One Client(warp モード) 15分間隔でテスト実行 全50台×5分だと 600回/時でサーバに負荷 Cloudflare Gateway / Tunnel 終端 DEX 結果の集計 Live analytics で可視化 社内システム 10.0.1.10:443 HTTP Get テスト + Traceroute テスト private IP も対象にできる アラート Test Low Availability SLO 98.0 情シスML へメール Webhook は Free 不可 ⚠ private IP テストの3つの前提条件(すべて必要) ① 端末の service mode が warp(Traffic and DNS)または tunnelonly1dot1(DNS only)では不可 ② Split Tunnel の設定で 10.0.1.0/24 が WARPトンネルを通るようになっていること ③ Cloudflare Tunnel 側で該当CIDRが Route として公開されていること → ④DEX の private IP 監視は Step 7 完了かつ段階2(warp モード移行)後。それまでは public hostname の HTTP テストで代替
図13: DEX 合成テストの構成と、private IP テストの前提条件

HTTP 合成テストの設定

パス:Insights > Digital experience > 「Tests」タブ > Add a Test

フィールド設定
Name社内Webシステム-HTTP
Target監視対象のURL。public / private のどちらのホスト名もサポート
Test typeHTTP Get
Test frequency5〜60分の範囲で指定(推奨15分)

測定される指標:Resource fetch time(リクエスト全ステップの合計)/ Server response time / DNS response time / HTTP status codes

プライベートホスト名を使う場合の重要なトレードオフ 公式は「private hostname をテストする場合、そのドメインを local domain fallback リストに入れること」と要求します。しかし Local Domain Fallback の対象になったDNSリクエストは Gateway リゾルバをバイパスするため、Gateway の DNS ポリシー適用とログ記録の対象外になります。
社内ドメインなのでセキュリティ上の実害は小さいですが、「全クエリがログに残る」という前提は崩れます。設計時に認識しておいてください。

DEX rules(どの端末がテストを実行するか)

全50台で5分間隔は危険 ルール未設定の場合、テストはデバイスフリート全体で実行されます。全50台で5分間隔だと、社内システムへのアクセスが1時間あたり600回になり、対象サーバに無視できない負荷がかかります。
推奨:DEX rule で代表10台程度に絞り、間隔を15分にする(Free枠10テストの節約にもなります)。

アラート設定

種別内容しきい値
Device Connectivity AnomalyWARP 接続デバイス数のスパイク/急減z-score が 3.5超 / -3.5未満
DEX Test Latencyアプリケーション遅延のスパイク/急減同上
DEX Test Low AvailabilityHTTP/traceroute の成功率が SLO を下回る管理者が xx.x 形式で指定 → 推奨 98.0
これが実質的な「繋がらない」の自動検知になります 社内システム向けに DEX Test Low Availability を SLO 98.0 で作成し、情シスのメーリングリストへ配信してください。

その他の機能

機能パス / 内容
Device MonitoringTeam & Resources > Devices > デバイス > View details > DEX タブ。接続状態 / CPU使用率 / メモリ使用率 / バッテリー / 通信量 / 展開されているクライアントモード / クライアントバージョン
「どの端末が古いクライアントのままか」「どの端末が DNS only モードから外れているか」を一覧確認でき、50台の展開状況チェックに最適
Remote CapturesInsights > Digital experience > Diagnostics。キャプチャ時間600秒 / ファイル50MB / 最大10台同時 / Free は 100回/日
Remote Captures は通信内容そのものを取得します DNSログ以上に機微であるため、実行には事前の本人通知または明確な承認プロセスを規程化してください。

8Step 5 — ⑤ Turnstile 標準部品化

目的:(1) 自社コーポレートサイトの問い合わせフォームのスパム対策、(2) 受託案件で使い回せる標準コンポーネント化。

受託開発で決定的に重要な特性 公式に「Cloudflare にトラフィックを通さずに任意のサイトに埋め込める」と明記されています。さくら・AWS・Xserver 上のクライアントサイトでも、DNSを触らずに導入できます。
費用は Free で「Unlimited challenges(トラフィック・検証リクエストとも無制限)」。2023年GA時の「siteverify 100万回上限」は現行の公式plansページには記載がなく、無制限と明記されています。
Free の上限:ウィジェット 20個/アカウント、ホスト名 10個/ウィジェット、アナリティクス保持 7日
Turnstile 検証シーケンス — サーバ側の siteverify が本体 訪問者のブラウザ Turnstile (Cloudflare) 自社サーバ ① api.js 読込・ウィジェット描画(data-language="ja" / data-action="contact-form") ② トークン発行 → hidden input「cf-turnstile-response」に自動挿入 トークンは使い捨て・300秒で失効 ③ フォーム送信(トークン同梱) ④ POST /turnstile/v0/siteverify secret + response + idempotency_key ⑤ { success, hostname, action, error-codes } ⑥ サーバ側で必ず検証する3点 success === true / hostname が許可リストか action が想定どおりか 失敗時は必ず turnstile.reset() トークンは1回しか使えない。リセットしないと再送信は必ず失敗する
図14: Turnstile の検証シーケンス。クライアント側だけでは完全に無意味で、サーバ側の siteverify が本体

クライアント側(プレーンHTML)

<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>

<form id="contact-form" action="/contact/submit" method="POST">
  <label>お名前 <input type="text" name="name" required></label>
  <label>メールアドレス <input type="email" name="email" required></label>
  <label>お問い合わせ内容 <textarea name="message" required></textarea></label>

  <div class="cf-turnstile"
       data-sitekey="0x4AAAAAAA_YOUR_SITE_KEY"
       data-language="ja"
       data-theme="auto"
       data-size="flexible"
       data-action="contact-form"
       data-appearance="interaction-only"
       data-callback="onTurnstileSuccess"
       data-error-callback="onTurnstileError"
       data-expired-callback="onTurnstileExpired"></div>

  <p id="turnstile-error" role="alert" style="color:#c00;"></p>
  <button type="submit" id="submit-button" disabled>送信する</button>
</form>

<!-- JavaScript 無効時のフォールバック導線 -->
<noscript>
  <p style="color:#c00;">
    このフォームのご利用には JavaScript が必要です。<br>
    有効にできない場合は <a href="mailto:info@synon.co.jp">info@synon.co.jp</a> またはお電話にてご連絡ください。
  </p>
</noscript>

サーバ側検証(PHP・hostname / action の検証まで含む)

<?php
declare(strict_types=1);

function verify_turnstile(string $token, ?string $remoteIp = null): array
{
    $secret = getenv('TURNSTILE_SECRET_KEY');
    if ($secret === false || $secret === '') {
        error_log('[Turnstile] TURNSTILE_SECRET_KEY is not configured');
        return ['ok' => false, 'errors' => ['missing-input-secret']];
    }
    if ($token === '') {
        return ['ok' => false, 'errors' => ['missing-input-response']];
    }

    $payload = [
        'secret'          => $secret,
        'response'        => $token,
        'idempotency_key' => bin2hex(random_bytes(16)),   // 安全なリトライ用
    ];
    if ($remoteIp !== null) { $payload['remoteip'] = $remoteIp; }

    $ch = curl_init('https://challenges.cloudflare.com/turnstile/v0/siteverify');
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,          // POST のみ。GET 不可(reCAPTCHA との差分)
        CURLOPT_POSTFIELDS     => http_build_query($payload),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 10,
        CURLOPT_SSL_VERIFYPEER => true,
    ]);
    $raw = curl_exec($ch); $errNo = curl_errno($ch); curl_close($ch);

    if ($errNo !== 0 || $raw === false) {
        return ['ok' => false, 'errors' => ['internal-error']];
    }
    $result = json_decode((string) $raw, true);
    if (!is_array($result)) {
        return ['ok' => false, 'errors' => ['bad-request']];
    }
    if (($result['success'] ?? false) !== true) {
        return ['ok' => false, 'errors' => $result['error-codes'] ?? ['unknown']];
    }

    // ★ hostname / action のサーバ側検証(必須級)
    $allowedHosts = ['synon.co.jp', 'www.synon.co.jp'];
    if (!in_array($result['hostname'] ?? '', $allowedHosts, true)) {
        error_log('[Turnstile] hostname mismatch: ' . ($result['hostname'] ?? ''));
        return ['ok' => false, 'errors' => ['hostname-mismatch']];
    }
    if (($result['action'] ?? '') !== 'contact-form') {
        return ['ok' => false, 'errors' => ['action-mismatch']];
    }
    return ['ok' => true, 'errors' => []];
}

エラーコードと対処

コード意味対処
missing-input-secret / invalid-input-secretsecret 未指定 / 無効・期限切れ環境変数の設定漏れ、キーローテーション漏れ、環境間の取り違え → 500 + アラート
missing-input-responseトークン未指定JS無効/ボット直叩き → 400 で拒否
invalid-input-responseトークンが無効・期限切れ300秒超過が最も多い → 400 + 「有効期限が切れました」表示 + turnstile.reset()
timeout-or-duplicateトークンが使用済みリプレイ攻撃または二重送信 → 400 で拒否しログ記録
internal-errorCloudflare 側の内部エラーidempotency_key を付けて指数バックオフでリトライ

開発用テストキー(受託案件の自動テストに組み込む)

サイトキー(クライアント側)挙動シークレットキー(サーバ側)挙動
1x00000000000000000000AA常に成功(可視)1x0000000000000000000000000000000AA常に検証成功
2x00000000000000000000AB常に失敗(可視)2x0000000000000000000000000000000AA常に検証失敗
1x00000000000000000000BB常に成功(不可視)3x0000000000000000000000000000000AAtimeout-or-duplicate(使用済み)を返す
3x00000000000000000000FF強制的に対話型チャレンジ
標準化の提言 この3種のシークレットキーで「成功/失敗/使用済み」の3パターンを自動テストに必ず組み込むことを受託案件の標準にしてください。特に3つ目はリプレイ攻撃時のエラーハンドリングを単体テストできる貴重な仕組みです。

受託案件への標準化(納品物としての整備)

Cloudflare アカウントの持ち主に関する運用ルール(提言) 受託案件では、Turnstile のウィジェットを自社アカウントで作るか、顧客アカウントで作るかを必ず契約時に決めてください。自社アカウントで作ると Free の20ウィジェット上限にすぐ到達し、かつ保守契約終了後もキーを握り続けることになります。原則、顧客アカウントで発行し、自社は共同管理者として招かれる形を標準にすることを推奨します。

CSP 設定とよくあるクライアント側エラー

script-src  https://challenges.cloudflare.com;
frame-src   https://challenges.cloudflare.com;
connect-src 'self';   /* Pre-clearance 使用時のみ */
コード意味対処
110200ドメインが許可されていないHostname Management にドメインを追加(最頻出)
200500iframe 読み込みエラーchallenges.cloudflare.com がブロックされていないか確認(社内プロキシ・広告ブロッカー)
400070サイトキーが無効化されているダッシュボードでウィジェットの状態を確認

9Step 6 — ⑥⑦⑧ Analytics / Cache / Security Center

Step 1(DNS移管)が完了していれば、この3つは合わせて1時間程度で完了します。

⑥ Web Analytics

パス:ダッシュボード(アカウントレベル) > Web Analytics > Add a site

プロキシ済みゾーンなら、ドロップダウンからホスト名を選んで Done するだけです(自動セットアップが既定で有効)。JSビーコンは Cloudflare が自動注入するため、オリジン側のコード変更は不要です。

自動注入が失敗する条件 オリジンが Cache-Control: public, no-transform を返していると、Cloudflare がレスポンスを改変できず注入できません。nginx で no-transform を付けていないか確認してください。
Web Analyticsゾーンの Analytics タブ
計測方式クライアントサイド(JSビーコン)サーバサイド(エッジのログ)
測るもの実ユーザーの体感・実際の閲覧エッジを通過した全HTTPリクエスト
ボット/クローラほぼ含まれない含まれる

両方使うのが正解です。副次的メリットとして、プロキシ済みなら送信先が自ドメインの /cdn-cgi/rum になるため、広告ブロッカーによる遮断を受けにくいです。

プライバシーポリシーに書く際の注意 「Cookieを一切使わない」「GDPR準拠」といった断定は、公式ドキュメントに明示がありません。社内のプライバシーポリシーに記載する場合は、Cloudflare のプライバシーポリシー本文と DPA を別途確認してください。

⑦ Tiered Cache

パス:Caching > Tiered Cache → トグルを On Free 可

Smart Tiered Cache は Free でも利用できます。レイテンシデータを用いてオリジンごとに最も近い上位層を1つ自動選択し、AWS / GCP / Azure のクラウドリージョンヒントに対応しているため、EC2 オリジンと相性が良い機能です。有効化しない理由がほぼありません。

設定パス推奨値
Browser Cache TTLCaching > ConfigurationRespect Existing Headers(オリジンの Cache-Control で制御。Git管理でき環境差分が出にくい)
Always Online同上On。オリジン到達不能時に Internet Archive 経由で古い版を配信。Free はクロール30日ごとなので最大30日前の内容が出る
Early HintsSpeed > Settings > Content OptimizationOn(ただしオリジンが Link: ...; rel=preload ヘッダを返さないと何も起きない
圧縮Free の既定は Zstandard。通常はそのままで良い(Brotli を有効化する旧手順は不要)
# 1. 静的アセットの長期キャッシュ
(http.request.uri.path.extension in {"css" "js" "woff2" "woff" "svg" "png" "jpg" "jpeg" "webp" "avif" "ico"})
→ Eligible for cache / Edge TTL: 1ヶ月 / Browser TTL: 1週間

# 2. 静的HTMLページのエッジキャッシュ(頻繁に更新しないページのみ)
(http.request.uri.path eq "/" or starts_with(http.request.uri.path, "/company/")
 or starts_with(http.request.uri.path, "/service/"))
→ Edge TTL: 1〜4時間 / Browser TTL: respect origin
   # ※ 更新時にパージが必要。運用者に周知すること

# 3. 管理画面・APIのキャッシュ除外(明示的に)
(starts_with(http.request.uri.path, "/wp-admin") or starts_with(http.request.uri.path, "/api/")
 or http.cookie contains "wordpress_logged_in")
→ Bypass cache
既定のキャッシュ挙動で知っておくべきこと Cloudflare は MIMEタイプではなく拡張子ベースで判定します。HTML と JSON は既定でキャッシュされません(これがコーポレートサイト高速化の最大のポイント)。Free は Edge Cache TTL の最小値が2時間です(Pro=1時間、Business=1秒)。
また Tiered Cache の効果を単一リクエストのヘッダから直接確認する公式な方法はありません(Free には Argo Analytics がないため)。Caching > Overview のキャッシュヒット率を、有効化の前後で1〜2週間比較してください。

⑧ Security Center

Free での決定的な制約 手動スキャン(「今すぐスキャン」)が実行できるのは、Business/Enterprise ゾーンを1つ以上持つアカウントのみです。Free では週1回の自動スキャン結果を待つしかありません。検証には最大1週間かかります。また Administrator Read Only ロールのユーザーは Security Center にアクセスできません。
頻度作業
週次(15分)Critical / High の新規 insight を確認。特にダングリングDNSを最優先(EC2を停止・入れ替えして Elastic IP を解放すると、第三者がそのIPを取得してサブドメインを乗っ取れます。開発環境の作り捨てが多い開発会社で最も起きやすい事故)。MFA未設定の管理者ユーザーがいないかも確認
月次(1時間)Infrastructure でアセット棚卸し(不要なサブドメイン・古い開発環境のDNSレコードを削除)。プロキシされていないレコードの正当性を1件ずつ検証。Brand Protection で synon に類似したドメイン登録を確認(フィッシング対策)。Investigate で頻出攻撃元IP/ASNを調査
四半期Free の制約(Custom Rules 5本、Rate Limiting 1本、Log アクション不可、手動スキャン不可)が業務のボトルネックになっていないか棚卸しし、Pro へのアップグレード要否を判断

10Step 7 — Zero Trust 接続基盤(WARP + Tunnel)

目的:社内Webシステム(10.0.1.10:443)への到達経路を、AWS Client VPN から Cloudflare 経由に置き換える。EC2 のインバウンドは一切開けない。

社員端末 Cloudflare One Client service_mode: warp Split Tunnel: Include 10.0.1.0/24 synon.cloudflareaccess.com デバイス登録 @synon.co.jp + Login Methods 制限 認証 = Google Workspace SSO Cloudflare グローバル網 Gateway プロキシ(TCP / UDP / ICMP を ON) これを ON にしないと Network ポリシーが評価されない Traffic policies > Proxy Network ポリシー(上から評価・first match) [1] Allow: dst 10.0.1.0/24:443 + User Group Names [2] Block: dst 10.0.0.0/8(キャッチオール遮断) Tunnel 終端 / Routes 10.0.1.0/24 → synon-aws-vpc-01 デバイスポスチャ(段階導入) Require WARP / Disk encryption / OS version AWS VPC 10.0.0.0/16 cloudflared #1 (AZ-a) Remotely-managed systemd サービス cloudflared #2 (AZ-c) 同一トークンで install するだけ 無停止アップグレードが可能に 社内Webシステム 10.0.1.10:443 インバウンド全閉のまま SG アウトバウンドのみ TCP+UDP 7844 / TCP 443 NACL 使用時はエフェメラルポートも 常時 接続 Client VPN と同時接続しない ルートが競合し挙動が不安定に 疎通確認に ping / traceroute を使ってはいけない。WARP 経由は挙動が全く異なる → curl / nc -zv / Test-NetConnection を使う
図15: Zero Trust 接続基盤の全体構成。EC2 はアウトバウンド7844のみで、インバウンドは一切開けない

EC2 のアウトバウンド要件

宛先 FQDNIPv4プロトコル/ポート
region1.v2.argotunnel.com198.41.192.7, .27, .37, .47, .57, .67, .77, .107, .167, .227TCP 7844 (http2) / UDP 7844 (quic)
region2.v2.argotunnel.com198.41.200.13, .23, .33, .43, .53, .63, .73, .113, .193, .233同上
推奨(TCP 443):api.cloudflare.com / update.argotunnel.com / github.com / synon.cloudflareaccess.com / cfd-features.argotunnel.com
NACL の落とし穴 —「SGは開けたのに繋がらない」の典型原因 NACL はステートレスなので、アウトバウンド 7844(TCP/UDP)に加えて、インバウンドのエフェメラルポート 1024-65535 を戻り通信用に開ける必要があります。SG はステートフルなので不要です。
プライベートサブネット配置の場合は NAT Gateway が必要ですが、NAT Gateway は UDP も通すため QUIC は動作します。
# 疎通のプレチェック(cloudflared 2026.5.2 以降は起動時に自動実行)
cloudflared tunnel diag
# DNS解決 / UDP・TCP 7844 疎通 / 管理API到達性を検査し、
# 「両方成功=quic/http2どちらも可」「UDPのみ」「TCPのみ」「両方失敗=パケットドロップ」を判定

cloudflared のインストール

# Amazon Linux 2023 / RHEL 系
curl -fsSl https://pkg.cloudflare.com/cloudflared.repo | sudo tee /etc/yum.repos.d/cloudflared.repo
sudo yum update -y
sudo yum install -y cloudflared
cloudflared --version

# Ubuntu / Debian
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \
  | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main' \
  | sudo tee /etc/apt/sources.list.d/cloudflared.list

sudo apt-get update && sudo apt-get install -y cloudflared
2025年10月30日にパッケージ署名用公開鍵がローテーションされています。 それ以前に構築した既存ホストは、上記の GPG キー取得コマンドを再実行しないと apt-get update が失敗します。

トンネルの作成:Remotely-managed を推奨

Remotely-managed(推奨)Locally-managed
設定の保管場所Cloudflare 側EC2 上の config.yml
ルート追加ダッシュボード Networking > RoutesCLI
2台目のレプリカ追加同じトークンで実行するだけ資格情報ファイルを手動コピー
向いているケース50名規模・GUI運用・HA を後から足すIaC で完全コード管理したい
トンネルを作成Networking > Tunnels > Create a tunnel → コネクタタイプ Cloudflared → 名前 synon-aws-vpc-01 → Create Tunnel
EC2 で1コマンド実行sudo cloudflared service install eyJhIjoiXXXX...(ダッシュボードが発行するトークン)。これだけで systemd サービス登録+起動まで完了します。
Healthy を確認ダッシュボードのトンネル一覧でステータスが Healthy になること。
2台目(別AZ)で同一トークンを実行これだけで HA 構成になります。cloudflared tunnel info synon-aws-vpc-01 で Connector が2件表示されればOK。
レプリカ2台構成は費用¥0で最大効果 公式のサイジング推奨は「ロケーションごとに専用ホスト2台、各ホスト最低 4GB RAM / 4 CPU コア」で、この構成で約8,000ユーザーを収容できます。50名なら t3.medium ×2 で圧倒的に余裕があります。
2台構成にする最大の実利は「無停止アップグレードができること」です。アップデートは cloudflared を再起動させ、処理中のトラフィックに影響するため、片方ずつ更新してください。
レプリカ運用の注意(公式記載の制約)サービスとして動作する場合、1ホストにつき cloudflared インスタンスは1つのみ。同一 EC2 で2プロセス動かして冗長化することはできません。必ず物理的に別ホストに
② 全レプリカは同一のルート・同一の設定を提供します。レプリカごとに異なる CIDR は持てません
--protocolauto のままにしてください。UDPを使う通信をトンネル越しに流すには QUIC が必要なため、http2 に固定すると UDP プロキシが機能しません
sudo$HOME/root に変えるため、Locally-managed では必ず --config <絶対パス> を明示してください
# ヘルスチェック
cloudflared tunnel info synon-aws-vpc-01
curl -s http://127.0.0.1:20241/metrics | grep -E 'cloudflared_tunnel_(ha_connections|total_requests|request_errors)'
# 監視は cloudflared_tunnel_ha_connections(正常時は 4/レプリカ)が 2 未満でアラート

# CIDR ルートの追加
cloudflared tunnel route ip add 10.0.1.0/24 synon-aws-vpc-01
cloudflared tunnel route ip show
cloudflared tunnel route ip get 10.0.1.10        # どのトンネルにルーティングされるか
cloudflared tunnel route ip delete 10.0.1.0/24   # ロールバック時
実務上いちばん多い「重複」の罠 Virtual Network が必要になるケース(複数VPCで同じレンジ)より、社員の自宅ルータとの重複のほうが頻発します。10.0.1.x を使う機器(一部のWi-Fiルータ、Docker、VMware)とぶつかると、その社員だけアプリに到達できません。事前アンケートを必ず実施してください。

認証:Google Workspace SSO の構成

作業は Google Cloud Console → Google Admin Console → Cloudflare の3か所にまたがります。順序を守ってください。特に「Cloudflare で保存した後に生成されるリンクを Google Workspace 管理者が開いて認可する」ステップは最も脱落しやすく、これを飛ばすとグループが一切取得できません

Google Workspace SSO の構成手順 — 3か所を順番に ① Google Cloud Console 1. プロジェクト作成(既存流用可) 2. Admin SDK API を有効化(これ1つだけ) 3. OAuth 同意画面 → Audience = Internal 4. OAuth クライアント(Web application) 5. Client ID / Secret を控える 🔴 リダイレクトURI は完全一致 https://synon.cloudflareaccess.com /cdn-cgi/access/callback ② Google Admin Console Security > Access and data control > API controls > Settings > Internal apps ☑ Trust internal apps 既定は OFF。必ず ON にする 🔴 OFF だと何が起きるか Admin SDK は「制限付き」サービスのため、 ログインは通るのにグループ取得だけが 静かに失敗する(最頻出の障害) ③ Cloudflare Integrations > Identity providers > Add new > Google Workspace 入力は3フィールドだけ App ID / Client secret / Google Workspace ドメイン = synon.co.jp 🔴 Save 後の「生成リンク」を   Workspace 管理者が開いて認可 これを飛ばすと Test が必ず失敗する ④ 検証 — グループが取れているかを必ず確認する IdP の「Test」ボタン "Your connection works!" + group membership get-identity(最も確実) /cdn-cgi/access/get-identity → groups を目視 User Registry identity Team & Resources > Users > 対象ユーザー ⑤ 権限のレイヤー分離 — これが Fail-safe 設計の要 デバイス登録:「会社の人なら誰でも可」 Emails ending in @synon.co.jp + Require Login Methods = Google Workspace 到達できるリソース:グループで制御 Gateway Network ポリシーで User Group Names = internal-app-users
図16: Google Workspace SSO の構成手順。③の「生成リンクの認可」と②の Trust internal apps が二大脱落ポイント
事前確認:チーム名を確定させること OAuth のリダイレクトURIにチーム名が入るため、後からチーム名を変えると IdP 設定と全端末のクライアント設定をやり直すことになります。現在のチーム名は Zero Trust > Settings で確認できます(本書では synon を前提)。
💡 GCP Console は英語表示に切り替えて作業することを強く推奨します(右上の設定、または URL に &hl=en)。公式手順と1対1で照合でき、事故が減ります。

① Google Cloud Console 側(所要20分)

#作業パス / 値
1GCP にログインhttps://console.cloud.google.com/Google Workspace の管理コンソールとは別物
2プロジェクト作成(既存があれば流用可)IAM & Admin > Create Project → 例:synon-cloudflare-idp
3API ライブラリを開くAPIs & Services > Enable APIs and Services
4API を検索admin で検索 → Admin SDK API を選択
5有効化Enable(有効にするのはこの1つだけ。Directory API はこの中に含まれます)
6認証情報へAPIs & Services > Credentials
7同意画面を構成Configure Consent Screen > Get Started
8同意画面の設定App name:Cloudflare One SSO / User support email:it@synon.co.jpAudience Type:Internal / Contact Information:情シスの共有メールボックス
9OAuth クライアント作成Create OAuth Client → Application type:Web application
10JavaScript 生成元https://synon.cloudflareaccess.com
11リダイレクトURIhttps://synon.cloudflareaccess.com/cdn-cgi/access/callback完全一致でなければ動きません
12Client ID / Client secret を控えるシークレットは作成時の1回しか表示されません(以後は末尾4文字のみ)
3つの重大な注意 🔴 Audience Type は必ず「Internal」に。公式原文:「This Audience Type limits authorization requests to users in your Google Workspace and blocks users who have regular Gmail addresses.」——個人 Gmail を遮断する正式なメカニズムがこれです。誤って External を選ぶと、個人 Gmail が認証可能になるうえ「未確認のアプリ」警告や100ユーザー上限に引っかかります。

🔴 Client secret は作成した瞬間にパスワードマネージャへ保存。Google はシークレットをハッシュ化して保持しており再表示できません。紛失時はローテーションするしかありません。

⚠️ OAuth クライアントは「6ヶ月間未使用だと自動削除」されます。削除30日前に通知メールが届きますが、その宛先が手順8の Contact Information です。個人アドレスにすると退職時に見落とし、ある日突然 Error 401: deleted_client で全社ログイン不能になります。必ず共有メールボックスに。

英語UI / 日本語UI 対訳

英語日本語UI
APIs & Services > Enable APIs and ServicesAPI とサービス > API とサービスの有効化
OAuth consent screen / AudienceOAuth 同意画面 / 対象
Internal内部
Web applicationウェブ アプリケーション
Authorized JavaScript origins承認済みの JavaScript 生成元
Authorized redirect URIs承認済みのリダイレクト URI
Security > Access and data control > API controlsセキュリティ > アクセスとデータ管理 > API の制御
Trust internal apps内部アプリを信頼する

② Google Admin Console 側(所要5分・忘れやすい)

パスhttps://admin.google.comSecurity > Access and data control > API controls > Settings > Internal apps「Trust internal apps」にチェック

これは既定でOFFです 公式原文:「The Trust internal apps setting is disabled by default and must be enabled for Cloudflare Access to work correctly.」
Admin SDK Directory API は Google の「制限付き(restricted)」サービスに分類されるため、これがOFFだとログイン自体は通るのにグループ取得だけが静かに失敗します。

③ Cloudflare 側(所要10分)

パスZero Trust > Integrations > Identity providers > Add new identity provider > Google Workspace

3つのフィールドを入力App ID(= OAuth Client ID)/Client secretGoogle Workspace ドメインsynon.co.jp
「ディレクトリ管理者メールアドレス」のような専用フィールドは存在しません
(任意)PKCE を有効化Proof of Key Exchange。全ログイン試行で実行されます。
Save保存後に生成されるリンクが表示されます
🔴 生成リンクを Google Workspace 管理者が開いて認可管理者アカウントでログインし、Cloudflare Access がグループ情報を参照することを許可します。成功ページが出れば完了。
ここが最も脱落しやすいステップです。自分が管理者でない場合はリンクを管理者に共有してください。
Test ボタンで確認"Your connection works!" + グループメンバーシップが返ることを確認。
⚠️ 手順4を踏む前に Test を押すと Failed to fetch user/group information from the identity provider になります。これは正常な挙動です。
# API で作成する場合(POST /accounts/{account_id}/access/identity_providers)
# 必要トークン権限: Access: Organizations, Identity Providers, and Groups Write
{
  "config": {
    "client_id": "<your client id>",
    "client_secret": "<your client secret>",
    "apps_domain": "synon.co.jp"
  },
  "type": "google-apps",
  "name": "Google Workspace (synon.co.jp)"
}

④ Google グループの設計

パス:Google Admin Console > ディレクトリ > グループ

項目
グループのメールアドレスinternal-app-users@synon.co.jp
グループの表示名internal-app-users
メンバー社内システムの利用者を直接メンバーとして追加
3つの設計上の注意 1. 表示名とメールのローカル部を同一に。Access ポリシーはグループのメールアドレスを、Gateway ポリシーの公式サンプルはグループ表示名を値に取ります。揃えておかないと運用で混乱します
2. ネストグループ(グループのグループ)に依存しない。Cloudflare がネストグループ対応を明記しているのは Microsoft Entra ID のみで、Google Workspace については記述がありません。50名規模なら全員を直接メンバーにするのが確実です
3. グループ名に日本語を使わない。User Group Names は文字列一致で式に埋め込まれるため、ASCII 名を推奨します

⑤ デバイス登録権限

パスZero Trust > Team & Resources > Devices > Device profiles > Management > Device enrollment > Device enrollment permissions > Manage

Policies タブ

ActionRule typeSelectorValue意図
1AllowIncludeEmails ending in@synon.co.jp通常社員
RequireLogin MethodsGoogle WorkspaceOTP での一般登録を封じる
2AllowIncludeEmailsbreakglass@synon.co.jpbreak-glass
RequireLogin MethodsOne-time PINこの1名だけ OTP 可

Login methods タブ:Google Workspace ✅ ON / One-time PIN ✅ ON(削除しない)/ Apply instant authentication ❌ OFF

なぜ Instant Auth を OFF にするのか Instant Auth は IdP 選択画面をスキップして直接 SSO へリダイレクトする機能で、IdP がちょうど1つのときのUXが最良になります。しかし本構成は OTP をフォールバックとして残すため、ONにすると OTP を選ぶ手段がユーザーから失われます。OFF のままの実害は「ログイン画面でボタンを1回押す」だけなので、50名規模では OFF 継続を推奨します。
デバイス登録ポリシーでグループセレクタを使わないでください(Fail-safe 設計) 技術的には使える見込みですが公式ドキュメントに明記がなく、グループ取得に失敗すると全員が登録不能になり50台が一斉にオフラインになります。登録は「会社の人なら誰でも可」、到達できるリソースはグループで制御——というレイヤー分離が、Free プラン・情シス少人数の環境では圧倒的に安全です。
またデバイス登録ポリシーではデバイスポスチャチェックが使えません(公式に明記)。

⑥ break-glass アカウントの設計

Google Workspace SSO に一本化すると、Google が落ちた瞬間に誰も新規ログインできなくなります 必ず脱出経路を用意してください。
#設計
1breakglass@synon.co.jp を Google Workspace 上に作らない。Google 障害時に使えなければ意味がありません。Cloudflare の OTP はメールを受信できればよいので、Google Workspace 外のメールボックス(別ドメイン、または Cloudflare Email Routing で別プロバイダへ転送)を使います
2Cloudflare ダッシュボードの管理者ログインを Google SSO に依存させない。Google でログインする運用にしていると、Google 障害時に設定変更すらできなくなります。メールアドレス+パスワード+TOTP の管理者を最低2名確保
3API トークンを事前発行してオフライン保管Access: Organizations, Identity Providers, and Groups WriteZero Trust Write)。ダッシュボードにログインできなくても IdP 設定を API でロールバックできます
4復旧手順を紙/オフラインで保管。内容は「Login methods タブで One-time PIN を全員に開放する」の1ページで十分です
5四半期に1回、実際に break-glass でログインしてみる。未使用だと壊れていることに気づけません

⑦ 典型的な失敗と対処

症状原因対処
Test で Failed to fetch user/group information from the identity provider管理者認可リンク未実行Cloudflare の IdP 設定を開き直し、生成リンクを Workspace 管理者が実行
Test は通るがポリシービルダーにグループが出ないTrust internal apps 未設定 または Admin SDK API 未有効化②/①の手順5 を再確認
ポリシーは作れるが特定ユーザーだけ通らないそのユーザーが再認証していない(last-known state が OTP のまま)refresh-identity を実行させる
グループ変更が反映されないSCIM 非対応のため継続同期なし再認証させる。または check_session で強制
Error 401: deleted_clientOAuth クライアントが6ヶ月未使用で自動削除、または手動削除クライアントを再作成し、Cloudflare 側の App ID / Secret を更新
最重要の切り分けツールは get-identity https://synon.cloudflareaccess.com/cdn-cgi/access/get-identity をブラウザで開き、JSON の groups を見てください。ここに groups が入っていなければ IdP 側、入っているのにポリシーが効かなければ Cloudflare ポリシー側、と一発で切り分けられます。あわせて name / email / id のどれが埋まっているかを実データで確定しておくこと。

⑧ 既に One-time PIN で運用開始している場合の移行手順

新規構築であれば上記の手順で最初から Google Workspace を構成すれば済みます。既に OTP で50台を展開済みの場合は、以下の並走カットオーバーで移行してください。

基本方針:並走します。OTP を先に消してはいけません Cloudflare は複数 IdP の同時稼働を公式サポートしており(上限50)、後から Login Methods セレクタで段階的に締められます。
🔴 絶対にやってはいけないこと:Phase 3 以前に Login methods タブで OTP を OFF にすること。全員が新規登録も再認証もできなくなります。
Phase作業検証ロールバック
0 準備
影響なし・1〜2h
IdP・デバイス登録ポリシー・Gateway ポリシーを JSON でバックアップ/チーム名を確定/消費シート数を記録/Google グループ作成/break-glass 用メールを準備/ダッシュボード管理者2名が Google SSO なしでログインできることを実際に確認各項目の記録が取れている影響ゼロ
1 Google側構築
影響なし・30分
①〜②を実施redirect URI が完全一致GCPプロジェクトを削除するだけ
2 IdP追加
並走開始・15分
③を実施。Login methods タブはまだ触らないTest でグループが返る/get-identity でグループの実データ形式を確定IdP を削除するだけ。この時点でエンドユーザーへの影響はゼロ
3 パイロット1名
30分
Login methods で Google Workspace を追加ON(OTPもONのまま)/Instant Auth OFF。管理者が予備端末で登録get-identity にグループが入る/10.0.1.10:443 に到達できるGoogle Workspace を OFF(1クリック・即時)
4 パイロット5名
1〜2日
5名に再認証を依頼。Gateway Allow ポリシー(グループ条件)を作成(Block はまだ作らない)5/5 でグループ反映/消費シート数が Phase 0 から増えていないことGateway ポリシーを Disable
5 全員移行
1週間
全社アナウンス(Googleアカウント選択の注意を必ず含める)→ 全員に再認証を実施してもらう🔴 Users で50名全員のアイデンティティにグループが載ったことを1名ずつ確認移行の合否判定
6 締める
30分
キャッチオール Block 追加/Allow に check_session 設定/デバイス登録ポリシーを推奨構成に変更/break-glass で OTP ログインを実地確認非メンバーが遮断される/通常ユーザーが OTP で登録できない各設定を個別に Disable
7 後片付け
2週後
認証ログをレビュー/OTP の IdP 自体は削除しない/自動シート回収を設定/OAuthシークレットのローテーション予定を登録
🔴 Phase 5 の検証を飛ばして Phase 6 に進まないでください デバイス登録は永続で、IdP を切り替えても既存50台は再登録不要・接続も維持されます(公式:「a device registration is persistent — it does not expire and exists until you delete it」)。これは良いニュースである一方、最大の落とし穴でもあります。

再認証していないユーザーの ID は last-known state(=OTPでログインした状態・グループ情報なし) のままです。公式原文:「If a user authenticates via your Identity Provider, but later authenticates with a different method (such as One-Time PIN), Access will no longer evaluate the user's Identity Provider group memberships.」

この状態で Phase 6 の Block ポリシーを入れると、そのユーザーは社内システムに到達できなくなります。
# 全員に再認証させる最も軽い方法(いずれか)
① ブラウザで https://synon.cloudflareaccess.com/cdn-cgi/access/refresh-identity を開く
   → セッションがリセットされ、最新のグループ情報が取得される(推奨)
② Cloudflare One Client の Profile > Account information > Re-authenticate
   (v2026.1 以前は Preferences > Account > Re-Authenticate Session)
③ Access 保護アプリからログアウトして再ログイン

シートは再消費されません。シートはユーザー(メールアドレス)単位で消費されるため、OTP でも Google Workspace でも user@synon.co.jp は同一ユーザーとして扱われます。ただし Phase 4 で必ず実測確認してください。

社内アナウンスに必ず入れる1行 「Google のアカウント選択画面が出たら、必ず @synon.co.jp のアカウントを選んでください。個人の Gmail を選ぶとエラーになります。」——複数の Google アカウントにログインしている社員で確実に発生します。Phase 3 で実際のエラー画面をスクリーンショットし、手順書に貼っておくと問い合わせが激減します。

Split Tunnel —— この構成の最重要設定

⚠ 問題の所在 Cloudflare One Client は既定で Exclude モードで、除外リストに 10.0.0.0/8 が含まれる。つまり 10.0.1.10 宛の通信は初期状態では WARP を通らない 【方式A】Include モード — 推奨 「指定したものだけ WARP を通す」 10.0.1.0/24 ★ 社内アプリのサブネット(本命) synon.cloudflareaccess.com チームドメイン(認証) 104.19.194.29 / 104.19.195.29 チームドメイン IP 162.159.36.12 / 162.159.46.12 DNSブロックページ IP accounts.google.com ★ Google Workspace SSO www.googleapis.com OIDC / グループ取得 ・エントリ数 8 と少なく、設定ミスによる全断リスクが低い ・業務外の通信が Cloudflare を経由せず、社員の理解を得やすい 【方式B】Exclude モード 「除外したもの以外すべて WARP を通す」 10.0.0.0/8 を削除し、補集合16エントリを再登録する必要がある: 10.0.0.0/24 10.0.2.0/23 10.0.4.0/22 10.0.8.0/21 10.0.16.0/20 10.0.32.0/19 10.0.64.0/18 10.0.128.0/17 10.1.0.0/16 10.2.0.0/15 10.4.0.0/14 10.8.0.0/13 10.16.0.0/12 10.32.0.0/11 10.64.0.0/10 10.128.0.0/9 ダッシュボードに CIDR 計算機が内蔵されているので手計算は不要 🔴 公式警告 既定エントリを削除するとインターネット接続を失う可能性あり。 192.168.0.0/16 は絶対に消さない(自宅LANが使えなくなる) ✓ 将来 SWG(Webフィルタ)を導入するならこちら ✕ エントリ数が多く(既定20+補集合16)、事故リスクが高い
図17: Split Tunnel の2方式。本構成では要件に完全一致し事故リスクの低い Include を推奨
Split Tunnels は IP トラフィックの経路のみを制御します。DNS は Split Tunnel の対象外で、引き続き Gateway のポリシー対象です。また公式は「Split Tunnels のリストは短く保つこと。各エントリのパースにクライアント側で時間がかかる」「ドメインよりIPアドレスを優先すること」と推奨しています。この点でも Include モードが有利です。

Gateway ネットワークポリシー

前提:Zero Trust > Traffic policies > Proxy で TCP を ON(必須)、UDP・ICMP も推奨。これを ON にしないと Network ポリシーが評価されません。また identity セレクタを使うには、クライアントを Traffic and DNS モードで展開している必要があります(1dot1 では機能しません)。

順位名前条件Action
1Allow internal-app-users to internal appDestination IP 10.0.1.0/24 and Destination Port 443 and User Group Names internal-app-usersAllow
check_session 24h0m0s
2Block all other private network accessDestination IP 10.0.0.0/8Block
公式が推奨する2層構成です 原文:「To prevent Cloudflare One Client users from accessing your entire private network, we recommend creating a catch-all Gateway block policy for your private IP space. You can then layer on higher priority Allow policies」。10.0.1.0/24 だけでなく 10.0.0.0/8 全体を塞ぐことで、将来サブネットを追加したときの穴を防げます。
# 順位1: 許可(グループベース)
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/rules" \
  --request POST \
  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  --json '{
    "name": "Allow internal-app-users to internal app",
    "description": "Google Workspace group based access to the internal web app on EC2",
    "enabled": true, "precedence": 100, "action": "allow", "filters": ["l4"],
    "traffic": "net.dst.ip in {10.0.1.0/24} and net.dst.port in {443}",
    "identity": "any(identity.groups.name[*] in {\"internal-app-users\"})"
  }'

# 順位2: キャッチオール遮断
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/rules" \
  --request POST \
  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  --json '{
    "name": "Block all other private network access",
    "enabled": true, "precedence": 900, "action": "block", "filters": ["l4"],
    "traffic": "net.dst.ip in {10.0.0.0/8}"
  }'

Gateway で使えるグループ系セレクタと式

UI セレクタ名API 式(identity フィールド)
User Group Namesidentity.groups.name == "internal-app-users" / 複数は any(identity.groups.name[*] in {"dev" "infra"})
User Group Emailidentity.groups.email == "internal-app-users@synon.co.jp"
User Group IDsidentity.groups.id == "12jf495bhjd7893ml09o"
User Emailidentity.email == "user@synon.co.jp"
Access と Gateway で値の形式が異なります Access の Identity provider groupグループのメールアドレス、Gateway の公式サンプルはグループ表示名です。表示名とメールのローカル部を揃えておくと混乱しません。実際にどのフィールドが埋まっているかは get-identity の出力で必ず確認してください。

また Access の「Rule group」は Gateway では使えません(公式明記)。Gateway では必ず IdP グループ(= Google グループ)を直接指定します。
🔴 check_session(Cloudflare One Client セッション)の設定は必須です パス:Allow ポリシーの Step 4 - Configure policy settings > Enforce Cloudflare One Client session duration既定は「無制限」です。これを設定しないと次の2つが同時に起きます。

1. グループ変更が永久に反映されない — Google Workspace は SCIM 非対応のため継続同期がなく、ユーザーが再認証するまでグループの追加・削除が Cloudflare に届きません
2. 退職者の WARP が繋がり続ける — Google 側でアカウントを停止しても、既存セッションは IdP の状態を再確認しません

推奨値:24h0m0s(12〜24時間で調整)。短くするほどセキュリティは上がりますが、Google 障害時のブラストレイジも大きくなります(12時間設定で障害が12時間続けば全員が到達不能)。24時間なら Google の典型的な障害を吸収できます。
Cloudflare は現在プラン別機能対応表を公開していません。Network ポリシー本体と各セレクタは Enterprise 限定のバナーがないため Free でも利用可能と推定されますが、本番設計の確定前に Free アカウントの実機で目視確認してください(特に User Group Names セレクタと Enforce Cloudflare One Client session duration の有無)。

デバイスポスチャ(段階導入)

#チェック設定値理由
1Require WARPCloudflare One Client の動作を保証。全OS対応
2Disk encryption全ディスク暗号化必須紛失盗難対策。macOS=FileVault, Windows=BitLocker。個人情報保護法対応上も説明しやすい
3OS versionWindows 10.0.19045 以上 / macOS 14.0.0 以上既知脆弱性の放置端末を排除。セマンティックバージョニング形式が必須
段階導入を強く推奨 いきなり Block にすると、OSアップデート未実施の社員が一斉に業務停止します。まず1〜2週間はポスチャ条件を付けずに運用し、Insights > Logs > Posture logs で「何台が失敗するか」を観測してから、社内アナウンス → 条件追加、の順で進めてください。
また反映には最悪10分程度の遅延があります(5分ポーリング + 5分キャッシュ)。「暗号化を有効にしたのにまだ繋がらない」という問い合わせが来るので、ヘルプデスク手順に明記してください。

社内アプリの名前解決

方式内容推奨
A. 生IPを使うhttps://10.0.1.10段階1(疎通確認)
B. Cloudflare DNS のゾーンに登録app.internal.synon.co.jp10.0.1.10DNS only / グレー雲)。DNS-01 チャレンジで Let's Encrypt の正規証明書も取得できる段階2で採用
C. Local Domain Fallback社内DNSサーバ(Route 53 Resolver 等)へフォールバック社内DNSがある場合のみ
D. Resolver policiesGateway 側で条件付き解決Enterprise 限定
方式C(Local Domain Fallback)を使う場合の4つの注意フォールバック先のDNSサーバも Split Tunnel を通じて到達可能でなければならない(忘れると名前解決が丸ごと失敗)
これらのDNSリクエストは Gateway リゾルバをバイパスするため、DNSポリシー対象外・ログにも残りません
DNSの解決先を変えるだけで、トラフィックの経路は変えません(経路は Split Tunnel + Tunnel ルートで別途確保)
④ ⚠️ *.amazonaws.com 全体を Route 53 に向けないこと(公式警告)。AWS利用企業がやりがちな事故です

疎通確認:ping / traceroute を使ってはいけない

これを知らないと「繋がっていない」と誤判断します WARP 経由の通信は Cloudflare のエッジを経由するため、traceroute の出力は通常のVPNと全く異なります(ホップが見えない・タイムアウトする)。ICMP を Gateway プロキシで有効化していないと ping 10.0.1.10 も失敗しますが、これは正常です。
# 端末側の WARP 状態
warp-cli -l status              # → "Connected" / "Your Internet is protected"
warp-cli settings               # モードが Traffic and DNS であること
warp-cli registration show      # 登録状態とチーム名(synon)

# 正しい疎通確認(ping ではなく TCP で)
curl -vk https://10.0.1.10
curl -I  https://app.internal.synon.co.jp
nc -zv 10.0.1.10 443                        # Linux/macOS
Test-NetConnection 10.0.1.10 -Port 443      # Windows

# 経路の確認
netstat -rn | grep 10.0.1                   # macOS
ip route get 10.0.1.10                      # Linux
route print | findstr 10.0.1                # Windows

障害切り分けチェックリスト(公式10ステップ準拠)

  1. Cloudflare One Client が Connected
  2. Insights > Logs > DNS query logs にプライベートホスト名のクエリがあるか
  3. Insights > Logs > Network logs に宛先IP 10.0.1.10 が出ているか
  4. ユーザーメール・イベント "Blocked"・時間帯で絞り、Gateway ポリシーで落ちていないか
  5. 意図したポリシーがマッチしているか(評価順序。Allow が Block の上にあるか)
  6. Traffic policies > Proxy で TCP・UDP・ICMP が有効か
  7. トンネルのログストリームにリクエストが届いているか
  8. cloudflared ホスト(EC2)から直接アプリへ到達できるか → ここで失敗するなら Cloudflare は無関係。EC2 間の SG / OS ファイアウォールの問題
  9. アプリサーバ側のローカルファイアウォールが cloudflared の送信元IPを弾いていないか
  10. TLS 検査が問題を起こしていないか(自己署名証明書の場合は Do Not Inspect ポリシー、または noTLSVerify: true
Access for Infrastructure の位置づけ 本シナリオ(社内Webアプリへの HTTPS アクセス)には不適合です。SSH / RDP / Kubernetes 等のインフラ管理プロトコル向けで、Webアプリは対象外です。
ただし AWS Client VPN 廃止後の「運用SSH」をどう確保するかは別途課題になります。AWS Systems Manager Session Manager(EC2インバウンド不要・追加費用なし・IAM で制御)で賄うのが最もシンプルで、かつbreak-glass 経路としても機能します

11Step 8 — 移行と切り戻し

AWS Client VPN との並行運用は完全に可能です 両者は独立した経路であり干渉しません。EC2 の SG にインバウンドを開ける必要がないため、Client VPN 用の SG ルールもそのまま残せます。
唯一の注意点:端末で Client VPN と Cloudflare One Client を同時接続すると 10.0.1.0/24 へのルートが競合します。「どちらか片方のみ接続」を社員に周知してください。
フェーズ内容期間次に進む条件
F0 構築cloudflared 導入・Tunnel・Routes・ポリシー作成(社員影響なし)1週Tunnel が Healthy、Routes に 10.0.1.0/24tunnel info で2台表示
F1 パイロット情シス2〜3名で実利用1週warp-cli status = Connected、curl -vk https://10.0.1.10 が応答、Gateway ログに Allow が記録される
F2 全社展開全50名に配布・Google Workspace SSO でデバイス登録Client VPN は稼働させたまま2〜3週Network logs で 10.0.1.0/24 宛セッションが増加、Client VPN の接続ログで利用者が減少
F3 VPN停止判断Client VPN の同時接続数が2週間連続でゼロまず Association(関連付け)だけ解除し、エンドポイントは削除せず1ヶ月保持 ← ★ロールバック余地
F4 完全移行Client VPN エンドポイント削除※ Client VPN は関連付け解除で課金が停止します

ロールバック手順

事象対処所要
特定社員だけ繋がらないClient VPN で暫定復旧させ、Insights > Logs で原因調査即時
Split Tunnel 設定ミスで全社インターネット断Team & Resources > Devices > Device profiles >(該当)> Split Tunnels で変更を戻す5分
ポリシーで全社アプリ断Traffic policies > Firewall policies > Network で該当ポリシーを Disable トグルでOFF1分
Tunnel 障害全社員に Client VPN 利用を指示(F3前なら即復旧)即時
完全撤退cloudflared tunnel route ip delete 10.0.1.0/24systemctl stop cloudflared → 社員に Client VPN 復帰指示10分
ロールバックの前提 F3 で Client VPN を削除してしまうと、この表の「即時復旧」が使えなくなります。最低1ヶ月は Client VPN エンドポイントを保持してください。

第1部の完了チェックリスト

Step 0 事前準備

Step 2-A 先行実施(DNS移管を待たない)

Step 1 ① DNS移管

Step 6 ⑥⑦⑧

Step 2-B ② DMARC Management

Step 7 Zero Trust基盤

Step 3 ③ Gateway DNS フィルタ

Step 4 / Step 5 / Step 8

第2部 運用計画書

構築が終わった瞬間から始まる、日々の運用・監視・インシデント対応・法令対応。

12この構成の運用を規定する「3つの制約」と体制

構築が終わった瞬間から、運用設計はこの3つに支配される 1 ログ保持 24時間 Gateway DNS/Network/HTTP, Access 帰結 日次バッチでは取りこぼす 6時間ごとの退避が必須 (2時間オーバーラップ付き) 2 シート上限 50 認証で消費、手動削除まで解放されない 帰結 50名企業ではバッファがゼロ 退職者が居座ると51人目が入れない 「必ず起きる問題」として設計する 3 Webhook が使えない Pro以上のゾーンが1つ以上必要 帰結 Slack 直結は Free では不可 回避策: 1ゾーンのみ Pro 化 ≈ $20/月 最も費用対効果が高い有償化 4 Free にテクニカルサポートは付かない サポートは Community forums のみ。インシデント対応で 「Cloudflare に問い合わせる」という選択肢が存在しない 前提で全フローを設計する 5 Free に稼働率保証(SLA)が一切ない Cloudflare の障害で業務が何時間止まっても 契約上の救済(返金・クレジット)はゼロ 受託開発企業として顧客に説明責任を負う際の重大な事実
図18: Free プランの5つの構造的制約。運用設計はこれを前提に組む

運用体制

役割担当主な責務
統括責任者管理部門長モニタリングの責任者、break-glass の発動判断、経営報告、規程の維持
インフラ管理者(主)1名(Super Administrator)設計変更、インシデントコマンダー、月次のバージョン管理、四半期のポリシー棚卸し
インフラ管理者(副)1〜2名(Administrator)日次のログ退避確認、週次レビュー、月次シート棚卸し
開発リーダー2〜3名(Zero Trust Read Only + Domain DNS)障害切り分けのログ閲覧、担当ドメインのDNS変更
一次受付情シス社内 Slack #it-helpdeskCloudflare 非依存の経路(携帯電話番号リスト)を印刷保管
重大度定義指揮
Sev1全社業務停止インフラ管理者(主)が Incident Commander。30分で解決しない場合、必ず管理部門長へエスカレーション
Sev2一部部門停止/セキュリティ侵害の疑い同上
Sev3個別ユーザーの問題インフラ管理者(副)

13運用 — シート管理(最も高い運用リスク)

シートのライフサイクル — Revoke と Remove を絶対に混同しない 未使用シート 50枠のうちの1つ 認証イベント Access ログイン、または WARP デバイスが接続した時点 シート消費(1ユーザー=1シート) PC + スマホでも1シート 手動削除まで解放されない Revoke sessions Users → Action > Revoke > Revoke sessions 全 Access トークンを失効し再認証を要求 ✕ シートは解放されない Remove users Users → Action > Remove users > Remove シート解放 + そのユーザーの全デバイス登録を削除 ✓ シートが解放される 51人目が来ると ログインがブロックされる エラーは「認証失敗」に見え 原因特定に時間がかかる 🔴 退職者オフボーディングの鉄則 — 順序を守らないと全部無駄になる ① Google Workspace を停止 ② Revoke sessions ③ デバイス登録を Delete ④ Remove(シート解放)
図19: シートのライフサイクルと、Revoke / Remove の決定的な違い
50名企業でシート上限50 — バッファがゼロです 退職者1名がシートを持ったまま、業務委託者が1名テストログインしただけで、新入社員が初日にログインできません。これは「いつか起きる」ではなく 「必ず起きる」問題として設計してください。

また公式は「デバイス登録を Revoke しても、ユーザーまたはサービストークンが再認証に成功すれば新しいデバイス登録が自動生成される」と警告しています。「IdP を止める」が最初の手順である理由がこれです。

自動シート回収の有効化(必ず設定する)

パス:Zero Trust > Settings > Admin controls > Remove inactive users from seats

設定値は 1ヶ月〜1年で指定可能 → 推奨は 2〜6ヶ月(産休・育休・長期出張を考慮)。認証イベントと全デバイスの Last seen を毎日チェックし、指定期間非アクティブなユーザーのシートを自動解放します。

Free での利用可否はドキュメントに明記がありません。設定画面で実機確認してください。使えるなら上限逼迫リスクを大幅に下げる最重要設定です。ただしこれは保険です。退職者は退職当日に手動 Remove するのが原則。

月次シート棚卸し

実施日:毎月第1営業日 / 所要:30分 / 担当:インフラ管理者(副)/ 承認:管理部門長

残枠アクション
10以上通常運用
5〜9管理部門長へ報告。採用計画と突合
5未満🔴 即エスカレーション。Zero Trust Standard($7/user/月)への移行を経営会議に上申

退職者オフボーディング(退職日当日・所要45分)

🔴 最重要:Google Workspace のアカウントを停止しただけでは、Cloudflare のアクセスは切れません Cloudflare は認証時に取得した ID を JWT に載せ、以降はセッション有効期間中それを信頼します。Google Workspace は SCIM 非対応のため、アカウント停止イベントが Cloudflare に通知される経路がありません。さらに Cloudflare One Client のセッションは既定で無制限です。

つまり check_session を設定していない場合、退職者の WARP は理論上いつまでも社内システムに繋がり続けます。手順2〜4(Revoke → デバイス削除 → Remove)を必ず同日に実施してください。
#対象手順確認方法
1Google Workspace(最優先)Google Admin Console でアカウント停止・全セッション強制ログアウトログイン試行で拒否されること。ただしこれだけでは Cloudflare は切れない
2Access セッションUsers → 対象 → Action > Revoke > Revoke sessions保護アプリに再アクセスして認証要求が出ること
3デバイス登録Devices → 対象 → View details → Delete(Revoke ではない)一覧から消えること
4🔴 シートUsers → Action > Remove users > Remove消費シート数が1減ること
5WARP クライアント返却端末からアンインストール。再配布端末は初期化を原則とするwarp-cli status が動作しないこと
6Cloudflareアカウントダッシュボードのメンバーなら削除Manage Account > Members から消えること
7API トークンユーザートークンは本人アカウント削除で失効。アカウントトークンは別途確認・失効用途不明トークンがないこと
8レジストラ/AWS/GitHub管理権限を剥奪管理者一覧から消えること
9共有シークレット本人が知り得た共有パスワード・Tunnel トークン・サービストークンをローテーション新値で疎通すること
10監査証跡Manage Account > Audit Logs で退職前30日の操作を確認・保存(Download CSV)異常操作がないこと
11記録チェックリストに実施者・確認者・日時を記入し保管個人情報保護法の安全管理措置の証跡

予防設定(在職中)Lock WARP switch(ユーザーによるON/OFF禁止)、Allow device to leave organization を無効(勝手な組織離脱を禁止)、Auto connect を設定。

🔴 check_session の設定が「準リアルタイム失効」の唯一の手段です Gateway の Allow ポリシーに Enforce Cloudflare One Client session duration = 24h0m0s を設定しておけば、最大24時間で必ず再認証が走り、Google 側で停止済みのユーザーは自動的に締め出されます。手動オフボーディングが漏れた場合の最後の砦であり、50名・Free 環境では必須設定です(第1部 第10章)。

ユーザー自身のログアウト URLhttps://synon.cloudflareaccess.com/cdn-cgi/access/logout → 発行済みトークンは 20〜30秒で受け付けられなくなります。
管理者による Revoke の反映:Revoke 実行後、対象ユーザーは最大1分間は再ログインできません(公式明記)。

14運用 — ログの外部退避

24時間しか残らないログを、どう永続化するか 6時間ごとに直近8時間分を取得(2時間オーバーラップ) 0:00 6:00 12:00 18:00 24:00 取得ウィンドウ 8h Cloudflare API 監査ログ REST v2(18ヶ月) Access ログ REST(24h) GraphQL Analytics(集計) EC2 の cron 0 */6 * * * Python スクリプト gzip JSONL に整形 S3 Object Lock(Compliance) 1年以上の改ざん防止 月次で Glacier IR へ移行 失敗検知(必須) cron の exit code を CloudWatch Alarm / SNS へ 静かに失敗すると証跡が永久に消える 🔴 正直に記載すべき限界 Gateway の「生ログ(1行1リクエスト)」を Free で公式APIから取得する方法は存在しません。取得できるのは GraphQL の集計データ(*AdaptiveGroups)のみ。 「誰がいつどのドメインにアクセスしたか」の完全な証跡を長期保存したい場合、Free では技術的に不可能。Standard($7/user/月)以上への移行が必要 — 経営に正直に上申すべき事項。
図20: ログ退避のアーキテクチャと、Free での技術的限界
ログ種別FreeStandardEnterprise
Admin logs(アカウント監査)18ヶ月18ヶ月18ヶ月
Access logs(認証)🔴 24時間30日180日
DNS logs(Gateway DNS)🔴 24時間30日180日
Network logs / HTTP logs🔴 24時間30日30日
DEX logs7日7日7日
Device posture logs30日30日30日
Cloudflare ネイティブのログ外部転送は一切使えません Logpush(ゾーンHTTPログ)も Zero Trust Logpush も Enterprise のみ。Logpull も Enterprise。自前でAPIをポーリングして退避する以外に手段がありません。

必要なAPIトークンのスコープ

権限(ダッシュボード表記)スコープ用途
Account Settings → ReadAccountアカウント監査ログ v2
Access: Audit Logs → ReadAccountAccess 認証ログ
Account Analytics → ReadAccountGraphQL(Access/Gateway 集計)
Zone Analytics → ReadZone(当該ゾーンのみ)GraphQL(ゾーンHTTP)
Zero Trust → ReadAccount設定・ユーザー一覧の棚卸し
🔴 Zero Trust: PII → ReadAccountログ中のメール/デバイスID/送信元IPの表示に必要。このトークンにのみ付与し、人間のロールには付けない

退避スクリプト(EC2 cron 想定・動作する形)

#!/usr/bin/env python3
# /opt/cf-export/export.py    cron: 0 */6 * * * /usr/bin/python3 /opt/cf-export/export.py
import os, sys, json, gzip, time, pathlib, datetime as dt
import urllib.request, urllib.error

API   = "https://api.cloudflare.com/client/v4"
TOKEN = os.environ["CF_API_TOKEN"]
ACCT  = os.environ["CF_ACCOUNT_ID"]
ZONE  = os.environ["CF_ZONE_ID"]
OUT   = pathlib.Path(os.environ.get("CF_EXPORT_DIR", "/var/log/cf-export"))

WINDOW_HOURS = 8   # 保持24hのため8時間分(cron 6時間毎=2時間オーバーラップ)
now   = dt.datetime.now(dt.timezone.utc).replace(microsecond=0)
start = now - dt.timedelta(hours=WINDOW_HOURS)
ISO   = lambda d: d.strftime("%Y-%m-%dT%H:%M:%SZ")


def _req(url, method="GET", body=None):
    req = urllib.request.Request(url, method=method)
    req.add_header("Authorization", f"Bearer {TOKEN}")
    req.add_header("Content-Type", "application/json")
    data = json.dumps(body).encode() if body is not None else None
    for attempt in range(5):                        # 429/5xx は指数バックオフ
        try:
            with urllib.request.urlopen(req, data, timeout=60) as r:
                return json.loads(r.read())
        except urllib.error.HTTPError as e:
            if e.code in (429, 500, 502, 503, 504) and attempt < 4:
                time.sleep(2 ** attempt * 5); continue
            sys.stderr.write(f"[ERROR] {url} -> {e.code} {e.read()[:500]}\n")
            raise
    raise RuntimeError("unreachable")


def write(name, records):
    """日付階層で gzip JSONL 保存。S3側で Object Lock + ライフサイクルを掛ける前提。"""
    d = OUT / now.strftime("%Y/%m/%d")
    d.mkdir(parents=True, exist_ok=True)
    path = d / f"{name}_{now.strftime('%H%M%SZ')}.jsonl.gz"
    with gzip.open(path, "wt", encoding="utf-8") as f:
        for rec in records:
            f.write(json.dumps(rec, ensure_ascii=False) + "\n")
    print(f"[OK] {path} ({len(records)} records)")
    return path


def account_audit_logs():
    """アカウント監査ログ v2(保持18ヶ月 / 権限: Account Settings Read)"""
    recs, page = [], 1
    while True:
        url = (f"{API}/accounts/{ACCT}/logs/audit"
               f"?since={ISO(start)}&before={ISO(now)}&per_page=1000&page={page}")
        batch = _req(url).get("result") or []
        recs += batch
        if len(batch) < 1000:
            break
        page += 1
    return recs


def access_audit_logs():
    """Access 認証ログ(保持24h / 権限: Access: Audit Logs Read)"""
    url = (f"{API}/accounts/{ACCT}/access/logs/access_requests"
           f"?since={ISO(start)}&until={ISO(now)}&direction=desc&limit=1000")
    return _req(url).get("result") or []


def graphql(query, variables):
    res = _req(f"{API}/graphql", "POST", {"query": query, "variables": variables})
    if res.get("errors"):
        sys.stderr.write(f"[GraphQL ERROR] {json.dumps(res['errors'], ensure_ascii=False)}\n")
    return res.get("data") or {}


Q_GATEWAY_DNS = """
query($acct:string!,$s:Time!,$e:Time!){ viewer{ accounts(filter:{accountTag:$acct}){
  gatewayResolverQueriesAdaptiveGroups(limit:10000,
    filter:{datetime_geq:$s, datetime_leq:$e}, orderBy:[count_DESC]){
    count dimensions{ queryNameReversed resolverDecision datetimeHour }
}}}}"""


def main():
    OUT.mkdir(parents=True, exist_ok=True)
    failures = []

    for name, fn in [("account_audit", account_audit_logs),
                     ("access_audit",  access_audit_logs)]:
        try:
            write(name, fn())
        except Exception as ex:
            failures.append(f"{name}: {ex}")

    try:
        d = graphql(Q_GATEWAY_DNS, {"acct": ACCT, "s": ISO(start), "e": ISO(now)})
        write("gateway_dns", d["viewer"]["accounts"][0]["gatewayResolverQueriesAdaptiveGroups"])
    except Exception as ex:
        failures.append(f"gateway_dns: {ex}")

    if failures:
        # 🔴 保持24時間のため、静かに失敗すると証跡が永久に消える。必ず気づける形にする。
        sys.stderr.write("[FAILED] " + " | ".join(failures) + "\n")
        sys.exit(1)


if __name__ == "__main__":
    main()
運用上の注意 ・GraphQL のレート制限は 5分間に300クエリ。上記構成では十分余裕あり
・S3 側は Object Lock(Compliance モード、1年以上)を推奨。ログ改ざん耐性が監査対応の価値を決めます
・公式FAQに「Free プランのドメインではメトリクスが24時間遅延する」旨の記載があります。実際の遅延は導入時に実測し、遅延がある場合は取得ウィンドウを後ろにずらしてください
・導入初日に GraphQL の settings introspection クエリで notOlderThan / maxDuration を実測し、Gateway データセットが Free でクエリ可能かを確認してください

15運用 — 監視とアラート

通知の配信経路(Free の壁)

配信先必要条件本構成
メール全プラン
Webhook(Slack / Teams)🔴 アカウント内に Pro 以上のゾーンが最低1つ
PagerDutyProfessional / Business 以上
内容コスト遅延
1Cloudflare → 専用アドレス(cf-alert@synon.co.jp)→ Google Workspace のフィルタ + Slack のメール連携¥0数分
2上記メールを Gmail API / IMAP でポーリングする小スクリプトを EC2 に置き、Slack Incoming Webhook へ転送¥01分以内
3🔵 ゾーンを1つだけ Pro にアップグレードアカウント全体で Webhook が解禁され Slack 直結約$20/月即時
推奨 まず案1で運用開始し、四半期レビューで案3を経営に上申。案3は Webhook 解禁 + WAF 強化 + 画像最適化がまとめて付いてくるため、この構成で最も費用対効果が高い有償化です。

Free で設定できるアラート

パス:Notifications → Add → 種別選択 → 宛先入力 → Create

通知本構成推奨設定
Tunnel Health Alert最優先Healthy / Inactive / Down / Degraded の状態変化で発報。全 Tunnel を対象に
Cloudflare Status - Incident Alerts必須。Cloudflare 自体の障害検知
Cloudflare Status - Maintenance計画メンテ把握
Universal SSL Alert証明書の検証・発行・更新・失効
HTTP DDoS Attack AlertFree でも発報(目安 100 rps 超)
Security Insights設定不備(ダングリングDNS、MFA未設定、未保護Tunnel)を検知
DEX - Device connectivity anomalyWARP 接続異常の面的検知
DEX - Test latency社内システム宛の遅延
DEX - Test low availability実質的な「繋がらない」の自動検知。SLO 98.0
Expiring Access Service Tokenカレンダー手動管理で代替
Origin Error Rate / Traffic Anomalies(5xxスパイク)❌ EnterpriseGraphQL httpRequestsAdaptiveGroups を5分毎に取得し、edgeResponseStatus >= 500 の比率で自作
DNSSEC アラート通知種別がそもそも存在しない。月次手動確認で代替

認証異常の検知(自作が必須)

Access の不審ログインを通知する Cloudflare ネイティブのアラートは Free にはありません。退避スクリプトを拡張して自前で検知します。

ルールしきい値深刻度
同一ユーザーの認証失敗連続10分で5回以上
国外IPからの認証成功日本以外(出張申請と突合)
深夜帯(00:00–05:00 JST)の認証成功1件でも
不可能移動(1時間以内に2カ国以上から成功)
新規デバイス登録1件でも(人事の入社情報と突合)
🔴 break-glass 以外での One-time PIN ログイン1件でも
Google Workspace SSO に移行したことで、検知の主戦場は Google 側にも広がります Google Admin Console のセキュリティ アラート(不審なログイン、パスワード漏洩の疑い、2SV の無効化など)を、Cloudflare 側の検知と同じ窓口(cf-alert@synon.co.jp 等)に集約してください。IdP を Google に寄せた以上、Google アカウントの侵害=社内システムの侵害です。
Cloudflare 依存にしない外形監視は必須です Cloudflare の通知は、Cloudflare が落ちると届かない可能性があります。独立した監視系を1つ必ず持ってください。
UptimeRobot 無料枠(50モニタ / 5分間隔)等で、公開URLを外部から監視 → Slack / メール通知
https://www.cloudflarestatus.com/api/v2/status.json を EC2 から5分ごとにポーリングし、status.indicator != "none" で通知

16運用 — インシデント対応 / break-glass

(a)「社内システムに繋がらない」— 切り分けフロー(上から順に・所要10分) 申告 / DEX アラート / Tunnel Health ① Cloudflare 全体障害か?(最優先) curl -s https://www.cloudflarestatus.com/api/v2/status.json | jq '.status' Yes → 自社に復旧手段なし 60分以上なら break-glass 判断へ ② Tunnel(EC2 上で実行) systemctl status cloudflared / cloudflared tunnel info / metrics 停止 → systemctl restart(1分) コネクション数0 → SG/NACL を確認 ③ オリジン単体(Cloudflare を迂回) curl -sv https://localhost/healthz / ss -tlnp | grep 443 応答なし → アプリ再起動 Cloudflare は無関係 ④ 端末の WARP warp-cli status / warp-cli settings / warp-diag 1名のみ → 再接続→再起動→再登録 全社同時 → Split Tunnel 設定ミスを疑う ⑤ Gateway ポリシーの誤爆 Insights > Logs > Gateway を Policy 名でフィルタ 該当ポリシーを Disable(2分) Audit Logs で誤設定の犯人を特定 エスカレーション 30分未復旧 → 管理部門長 60分未復旧 → break-glass 判断 🔴 前提 Free に Cloudflare の技術 サポートは付かない 最有効な特定手段 Manage Account > Audit Logs (直近90日の設定変更) 障害の多くは「誰かが直前に 何かを変えた」ことが原因 障害中は設定を触らない 事後の切り分けが不可能になる
図21: 最頻インシデントの切り分けフロー。上から順に実行し、①で確定したら以下は無意味

(b) 不審なログイン(Google アカウント侵害)【Sev2】

検知:自作アラート(第15章)/ Google Admin Console のセキュリティ アラート / 本人からの「身に覚えのないログイン通知」

一次対応(15分以内・順序厳守)

  1. Google Admin Console でアカウント即時停止+全セッション強制ログアウト(これが最優先)
  2. Users → 対象 → Action > Revoke > Revoke sessions ← 🔴 手順1だけでは Cloudflare は切れません
  3. Devices → 身に覚えのないデバイス登録を Delete
  4. Manage Account > Audit Logs → 当該期間にダッシュボード操作がないか確認(あれば管理者権限侵害 = Sev1 に格上げ
  5. Manage Account > API Tokens → 不審な新規トークンがないか確認、あれば即削除
  6. 退避済みログから当該ユーザーの直近アクセス先を洗い出し、情報持ち出しの有無を評価
  7. Google 側の証跡も確保(Admin Console > レポート > 監査と調査 > ログインログ)。Cloudflare のログは Free で24時間しか残らないため、Google 側のログのほうが長く残ります

復旧:Google パスワードリセット + 2SV の再登録(セキュリティキー必須化)→ 端末のマルウェアスキャン → アカウント再有効化 → Cloudflare 側で再認証させてグループが正しく載ることを確認

エスカレーション:管理部門長 → 顧客データへのアクセス痕跡があれば即・経営会議(受託開発では顧客への報告義務が契約上生じる可能性が高い)

事後check_session の設定値が妥当か再評価。個人データ漏えいの疑いがあれば第18章の法令フローへ

(c) マルウェア感染端末の検知【Sev2】

Free ではこれを自動通知する術がありません 退避スクリプトに「Security カテゴリの Block を検知したらメール」を実装するか、日次でGatewayログを目視確認する運用にしてください。
  1. Gateway ログで Device ID / User email / 宛先ドメイン / 発生時刻・頻度を特定(PII表示には Zero Trust: PII Read が必要)
  2. 単発か継続かを判定(継続的なビーコン通信は感染確定に近い
  3. 同一宛先に他の端末も通信していないか(横展開の確認)
  4. 該当端末をネットワークから物理的に隔離(有線抜線・Wi-Fi切断)。🔴 電源は落とさない(メモリ上の証跡が消えるため)
  5. 利用者からヒアリング → セッションを Revoke → EDR / ウイルス対策でフルスキャン
  6. 駆除が確認できても、業務端末は原則クリーンインストール。当該ユーザーの全パスワード・トークンをリセット

(d) Cloudflare 自体の障害【Sev1・自社で復旧不能】

日付継続時間原因影響
2025年11月18日11:20 UTC 開始、14:30 UTC 主要復旧、17:06 UTC 全面復旧(約6時間)DBの権限変更 → Bot Management の feature file が重複で肥大化 → プロキシの200機能上限を超過して panic大半のトラフィックが 5xx。🔴 Access の認証が広範囲に失敗Turnstile 障害でダッシュボードにログインできない時間帯あり。Workers KV、Email Security も影響
2025年12月5日08:47–09:12 UTC(約25分WAF の内部テストツール無効化の設定変更が FL1 プロキシの Lua バグを誘発HTTP トラフィックの約28%が 500 エラー
2025年11月の事象が示した3つの教訓 1. Access が落ちれば、Tunnel が健全でも社内システムに入れない
2. ダッシュボードにログインできないため、管理者は緊急の設定変更すらできない
3. Free にはサポート窓口がないため、できることは「復旧を待つ」だけ
# 自社起因か Cloudflare 起因かを2分で判定
curl -s https://www.cloudflarestatus.com/api/v2/status.json | jq '.status, .page.updated_at'
curl -sv --resolve app.synon.co.jp:443:<オリジンIP> https://app.synon.co.jp/healthz
# オリジンが正常応答するのに Cloudflare 経由が 5xx なら Cloudflare 起因確定

(f) break-glass(Cloudflare 障害時の代替経路)

「Cloudflare が落ちたら社内システムに入れない」— 事前に解決していなければ6時間止まる 案A(推奨) SSM Session Manager + ポートフォワード IAM + MFA で保護 インバウンドポート不要 踏み台のパブリックIPも不要 コスト ¥0 / 平時リスク 低 案B 緊急用の別FQDN 別レジストラ / Route 53 で管理 平時はレコードを作らない ALB で 送信元IP制限 + Basic認証 + mTLS ALB 約$20/月 / 平時リスク 中 案C Client VPN を緊急時のみ起動 既存資産をそのまま活用 起動時のみ課金 移行完了後も1ヶ月は保持 起動時課金 / 平時リスク 低 案D ✕ 非推奨 DNS をグレー雲に切替 オリジンIPが世界に露出し 以後DDoSの直撃を受ける 障害がコントロールプレーンに 及んでいれば変更操作すら不可 break-glass 手順(案A + B のハイブリッド) ① 発動条件 CF起因確定 かつ 60分以上 判断者は管理部門長(単独判断不可) ② 認証情報の取り出し 封緘した封筒で物理金庫 PWマネージャがCF依存だと詰む ③ 経路の有効化・周知 CFを経由しない経路で通知 Slack / 電話連絡網 ④ 監視強化 緊急経路のアクセスログを 全件記録・リアルタイム監視 ⑤ 復旧後15分以内に閉鎖 DNS削除 / ALB停止 / SG戻し 閉じ忘れ = 恒久バックドア break-glass 自体のリスク(必ず経営に説明する) ・緊急経路は Zero Trust の保護外(Gateway のフィルタも Access の認証も効かない) 四半期の訓練で「閉じる」までを必ず演習する / 緊急用認証情報の管理不備は、それ自体が最大の脆弱性
図22: break-glass の選択肢と手順。「閉じる」までを含めて設計・演習する

(e) DDoS 攻撃【Sev2】

  1. Unmetered DDoS Protection は Free でも有効。L3/L4 は基本的に自動緩和される
  2. Under Attack Mode を有効化 —— Free で使える最強の緊急手段(ゾーン Overview > Quick Actions)
  3. Rate Limiting Rule(1本)で該当パスを保護
  4. 全レコードが Proxied(オレンジ雲)であることを確認 —— グレー雲だとオリジンIPが露出し、Cloudflare を迂回して直撃される
  5. オリジンの SG でインバウンド443を Cloudflare の公開IPレンジのみに制限(未実施なら平時に必ず設定)

17運用 — 定常運用カレンダー

約20分
日次(1日あたり)
約60分
週次(毎週月曜)
約3時間
月次(第1営業日)
約5時間
四半期
約7時間
年次
運用カレンダー — 総工数の目安:月あたり約7〜9時間 + 四半期5時間 + 年次7時間(インフラ管理者2〜3名で分担) 日次 20分 🔴 ログ退避ジョブの   成功確認 失敗の翌日発見では手遅れ Gateway セキュリティ Block 確認(C2/Malware) Tunnel 稼働確認 通知メールのトリアージ 外部監視の状態確認 担当: インフラ管理者(副) 週次 60分 Security Center / Security Insights レビュー ダングリングDNS が最優先 DMARC レポート確認 なりすまし + 正規なのに落ちる送信元 Access ログイン異常 国外IP / 深夜帯 / 失敗連続 アカウント監査ログ確認 退避データの完全性確認 毎週月曜 月次 3時間 🔴 シート棚卸し(10項目) 残枠5未満なら即エスカレーション 🔴 認証ログのレビュー break-glass 以外の OTP ログイン One Client バージョン確認 cloudflared バージョン確認 業務時間外に1台ずつ API/サービストークン期限 DNSSEC / SSL証明書の目視 退避ログの保管状況 / 月次報告 第1営業日 四半期 5時間 Access / Gateway ポリシー棚卸し 🔴 break-glass 演習(60分) 「閉じる」までを必ず演習 🔴 break-glass アカウントの   OTP ログイン実地テスト 未使用だと壊れていても気づけない Google グループの棚卸し 在籍者名簿との突合・ネスト混入 API トークンのローテーション メンバー/ロール棚卸し PII 閲覧記録 / プラン妥当性 年次 7時間 🔴 委託先(Cloudflare)の   年次評価 越境移転の相当措置の確認 🔴 Google OAuth   シークレット更新 無停止でローテーション可 🔴 GCP 自動削除通知の   宛先確認 6ヶ月未使用で消える 同意画面が Internal か 規程の見直し / 教育 可用性の経営レビュー
図23: 定常運用カレンダー。赤で示したものは飛ばすと直接的な事故につながる項目

18運用 — 法令・社内規程(日本)

本章は法的助言ではありません 規程改定・従業員への周知の適法性、特に労働法上の取扱いについては、社会保険労務士および弁護士への確認を必ず経てください。

従業員の通信ログ取得(個人情報保護委員会 Q5-7 の5要件)

#留意点具体化
1目的をあらかじめ特定し、社内規程等に定め、従業者に明示就業規則または情報セキュリティ規程に条項を新設し、目的を「マルウェア感染・情報漏えいの防止、および不正アクセスの検知」と明記
2責任者及びその権限を定める責任者=管理部門長、実施者=インフラ管理者(主)、閲覧権限は Zero Trust: PII Read 保有者に限定
3実施ルールを策定し運用者に周知平常時は個人単位のログを閲覧しない。インシデント検知時または本人同意時にのみ、責任者の承認を得て閲覧する
4適正に行われているか確認四半期に一度、PII閲覧の実施記録を管理部門長がレビュー(運用カレンダーに組込済み)
5労働組合等への事前通知・協議と従業者への周知労組がなければ従業員代表への説明と全社説明会(年次教育)
導入前に周知すること 事後の周知は「秘密裏の監視」と受け取られ、労務トラブルの温床になります。
また規程には「取得しない情報」も明記すると信頼を得やすくなります。例:「Gateway は HTTP のボディを記録しない」——これは公式ドキュメントで裏付けのある事実です(エラー時のみ先頭512バイトを30日間保持する例外あり)。
BYOD 端末に WARP を入れる場合はさらに慎重に。私的通信のログが取得されるため、書面での個別同意を推奨します。

個人情報保護法:越境移転が最大の論点

「クラウド例外」は使えるか → 原則として使えないと考えるべき 従業者の個人データ メールアドレス / デバイスID 送信元IP / アクセス先 / 認証記録 Cloudflare, Inc.(米国法人) 米国および欧州のデータセンター 米国は「認定国」ではない 法第28条(外国にある第三者への提供) Gateway は通信内容を検査しポリシー判定を行い、 Cloudflare 自身が PII を含むログを生成・保存する →「取り扱わない」とは言えない A. 基準適合体制(推奨・主軸にする) Cloudflare の DPA に依拠。Cloudflare は公式に「DPA は APPI に基づく 越境移転を正当化する標準と同等」と明言 → 年1回の確認と記録が法令上必要 B. 本人(従業員)の同意 移転先国名・当該国の制度・講じる措置を情報提供した上で同意取得 雇用関係下の同意は任意性に疑義 → Aの補完として位置付ける 外的環境の把握と公表(Q10-25)— 見落としやすい必須対応 クラウド事業者が所在する外国の名称、および個人データが保存されるサーバが所在する外国の名称 ② 外国の制度を把握した上で講じた安全管理措置の内容 ③ 所在国が特定できない場合は、その旨・理由・本人に参考となる情報 → 本人の知り得る状態に置く
図24: 越境移転の論点整理。「クラウド例外」は本構成では使えないと考えるべき
要確認事項 — 経営判断が必要になる可能性があります Cloudflare の APPI ページは Enterprise Service Agreement と Self-Serve Subscription Agreement への適用に言及していますが、Free プラン利用者に DPA が当然に適用されるかは明記されていません。

Cloudflare のアカウント設定から DPA への同意(accept)操作が可能かを確認し、その記録を保管してください。これができない場合、法第28条の根拠が弱くなり、有償プランへの移行が法令対応上の理由で必要になる可能性があります。

規程/プライバシーポリシーへの記載例

当社は、社内システムへのアクセス制御およびセキュリティ監視のため、米国法人 Cloudflare, Inc. の提供するサービスを利用しています。これに伴い、従業者の通信メタデータ(アクセス先、送信元IPアドレス、端末識別子、認証記録等)が米国および欧州の同社データセンターにおいて処理・保存されます。当社は、米国の個人情報保護制度を把握した上で、同社との間でデータ処理契約(DPA)を締結し、相当措置の継続的な実施を年1回確認しています。

※ Cloudflare は「メタデータは米国およびEUのデータセンターに保存され得る」旨を公表しています。「保存国が完全には特定できない」ケースに該当し得るため、上記③の書き方を併用するのが安全です。

漏えい等発生時の報告義務

報告期限
速報(個人情報保護委員会)発覚から概ね3〜5日以内
確報(個人情報保護委員会)発覚から30日以内。ただし不正の目的をもって行われたおそれがある漏えい等(=不正アクセス・サイバー攻撃)は60日以内
本人への通知速やかに
受託開発企業では②③が現実的に該当しやすい 報告対象の4類型は ①要配慮個人情報を含む ②財産的被害のおそれ ③不正の目的をもって行われた漏えい等1,000人超
顧客の預かりデータ、標的型攻撃という性質上、1,000人未満でも③に当たれば報告義務が生じます。

情報セキュリティ基本方針への反映

規程はゼロから書かないでください IPA「中小企業の情報セキュリティ対策ガイドライン」第4.0版(2026年3月27日公開・最新)が50名規模の受託開発企業に最も適合します。付録2「情報セキュリティ基本方針サンプル」、付録5「情報セキュリティ関連規程サンプル」(59頁)、付録7「クラウドサービス安全利用の手引き」、付録8「インシデント対応マニュアル」がそのまま雛形として使えます。
経営層への説明には 経済産業省/IPA「サイバーセキュリティ経営ガイドライン Ver3.0」を使用。特に指示4(計画的な対応)、指示7(インシデント対応体制)、指示9(サプライチェーン対策)が本計画書に直結します。
#規程に盛り込むべき項目本書での対応箇所
1クラウドサービス利用方針(選定・評価・年次見直し)運用カレンダー年次 / 越境移転
2越境移転の取扱い(米国での処理、DPA、年1回の確認)本章
3外的環境の把握と公表(所在国名の開示)本章
4通信モニタリング条項(目的・責任者・閲覧ルール・周知)本章 / Step 3
5アクセス権限管理(最小権限、2FA必須、四半期棚卸し)Step 0 / 運用カレンダー
6入退社時の手続(オフボーディングチェックリストの規程化)シート管理
7ログの取得・保管方針(保管期間1年以上、改ざん防止、閲覧手続)ログの外部退避
8インシデント対応体制(重大度定義、連絡体制、報告義務)インシデント対応
9緊急時の例外措置(break-glass)(発動条件・承認者・記録・閉鎖義務break-glass
10可用性に関する方針(SLAなしの認識、顧客契約との整合、年次経営レビュー)SLA・SPOF
11委託先管理(Cloudflare / AWS 等の年次評価と記録)運用カレンダー年次
12教育(年次のセキュリティ教育とモニタリング周知)運用カレンダー年次
受託開発企業に固有の追加論点 顧客との業務委託契約・NDA に「再委託先」条項がある場合、Cloudflare が実質的な再委託先(またはデータの取扱いを伴う外部サービス)に当たらないか、契約ごとに確認が必要です。顧客によっては事前承諾国内保管の要求があり得ます。法務・営業と連携し、顧客別の制約一覧を作成することを強く推奨します。

19運用 — SLA・SPOF・投資判断

SLA の正確な事実

プランUptime SLAサービスクレジットサポート
Free🔴 なし(None)🔴 なし🔴 Community forums のみ
Pro🔴 なしなしチケット
Business100% Uptime1x優先チケット
Enterprise100% Uptime10x / 25x専任
正確な表現 Free プランには稼働率保証(SLA)が一切ありません。Cloudflare の障害で自社の業務が何時間止まっても、契約上の救済(返金・クレジット)はゼロであり、技術サポートに問い合わせる権利もありません。

これは「安いから多少は仕方ない」ではなく、受託開発企業として顧客に説明責任を負う際の重大な事実です。契約上、顧客システムの可用性にコミットしている場合、Free プランへの依存は契約違反リスクになり得ます。
単一障害点(SPOF)と、価格帯別の緩和策 深刻度 極大 / 大 ① Cloudflare グローバルネットワーク 全社が利用不可 実績あり ② Cloudflare Access(認証基盤) Tunnel 健全でも不可 実績あり ③ cloudflared コネクタ(単一) 当該経路が全断 ¥0 で解消可 ④ EC2(オリジン、単一AZ) システム停止 AWS費用 ⑤ Zero Trust シート枯渇(50上限) 新規ユーザー不可 運用で解消可 ⑥ IdP(Google Workspace) 新規ログイン不可 break-glass ⑦ ログ退避 ⑧ ダッシュボード ⑨ 属人化 ⑩ レジストラ 深刻度 中〜低 推奨する実行順序 1 break-glass 経路の整備(SSM 案A) ¥0 解消: ①②⑧ — Cloudflare障害時の唯一の解。最優先 2 cloudflared を2レプリカ以上(別AZ) ¥0 解消: ③ — 費用ゼロで最大効果。無停止アップグレードも可能に 3 1ゾーンのみ Pro 化 約$20/月 Webhook / Slack 解禁 + WAF強化 — 最も費用対効果が高い有償化 4 Zero Trust Standard $7/user/月(50名で約$350/月) 解消: ⑤(シート増)+ ログ保持30日 — ログ要件が厳しくなれば必須 5 Business プラン 約$200+/月 100% Uptime SLA + サポート — 顧客に可用性をコミットするなら ¥0 でできる緩和策(すべて実施すべき) ・自動シート回収 + 月次棚卸し ・ログ退避の失敗アラート ・break-glass 整備 ・手順書の文書化・四半期訓練 ・外部監視(UptimeRobot 無料枠)
図25: SPOF 分析と投資優先順位。①②③は ¥0 の施策で大きく緩和できる

20導入初期に必ず実機検証すべき未確定事項

Cloudflare は現在、プラン別の機能対応表を公式ドキュメントに掲載していません。以下は一次情報で確定できなかった項目です。設計を確定する前に実機で確認し、本書に追記してください。
#検証項目方法なぜ重要か
1🔴 Zero Trust Free の50ユーザー上限が現行も有効かサインアップ画面またはサポートで確認50名ちょうどのため死活的
2🔴 Free の IdP 一覧に Google Workspace が表示されるかZero Trust > Integrations > Identity providers > Add new identity providerこれが無ければ認証設計全体が成立しない。最優先で確認
3🔴 Gateway に User Group Names セレクタが出るか/グループ値の実形式ポリシービルダー + get-identity の JSONグループベース制御の前提。name / email / id のどれが埋まっているかを実データで確定する
4🔴 Gateway Allow ポリシーに「Enforce Cloudflare One Client session duration」が設定できるかポリシーの Step 4 - Configure policy settings準リアルタイム失効の唯一の手段。使えなければ退職者対応の設計を見直す必要
5🔴 Cloudflare DPA への同意記録が Free で残せるかアカウント設定を確認越境移転の法的根拠に直結
6デバイス登録ポリシーで Login Methods セレクタが使えるかDevice enrollment permissions のポリシービルダーbreak-glass の OTP 限定設計の前提
7Google のネストグループが Cloudflare に反映されるかテストユーザーを親グループにのみ間接所属させ get-identity を確認公式に記述がない。反映されない前提で直接メンバー運用にするのが安全
8Cloudflare が Google に要求する OAuth スコープの実値管理者認可リンクを開いた際の同意画面URLの scope= を記録公式ドキュメントに記載がない。社内の変更管理記録に必要
9IdP 切替時にシートが再消費されないこと移行前後で消費シート数を実測50シートちょうどのため、誤れば上限到達
10Network ポリシー / デバイスポスチャの各セレクタが Free で選択可能か実機のポリシー作成画面アクセス制御設計の前提
11「Remove inactive users from seats」が Free で使えるかZero Trust > Settings > Admin controlsシート枯渇対策の要
12GraphQL の Gateway データセットが Free で取得できるかsettings introspection クエリログ退避設計の前提
132FA Enforcement の正確な画面パスダッシュボード実機公式ドキュメントに記載なし
14ロール一覧が Free の招待画面で全て選択可能かManage Account > Members > Invite権限設計の前提
15Free ゾーンのアナリティクス遅延の実測値実データで確認公式FAQに「24時間遅延」の記載あり
16Tiered Cache の既定 ON/OFF 状態Caching > Tiered Cache を目視有効化漏れの防止
17Security Center の正確な2026年メニューパス実機新旧ダッシュボード混在のため
18🔴 macOS の System Extension / PPPC の bundle ID・team ID1台で手動インストールして採取公式ドキュメントに記載なし。50台配布の成否を分ける
191dot1 モードでの DEX private IP テストの可否1台で実機検証ドキュメントの直接記述はなく、モード定義からの論理的帰結
20.co.jp レジストラでの DS レコード登録可否指定事業者に確認Cloudflare のドキュメント範囲外
21Cloudflare DMARC Management のデータ保持期間Cloudflare に確認公式に記載なし
22Origin CA 証明書の有効期間の選択肢ダッシュボードで確認更新計画の前提

主要な参照先

Cloudflare 公式

日本語・公的機関

用語集

用語意味
Cloudflare OneZero Trust 製品群の新名称(2026年〜)
Cloudflare One Client旧 WARP client。端末に入れるエージェント。CLI は warp-cli のまま
cloudflaredサーバ側に入れる Tunnel コネクタ
TunnelEC2 からのアウトバウンド接続のみで、インバウンドを開けずに Cloudflare と繋ぐ仕組み
プライベートネットワーク経路公開ホスト名を作らず、WARP 経由でプライベートIPに到達させる方式
Split Tunnelどの通信を WARP に通すか(Include)/通さないか(Exclude)の設定
GatewayDNS / Network / HTTP のフィルタリングエンジン
DEXDigital Experience Monitoring。端末視点での到達性・遅延の合成監視
シート(Seat)Zero Trust のユーザーライセンス単位。認証で消費され、Remove まで解放されない
Origin CACloudflare が発行するオリジン用証明書。プロキシ経由でのみ有効
AOPAuthenticated Origin Pulls。Cloudflare → オリジンの mTLS
RUA / RUFDMARC の集約レポート/失敗レポート
アライメントFrom ドメインと SPF/DKIM が認証したドメインが揃っていること。DMARC 判定の核
IdPIdentity Provider(認証を担うサービス)。本構成では Google Workspace
Admin SDK Directory APICloudflare が Google グループを読み取るために使う API。有効化しないとグループが取れない
Trust internal appsGoogle Admin Console の設定。OFF だとグループ取得だけが静かに失敗する
check_sessionGateway Allow ポリシーに設定する Cloudflare One Client のセッション有効期間。グループ変更の反映と退職者の失効を担保する唯一の手段
get-identityhttps://<team>.cloudflareaccess.com/cdn-cgi/access/get-identityグループ取得の切り分けに最も有効なエンドポイント
SCIMIdP からのユーザー自動provisioning/deprovisioning。Google Workspace は非対応
break-glass緊急時にのみ開ける代替経路。閉じる手順まで含めて設計する