社内システムのクラウド化と セキュリティ確保
Cloudflare 構築手順書 + 運用計画書
フェーズ1(追加費用 ¥0 の8施策)と Zero Trust 接続基盤(WARP + Tunnel)を、画面操作・CLI・設定値レベルまで記載した実務文書
作成日: 2026-08-15
対象: 従業員約50名 / 受託開発 / 大阪1拠点
オリジン: AWS EC2
認証: Google Workspace SSO
プラン: Cloudflare Free + Cloudflare One Free
目次
エグゼクティブサマリ
全体アーキテクチャと脅威モデル
実施順序とロードマップ
Step 0 — 事前準備・権限設計
Step 1 — ① DNS移管 / WAF / DDoS / SSL
Step 2 — ② DMARC Management
Step 3 — ③ Gateway DNS フィルタ
Step 4 — ④ DEX 合成テスト
Step 5 — ⑤ Turnstile 標準部品化
Step 6 — ⑥⑦⑧ Analytics / Cache / Security Center
Step 7 — Zero Trust 接続基盤
Step 8 — 移行と切り戻し
運用 — 3つの制約と体制
運用 — シート管理
運用 — ログの外部退避
運用 — 監視とアラート
運用 — インシデント対応 / break-glass
運用 — 定常運用カレンダー
運用 — 法令・社内規程
運用 — SLA・SPOF・投資判断
実機検証すべき未確定事項
0 エグゼクティブサマリ
「社内システムを AWS EC2 に置いたまま、VPNアプライアンスも専用線も買わずにどうやってセキュリティを保つか 」——その設計と、手を動かす手順と、動かし続けるための運用を1冊にまとめた文書です。
答えの骨格は多層防御(Defense in Depth) です。1つの製品で守るのではなく、境界の違う4つの層をそれぞれ塞ぎます。
結論を先に:この構成が成立する条件と、成立しない条件
成立する(¥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時点)
最優先アクション — 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 client Cloudflare One Client (CLI は warp-cli のまま)
Gateway with WARP(サービスモード) Traffic and DNS mode
DNS only(サービスモード) DNS-only mode (MDMの値は 1dot1)
Gateway > Policies Traffic policies > Firewall policies (DNS / HTTP / Network タブ)
Settings > Network > DNS Locations Networks > Resolvers & Proxies > DNS locations
Settings > WARP Client Team & Resources > Devices > Device profiles
Settings > Devices > Device posture Reusable components > Posture checks
Access > Tunnels Networking > Tunnels / Networking > Routes
Settings > Authentication Integrations > Identity providers
Logs / Analytics Insights > 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 Holds Enterprise 限定 に変更。Free では利用不可
Cloudflare Exposed Credentials Check 非推奨(deprecated)
1 全体アーキテクチャと脅威モデル
現状(As-Is)と目標(To-Be)
なぜ「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の契約も、社員が覚える新しいパスワードも不要です
3 Google 側の 2SV が実質的にそのまま効く。 ユーザーは Google のログイン画面で 2SV を突破しない限り Cloudflare に戻ってこられません
4 退職者対応が一元化される。 Google Workspace のアカウント停止が起点になります(ただし後述の通り、それだけでは Cloudflare は切れません)
5 OTP 固有の事故が消える。 メールセキュリティ製品のリンク自動スキャンが 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 同意画面の Audience External Internal
Admin SDK API の有効化 不要 必須
Google Admin Console 側の作業 不要 必須 (Trust internal apps + 管理者による認可)
個人 Gmail でのログイン 可能 (ポリシー次第で誰でも)不可(Internal 設定が遮断)
API の type 値 googlegoogle-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時間)を設定し、強制再認証で反映させるのが唯一の実用的な手段です
3 IdP ベースの 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 Step 0 事前準備(棚卸し・アカウント・2FA・権限) — 4h
W0 Step 2-A DKIM 有効化・SPF 修正(DNS移管を待たずに先行実施 ) — 2h
W1–2 Step 1 ① DNS を Cloudflare へ移管(WAF/DDoS/CDN/SSL) Step 0 8h + 待機48h
W2 Step 6 ⑥⑦⑧ Web Analytics / Tiered Cache / Security Center Step 1 1h
W3 Step 2-B ② DMARC Management 有効化 Step 1 2h(以降12週の運用)
W3–4 Step 7 Zero Trust 基盤(cloudflared / Tunnel / Routes) Step 0 8h
W4 Step 3 ③ Gateway DNS フィルタ(パイロット5台) Step 7 6h
W5 労使周知 通信ログ取得の説明会・規程改定手続き Step 3 —
W5–6 Step 3 ③ 全50台へ展開(MDM) 周知完了 8h
W6 Step 4 ④ DEX 合成テスト・通知 Step 3/7 3h
W7 Step 5 ⑤ Turnstile 自社フォーム適用 — 4h
W8– Step 8 Client VPN 廃止判断 Step 7 —
3 Step 0 — 事前準備・権限設計
棚卸し(これを飛ばすと必ず事故ります)
棚卸し対象 確認すること 情報源
DNS レコード全件 Xserver の全レコード。特に MX / SPF / DKIM / 各種検証用 TXT / サブドメイン Xserver 管理画面からゾーンファイルをエクスポート
メール送信元 Google Workspace / HubSpot / Xserver / 複合機・スキャナ / 社内バッチ(cron, 監視)/ 各SaaS(見積・請求・チケット) 各部門へのヒアリング必須
社員の自宅LAN 10.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名全員を招待する必要はありません(社内システムの「利用者」であることと、ダッシュボードのアカウントは別物です)。
対象 人数 ロール 理由
代表取締役 / 管理部門長 1 Super Administrator 請求・メンバー管理・Super Admin の引き継ぎ。技術者に依存させない
インフラ管理者(主) 1 Super Administrator 日常運用の最終権限。Super Admin は計2名まで (バス係数1を避けつつ増やしすぎない)
インフラ管理者(副) 1–2 Administrator 請求・メンバー管理を除く全操作
開発リーダー 2–3 Cloudflare Zero Trust Read Only + 担当ドメインの Domain DNS 障害切り分けのログ閲覧と、担当ドメインのDNS変更のみ
情シス / 監査担当 1 Administrator 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 Filtering EC2 の Elastic IP に限定
TTL 90日 。無期限トークンを作らない
ローテーション 四半期ごと(新規発行 → 疎通確認 → 旧トークン削除)
保管 AWS Secrets Manager (EC2 の IAM Role で取得)。.env の平文置きは禁止
命名規約 用途-環境-作成年月(例:logexport-prod-202608)
4 Step 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未使用)
Xserver 管理画面から BIND形式のゾーンファイルをエクスポート (これが正となるデータ)
対象レコードの TTL を 300秒(5分)まで下げる 。SOA の MINIMUM フィールドも下げる
現行で DNSSEC が有効なら、レジストラ側の DS レコードを先に削除 し、TTL失効(24〜48h)を待つ → synon.co.jp は DS なしを実測済みのためこの作業は不要
メール送信元の棚卸しが完了していること
DNSSEC の順序を間違えるとドメインが全断します
「DS削除 → TTL失効を待つ → NS変更 → Cloudflare で DNSSEC 有効化 → 新しい DS を登録」の順序が絶対です。古い DS のTTLが失効する前にNSを変えると、検証リゾルバが SERVFAIL を返します。
ダウンタイムを最小化する移管順序(公式推奨)
Universal SSL の範囲に注意
カバーされるのは synon.co.jp と www.synon.co.jp のような第1階層まで です。app.dev.synon.co.jp のような第2階層以降はカバーされません 。Free での回避策は「深い階層を使わない設計にする」か「該当ホストをグレー雲にする」のいずれかです(Total TLS / ACM は有償)。
SSL/TLS を Full (strict) にする
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 HTTPS On 全HTTPを301でHTTPSへ
Automatic HTTPS Rewrites On HTML内の http:// 内部リンクを自動書換(mixed content対策)
Minimum TLS Version TLS 1.2 ホスト名単位の設定は ACM(有償)が必要
TLS 1.3 On (既定)—
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 Rules 5本まで 。Log アクションは Enterprise 限定 → 「まずログで様子見」ができない
Rate Limiting Rules 1本のみ 。期間10秒固定 、使えるフィールドは Path と Verified Bot のみ 、IPカウントのみ
IP Access Rules 50,000本。ただし国単位ブロックは Enterprise 限定
User Agent Blocking 10本
Security Level 廃止済み ("Always protected" 固定)
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 Labs (ssllabs.com/ssltest/)で A 以上 を目標。
5 Step 2 — ② DMARC Management
Cloudflare DMARC Management とは
DMARC の集約レポート(RUA)を Cloudflare がホストするメールボックスで受信・解析し、ダッシュボードに可視化する無料 機能です。追加されるのは rua= 1つだけで、ゾーンの MX は変更されません。Google Workspace と完全に共存します。
前提条件は「ゾーンが Cloudflare DNS 上にあること 」「Apex ドメインであること」の2点のみ。プランは Free で可。
SPF の修正(現行の何が問題か)
絶対にやってはいけないこと
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=r → sDKIM のアライメント。HubSpot 等がサブドメイン署名を使う場合、s にすると落ちる
aspf=r を維持SaaS はエンベロープFromにサブドメインを使うことが多く、s は壊れやすい
pct=書かない RFC 9989 で廃止
12週間のランプアップ計画
集約レポートの読み方
最重要ポイント:auth_results と policy_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 は本文が改変されなければ pass DKIM を必ず有効化する。これが 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)サーバから直接 sendmail Workspace 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 domain で mta-sts.synon.co.jp を追加(Cloudflare が DNS レコードと TLS 証明書を自動発行)
TXT レコードを追加 _mta-sts TXT に v=STSv1; id=20260815T120000;
ワイルドカードの落とし穴
RFC 8461 のワイルドカードは最左1ラベルのみ を置換します。*.google.com は aspmx.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=pass の3つすべてが pass であることを確認します。
6 Step 3 — ③ Gateway DNS フィルタ
目的 :社員端末50台の DNS クエリを Cloudflare Gateway に流し、マルウェアのC2通信・フィッシング・DGA ドメインへの到達を 名前解決の段階で 遮断する。
方式選定:2つの経路と、なぜ両方使うのか
固定IP要件の落とし穴
共有 anycast IPv4 リゾルバを平文 で使う場合、送信元グローバルIPの登録が必須です。大阪オフィスが動的IPなら、平文IPv4は諦めて DoH を使ってください。 専用IPv4は Enterprise 限定です。
サービスモードの決定:1dot1 か warp か
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 設定ファイルの配置場所
Windows C:\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 connect 0 1〜5 分
Lock device client switch 無効 段階的に有効化
Service mode Traffic and DNS 段階1は DNS only mode
Allow device to leave organization 無効 無効のまま
Device tunnel protocol MASQUE MASQUE のまま
動作確認
# 状態確認
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_locked を true にしない 、または「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日間保持する例外あり)。
7 Step 4 — ④ DEX 合成テスト
目的 :「繋がらない」の第一報が社員からの申告になる状態をやめ、能動的に監視して先に気づく 。
Free 可
DEX は全 Zero Trust プランで利用可能
10
Free の DEX テスト上限(Standard 30 / Ent 50)
HTTP 合成テストの設定
パス :Insights > Digital experience > 「Tests」タブ > Add a Test
フィールド 設定
Name 社内Webシステム-HTTP
Target 監視対象のURL。public / private のどちらのホスト名もサポート
Test type HTTP Get
Test frequency 5〜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 Anomaly WARP 接続デバイス数のスパイク/急減 z-score が 3.5超 / -3.5未満
DEX Test Latency アプリケーション遅延のスパイク/急減 同上
DEX Test Low Availability HTTP/traceroute の成功率が SLO を下回る 管理者が xx.x 形式で指定 → 推奨 98.0
これが実質的な「繋がらない」の自動検知になります
社内システム向けに DEX Test Low Availability を SLO 98.0 で作成し、情シスのメーリングリストへ配信してください。
その他の機能
機能 パス / 内容
Device Monitoring Team & Resources > Devices > デバイス > View details > DEX タブ。接続状態 / CPU使用率 / メモリ使用率 / バッテリー / 通信量 / 展開されているクライアントモード / クライアントバージョン 。「どの端末が古いクライアントのままか」「どの端末が DNS only モードから外れているか」を一覧確認でき、50台の展開状況チェックに最適
Remote Captures Insights > Digital experience > Diagnostics。キャプチャ時間600秒 / ファイル50MB / 最大10台同時 / Free は 100回/日
Remote Captures は通信内容そのものを取得します
DNSログ以上に機微であるため、実行には事前の本人通知または明確な承認プロセスを規程化 してください。
8 Step 5 — ⑤ Turnstile 標準部品化
目的 :(1) 自社コーポレートサイトの問い合わせフォームのスパム対策、(2) 受託案件で使い回せる標準コンポーネント化。
受託開発で決定的に重要な特性
公式に「Cloudflare にトラフィックを通さずに任意のサイトに埋め込める」と明記されています。さくら・AWS・Xserver 上のクライアントサイトでも、DNSを触らずに導入できます。
費用は Free で「Unlimited challenges(トラフィック・検証リクエストとも無制限)」 。2023年GA時の「siteverify 100万回上限」は現行の公式plansページには記載がなく、無制限と明記されています。
Free の上限:ウィジェット 20個/アカウント 、ホスト名 10個/ウィジェット 、アナリティクス保持 7日 。
クライアント側(プレーン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つ目はリプレイ攻撃時のエラーハンドリングを単体テストできる貴重な仕組み です。
受託案件への標準化(納品物としての整備)
サイトキー/シークレットキーの管理場所と、ローテーション手順
action の値と、その意味(フォームごとの一覧)
許可ホスト名(Hostname Management の登録内容)
サーバ側検証の実装箇所とエラーハンドリングの仕様
エラーコードごとの表示文言(顧客のブランドトーンに合わせる)
JavaScript 無効時のフォールバック導線 (メール・電話)
Turnstile Analytics の見方(solve rate / challenge rate)
React を使う場合は「@marsidev/react-turnstile はコミュニティ製であり、Cloudflare 公式の React パッケージは存在しない」ことを明記 (メンテナンス停止リスクの共有)
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サイトキーが無効化されている ダッシュボードでウィジェットの状態を確認
9 Step 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 TTL Caching > Configuration Respect Existing Headers (オリジンの Cache-Control で制御。Git管理でき環境差分が出にくい)
Always Online 同上 On 。オリジン到達不能時に Internet Archive 経由で古い版を配信。Free はクロール30日ごと なので最大30日前の内容が出る
Early Hints Speed > Settings > Content Optimization On(ただしオリジンが 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 へのアップグレード要否を判断
10 Step 7 — Zero Trust 接続基盤(WARP + Tunnel)
目的 :社内Webシステム(10.0.1.10:443)への到達経路を、AWS Client VPN から Cloudflare 経由に置き換える。EC2 のインバウンドは一切開けない。
EC2 のアウトバウンド要件
宛先 FQDN IPv4 プロトコル/ポート
region1.v2.argotunnel.com198.41.192.7, .27, .37, .47, .57, .67, .77, .107, .167, .227 TCP 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 > Routes CLI
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 は持てません
③ --protocol は auto のまま にしてください。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 管理者が開いて認可する」ステップは最も脱落しやすく、これを飛ばすとグループが一切取得できません 。
事前確認:チーム名を確定させること
OAuth のリダイレクトURIにチーム名が入るため、後からチーム名を変えると IdP 設定と全端末のクライアント設定をやり直すことになります。 現在のチーム名は Zero Trust > Settings で確認できます(本書では synon を前提)。
💡 GCP Console は英語表示に切り替えて作業することを強く推奨します (右上の設定、または URL に &hl=en)。公式手順と1対1で照合でき、事故が減ります。
① Google Cloud Console 側(所要20分)
# 作業 パス / 値
1 GCP にログイン https://console.cloud.google.com/(Google Workspace の管理コンソールとは別物 )
2 プロジェクト作成(既存があれば流用可) IAM & Admin > Create Project → 例:synon-cloudflare-idp
3 API ライブラリを開く APIs & Services > Enable APIs and Services
4 API を検索 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.jp / Audience Type:Internal / Contact Information:情シスの共有メールボックス
9 OAuth クライアント作成 Create OAuth Client → Application type:Web application
10 JavaScript 生成元 https://synon.cloudflareaccess.com
11 リダイレクトURI https://synon.cloudflareaccess.com/cdn-cgi/access/callback ← 完全一致でなければ動きません
12 Client 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 Services API とサービス > API とサービスの有効化
OAuth consent screen / Audience OAuth 同意画面 / 対象
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.com → Security > 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 secret /Google 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 タブ
順 Action Rule type Selector Value 意図
1 Allow Include Emails ending in @synon.co.jp通常社員
Require Login Methods Google WorkspaceOTP での一般登録を封じる
2 Allow Include Emails breakglass@synon.co.jpbreak-glass
Require Login Methods One-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 が落ちた瞬間に誰も新規ログインできなくなります
必ず脱出経路を用意してください。
# 設計
1 breakglass@synon.co.jp を Google Workspace 上に作らない。 Google 障害時に使えなければ意味がありません。Cloudflare の OTP はメールを受信できればよいので、Google Workspace 外のメールボックス (別ドメイン、または Cloudflare Email Routing で別プロバイダへ転送)を使います
2 Cloudflare ダッシュボードの管理者ログインを Google SSO に依存させない。 Google でログインする運用にしていると、Google 障害時に設定変更すらできなくなります。 メールアドレス+パスワード+TOTP の管理者を最低2名確保
3 API トークンを事前発行してオフライン保管 (Access: Organizations, Identity Providers, and Groups Write + Zero 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〜2hIdP・デバイス登録ポリシー・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 —— この構成の最重要設定
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
1 Allow internal-app-users to internal appDestination IP 10.0.1.0/24 and Destination Port 443 and User Group Names internal-app-users Allow + check_session 24h0m0s
2 Block all other private network accessDestination IP 10.0.0.0/8 Block
公式が推奨する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 の有無)。
デバイスポスチャ(段階導入)
# チェック 設定値 理由
1 Require WARP — Cloudflare One Client の動作を保証。全OS対応
2 Disk encryption 全ディスク暗号化必須 紛失盗難対策。macOS=FileVault, Windows=BitLocker。個人情報保護法対応上も説明しやすい
3 OS version Windows 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.jp → 10.0.1.10(DNS only / グレー雲 )。DNS-01 チャレンジ で Let's Encrypt の正規証明書も取得できる✅ 段階2で採用
C. Local Domain Fallback 社内DNSサーバ(Route 53 Resolver 等)へフォールバック 社内DNSがある場合のみ
D. Resolver policies Gateway 側で条件付き解決 ❌ 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ステップ準拠)
Cloudflare One Client が Connected か
Insights > Logs > DNS query logs にプライベートホスト名のクエリがあるか
Insights > Logs > Network logs に宛先IP 10.0.1.10 が出ているか
ユーザーメール・イベント "Blocked"・時間帯で絞り、Gateway ポリシーで落ちていないか
意図したポリシーがマッチしているか(評価順序 。Allow が Block の上にあるか)
Traffic policies > Proxy で TCP・UDP・ICMP が有効か
トンネルのログストリームにリクエストが届いているか
cloudflared ホスト(EC2)から直接 アプリへ到達できるか → ここで失敗するなら Cloudflare は無関係。EC2 間の SG / OS ファイアウォールの問題
アプリサーバ側のローカルファイアウォールが cloudflared の送信元IPを弾いていないか
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 経路としても機能します 。
11 Step 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/24、tunnel 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 トグルでOFF 1分
Tunnel 障害 全社員に Client VPN 利用を指示(F3前なら即復旧) 即時
完全撤退 cloudflared tunnel route ip delete 10.0.1.0/24 → systemctl stop cloudflared → 社員に Client VPN 復帰指示10分
ロールバックの前提
F3 で Client VPN を削除してしまうと、この表の「即時復旧」が使えなくなります。最低1ヶ月は Client VPN エンドポイントを保持してください。
第1部の完了チェックリスト
Step 0 事前準備
棚卸し(DNSレコード / メール送信元 / 自宅LAN / オフィスIP / 既存VPN / 顧客契約制約)
Cloudflare アカウントを共有可能なアドレスで作成
全メンバーの2FA有効化、2FA Enforcement を ON
ロール割当(Super Admin は2名まで、メンバーは8名以内)
API トークン(TTL 90日 / IP制限 / Secrets Manager 保管)
Step 2-A 先行実施(DNS移管を待たない)
Google Workspace の DKIM 有効化(2048bit / セレクタ google)
SPF 修正(include:_spf.google.com 追加、mx と冗長な a: を削除、1本にまとめる)
TLS-RPT 設定
Step 1 ① DNS移管
TTL を300秒に下げて48時間待機、ゾーンファイルをエクスポート
Cloudflare にゾーン追加、レコードをインポートして MX/SPF/DKIM/DMARC を目視確認
全レコードをグレー雲で登録 → NS変更 → Active → Universal SSL 確認
オリジンで Cloudflare IP レンジを許可 → apex/www をオレンジ雲へ
SSL/TLS を Full (strict) に、Origin CA 証明書を設置、AOP を optional→on
Always Use HTTPS / Automatic HTTPS Rewrites / Min TLS 1.2 / HSTS 1ヶ月から
Custom Rules 5本(管理画面制限 / xmlrpc / 社内パス / 機微ファイル / 予備)
Rate Limiting 1本(ログインパス)
Bot Fight Mode の判断(API があるなら OFF)
Step 6 ⑥⑦⑧
Web Analytics 追加(no-transform ヘッダがないことを確認)
Tiered Cache を On、Always Online を On、Cache Rules 3本
Security Center の週次レビューを運用カレンダーに登録
Step 2-B ② DMARC Management
Email > DMARC Management > Enable
dig で rua が正しく(セミコロン付きで)入ったか確認
Google Postmaster Tools に登録
12週ランプアップの判定基準を運用台帳に記載
Step 7 Zero Trust基盤
EC2 SG アウトバウンド(TCP/UDP 7844 + TCP 443)、NACL 使用時はエフェメラルポートも
cloudflared 導入、tunnel diag で疎通確認
Networking > Tunnels でトンネル作成、service install
2台目(別AZ)に同一トークンで install → tunnel info で2件確認
Networking > Routes に 10.0.1.0/24 を追加
GCP: プロジェクト作成 → Admin SDK API 有効化 → OAuth同意画面(Internal) → OAuthクライアント作成
GCP: redirect URI が https://synon.cloudflareaccess.com/cdn-cgi/access/callback と完全一致
GCP: Client secret をパスワードマネージャに保存(再表示不可)/Contact は共有メールボックス
Google Admin: Security > API controls > Settings > Internal apps > Trust internal apps を ON
Google Admin: グループ internal-app-users@synon.co.jp を作成(表示名も同一・直接メンバー)
Cloudflare: Identity providers に Google Workspace を追加(App ID / Secret / synon.co.jp)
Cloudflare: 生成リンクを Google Workspace 管理者が開いて認可 → Test でグループが返ることを確認
get-identity でグループの実データ形式(name/email/id)を確定
Device enrollment: Emails ending in @synon.co.jp + Require Login Methods = Google Workspace
Device enrollment: break-glass 1名の OTP 例外を追加
Login methods: Google Workspace ON / One-time PIN ON / Apply instant authentication OFF
break-glass アカウントで OTP ログインを実地確認
Split Tunnels を Include モードに変更、6エントリを登録
Traffic policies > Proxy で TCP/UDP/ICMP を ON
Network ポリシー2本(Allow: User Group Names = internal-app-users → Block: 10.0.0.0/8 キャッチオール)
Allow ポリシーに Enforce Cloudflare One Client session duration = 24h0m0s を設定
Split Tunnel Include に accounts.google.com / www.googleapis.com を追加
DNS に app.internal(DNS only / グレー雲)を追加、DNS-01 で証明書取得
ポスチャ3種を作成し、まず観測のみ(1〜2週)
Step 3 ③ Gateway DNS フィルタ
パイロット5台に手動インストール(1dot1)、macOSのダイアログと承認ペイロードを採取
Security Categories = All security risks を Block
労使周知(説明会+書面) 、就業規則・規程の改定手続き開始
MDM で残り45台へ配布、Captive portal detection を有効化
Allowlist と Content Categories(Allow で監視)を追加
6週後に Content Categories を Block へ切替
段階2:service_mode を warp へ移行、証明書を配布
Step 4 / Step 5 / Step 8
DEX HTTP テスト(15分間隔)、DEX rules で10台に限定
DEX Traceroute テスト(10.0.1.10)※ warp モード移行後
DEX Test Low Availability アラート(SLO 98.0)
Turnstile を自社問い合わせフォームに適用(hostname / action のサーバ側検証まで)
テストキー3種で自動テストを整備、受託標準テンプレート+設計書記載項目を整備
パイロット1週 → 全社展開2〜3週(Client VPN 併存)
Client VPN 接続数ゼロを2週間確認 → Association のみ解除 → 1ヶ月後に削除
第2部 運用計画書
構築が終わった瞬間から始まる、日々の運用・監視・インシデント対応・法令対応。
12 この構成の運用を規定する「3つの制約」と体制
運用体制
役割 担当 主な責務
統括責任者 管理部門長 モニタリングの責任者、break-glass の発動判断 、経営報告、規程の維持
インフラ管理者(主) 1名(Super Administrator) 設計変更、インシデントコマンダー、月次のバージョン管理、四半期のポリシー棚卸し
インフラ管理者(副) 1〜2名(Administrator) 日次のログ退避確認、週次レビュー、月次シート棚卸し
開発リーダー 2〜3名(Zero Trust Read Only + Domain DNS) 障害切り分けのログ閲覧、担当ドメインのDNS変更
一次受付 情シス 社内 Slack #it-helpdesk。Cloudflare 非依存の経路(携帯電話番号リスト)を印刷保管
重大度 定義 指揮
Sev1 全社業務停止 インフラ管理者(主)が Incident Commander。30分で解決しない場合、必ず管理部門長へエスカレーション
Sev2 一部部門停止/セキュリティ侵害の疑い 同上
Sev3 個別ユーザーの問題 インフラ管理者(副)
13 運用 — シート管理(最も高い運用リスク)
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分 / 担当 :インフラ管理者(副)/ 承認 :管理部門長
Zero Trust > Team & Resources > Users でユーザー一覧を記録(またはAPIで取得)
現在の消費シート数を記録 し、50 − 消費数 = 残枠 を算出
🔴 残枠が5未満なら即エスカレーション (管理部門長へ。翌月の入社予定者数と突合)
人事の在籍者名簿(当月1日時点)と Users 一覧を突合
在籍者名簿にない全ユーザー をリストアップ(退職者・元業務委託者・テストアカウント)
Action > Remove users > Remove で削除。削除前に対象一覧をスクリーンショット保管 (監査証跡)
Last seen が60日以上前のユーザーを抽出 → 在籍・利用実態を確認 → 不要なら Remove
Team & Resources > Devices で、在籍者に紐づかないデバイス登録を削除
Manage Account > Audit Logs で当月の設定変更を確認
結果を運用台帳に記録し、管理部門長が確認署名
残枠 アクション
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)を必ず同日に実施してください。
# 対象 手順 確認方法
1 Google Workspace(最優先) Google Admin Console でアカウント停止・全セッション強制ログアウト ログイン試行で拒否されること。ただしこれだけでは Cloudflare は切れない
2 Access セッション Users → 対象 → Action > Revoke > Revoke sessions 保護アプリに再アクセスして認証要求が出ること
3 デバイス登録 Devices → 対象 → View details → Delete (Revoke ではない) 一覧から消えること
4 🔴 シート Users → Action > Remove users > Remove 消費シート数が1減ること
5 WARP クライアント 返却端末からアンインストール。再配布端末は初期化を原則とする warp-cli status が動作しないこと
6 Cloudflareアカウント ダッシュボードのメンバーなら削除 Manage Account > Members から消えること
7 API トークン ユーザートークンは本人アカウント削除で失効。アカウントトークンは別途確認・失効 用途不明トークンがないこと
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章)。
ユーザー自身のログアウト URL :https://synon.cloudflareaccess.com/cdn-cgi/access/logout → 発行済みトークンは 20〜30秒 で受け付けられなくなります。
管理者による Revoke の反映 :Revoke 実行後、対象ユーザーは最大1分間 は再ログインできません(公式明記)。
14 運用 — ログの外部退避
ログ種別 Free Standard Enterprise
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 logs 7日 7日 7日
Device posture logs 30日 30日 30日
Cloudflare ネイティブのログ外部転送は一切使えません
Logpush(ゾーンHTTPログ)も Zero Trust Logpush も Enterprise のみ 。Logpull も Enterprise。自前でAPIをポーリングして退避する以外に手段がありません。
必要なAPIトークンのスコープ
権限(ダッシュボード表記) スコープ 用途
Account Settings → ReadAccount アカウント監査ログ v2
Access: Audit Logs → ReadAccount Access 認証ログ
Account Analytics → ReadAccount GraphQL(Access/Gateway 集計)
Zone Analytics → ReadZone(当該ゾーンのみ) GraphQL(ゾーンHTTP)
Zero Trust → ReadAccount 設定・ユーザー一覧の棚卸し
🔴 Zero Trust: PII → Read Account ログ中のメール/デバイス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つ ❌
PagerDuty Professional / Business 以上 ❌
案 内容 コスト 遅延
1 Cloudflare → 専用アドレス(cf-alert@synon.co.jp)→ Google Workspace のフィルタ + Slack のメール連携 ¥0 数分
2 上記メールを Gmail API / IMAP でポーリングする小スクリプトを EC2 に置き、Slack Incoming Webhook へ転送 ¥0 1分以内
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 Alert ✅ Free でも発報(目安 100 rps 超)
Security Insights ✅ 設定不備(ダングリングDNS、MFA未設定、未保護Tunnel)を検知
DEX - Device connectivity anomaly ✅ WARP 接続異常の面的検知
DEX - Test latency ✅ 社内システム宛の遅延
DEX - Test low availability ✅ 実質的な「繋がらない」の自動検知 。SLO 98.0
Expiring Access Service Token ❌ カレンダー手動管理 で代替
Origin Error Rate / Traffic Anomalies(5xxスパイク) ❌ Enterprise GraphQL 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
(b) 不審なログイン(Google アカウント侵害)【Sev2】
検知 :自作アラート(第15章)/ Google Admin Console のセキュリティ アラート / 本人からの「身に覚えのないログイン通知」
一次対応(15分以内・順序厳守)
Google Admin Console でアカウント即時停止+全セッション強制ログアウト (これが最優先)
Users → 対象 → Action > Revoke > Revoke sessions ← 🔴 手順1だけでは Cloudflare は切れません
Devices → 身に覚えのないデバイス登録を Delete
Manage Account > Audit Logs → 当該期間にダッシュボード操作がないか確認(あれば管理者権限侵害 = Sev1 に格上げ )
Manage Account > API Tokens → 不審な新規トークンがないか確認、あれば即削除
退避済みログから当該ユーザーの直近アクセス先を洗い出し、情報持ち出しの有無 を評価
Google 側の証跡も確保 (Admin Console > レポート > 監査と調査 > ログインログ)。Cloudflare のログは Free で24時間しか残らないため、Google 側のログのほうが長く残ります
復旧 :Google パスワードリセット + 2SV の再登録(セキュリティキー必須化 )→ 端末のマルウェアスキャン → アカウント再有効化 → Cloudflare 側で再認証させてグループが正しく載ることを確認
エスカレーション :管理部門長 → 顧客データへのアクセス痕跡があれば即・経営会議 (受託開発では顧客への報告義務が契約上生じる可能性が高い)
事後 :check_session の設定値が妥当か再評価。個人データ漏えいの疑いがあれば第18章の法令フローへ
(c) マルウェア感染端末の検知【Sev2】
Free ではこれを自動通知する術がありません
退避スクリプトに「Security カテゴリの Block を検知したらメール」を実装するか、日次でGatewayログを目視確認 する運用にしてください。
Gateway ログで Device ID / User email / 宛先ドメイン / 発生時刻・頻度 を特定(PII表示には Zero Trust: PII Read が必要)
単発か継続か を判定(継続的なビーコン通信は感染確定に近い )
同一宛先に他の端末も通信していないか (横展開の確認)
該当端末をネットワークから物理的に隔離 (有線抜線・Wi-Fi切断)。🔴 電源は落とさない (メモリ上の証跡が消えるため)
利用者からヒアリング → セッションを Revoke → EDR / ウイルス対策でフルスキャン
駆除が確認できても、業務端末は原則クリーンインストール。 当該ユーザーの全パスワード・トークンをリセット
(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 障害時の代替経路)
(e) DDoS 攻撃【Sev2】
Unmetered DDoS Protection は Free でも有効 。L3/L4 は基本的に自動緩和される
Under Attack Mode を有効化 —— Free で使える最強の緊急手段 (ゾーン Overview > Quick Actions)
Rate Limiting Rule(1本)で該当パスを保護
全レコードが Proxied(オレンジ雲)であることを確認 —— グレー雲だとオリジンIPが露出し、Cloudflare を迂回して直撃される
オリジンの SG でインバウンド443を Cloudflare の公開IPレンジのみに制限 (未実施なら平時に必ず設定)
18 運用 — 法令・社内規程(日本)
本章は法的助言ではありません
規程改定・従業員への周知の適法性、特に労働法上の取扱いについては、社会保険労務士および弁護士への確認を必ず経てください。
従業員の通信ログ取得(個人情報保護委員会 Q5-7 の5要件)
# 留意点 具体化
1 目的をあらかじめ特定し、社内規程等に定め、従業者に明示 就業規則または情報セキュリティ規程に条項を新設し、目的を「マルウェア感染・情報漏えいの防止、および不正アクセスの検知」と明記
2 責任者及びその権限 を定める責任者=管理部門長 、実施者=インフラ管理者(主)、閲覧権限は Zero Trust: PII Read 保有者に限定
3 実施ルールを策定 し運用者に周知「平常時は個人単位のログを閲覧しない。インシデント検知時または本人同意時にのみ、責任者の承認を得て閲覧する 」
4 適正に行われているか確認 四半期に一度、PII閲覧の実施記録を管理部門長がレビュー (運用カレンダーに組込済み)
5 労働組合等への事前通知・協議 と従業者への周知労組がなければ従業員代表への説明 と全社説明会(年次教育)
導入前に周知すること
事後の周知は「秘密裏の監視」と受け取られ、労務トラブルの温床になります。
また規程には「取得しない情報」も明記 すると信頼を得やすくなります。例:「Gateway は HTTP のボディを記録しない」——これは公式ドキュメントで裏付けのある事実です(エラー時のみ先頭512バイトを30日間保持する例外あり)。
BYOD 端末に WARP を入れる場合はさらに慎重に。 私的通信のログが取得されるため、書面での個別同意 を推奨します。
個人情報保護法:越境移転が最大の論点
要確認事項 — 経営判断が必要になる可能性があります
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 🔴 なし なし チケット
Business 100% Uptime 1x 優先チケット
Enterprise 100% Uptime 10x / 25x 専任
正確な表現
Free プランには稼働率保証(SLA)が一切ありません。 Cloudflare の障害で自社の業務が何時間止まっても、契約上の救済(返金・クレジット)はゼロ であり、技術サポートに問い合わせる権利もありません。
これは「安いから多少は仕方ない」ではなく、受託開発企業として顧客に説明責任を負う際の重大な事実 です。契約上、顧客システムの可用性にコミットしている場合、Free プランへの依存は契約違反リスクになり得ます。
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 限定設計の前提
7 Google のネストグループが Cloudflare に反映されるか テストユーザーを親グループにのみ間接所属させ get-identity を確認 公式に記述がない。反映されない前提で直接メンバー運用にするのが安全
8 Cloudflare が Google に要求する OAuth スコープの実値 管理者認可リンクを開いた際の同意画面URLの scope= を記録 公式ドキュメントに記載がない。社内の変更管理記録に必要
9 IdP 切替時にシートが再消費されないこと 移行前後で消費シート数を実測 50シートちょうどのため、誤れば上限到達
10 Network ポリシー / デバイスポスチャの各セレクタが Free で選択可能か 実機のポリシー作成画面 アクセス制御設計の前提
11 「Remove inactive users from seats」が Free で使えるか Zero Trust > Settings > Admin controls シート枯渇対策の要
12 GraphQL の Gateway データセットが Free で取得できるか settings introspection クエリ ログ退避設計の前提
13 2FA Enforcement の正確な画面パス ダッシュボード実機 公式ドキュメントに記載なし
14 ロール一覧が Free の招待画面で全て選択可能か Manage Account > Members > Invite 権限設計の前提
15 Free ゾーンのアナリティクス遅延の実測値 実データで確認 公式FAQに「24時間遅延」の記載あり
16 Tiered Cache の既定 ON/OFF 状態 Caching > Tiered Cache を目視 有効化漏れの防止
17 Security Center の正確な2026年メニューパス 実機 新旧ダッシュボード混在のため
18 🔴 macOS の System Extension / PPPC の bundle ID・team ID 1台で手動インストールして採取 公式ドキュメントに記載なし。50台配布の成否を分ける
19 1dot1 モードでの DEX private IP テストの可否1台で実機検証 ドキュメントの直接記述はなく、モード定義からの論理的帰結
20 .co.jp レジストラでの DS レコード登録可否指定事業者に確認 Cloudflare のドキュメント範囲外
21 Cloudflare DMARC Management のデータ保持期間 Cloudflare に確認 公式に記載なし
22 Origin CA 証明書の有効期間の選択肢 ダッシュボードで確認 更新計画の前提
主要な参照先
Cloudflare 公式
Cloudflare One(Zero Trust): developers.cloudflare.com/cloudflare-one/
Zero Trust ログ保持期間: developers.cloudflare.com/cloudflare-one/insights/logs/
シート管理: developers.cloudflare.com/cloudflare-one/team-and-resources/users/seat-management/
Split Tunnels: developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/split-tunnels/
Tunnel(プライベートネットワーク): developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/
MDM パラメータ: developers.cloudflare.com/cloudflare-one/team-and-resources/devices/warp/deployment/mdm-deployment/parameters/
Google Workspace IdP 連携 : developers.cloudflare.com/cloudflare-one/integrations/identity-providers/google-workspace/
汎用 Google(グループ非対応): developers.cloudflare.com/cloudflare-one/integrations/identity-providers/google/ / One-time PIN: .../one-time-pin/
Gateway の identity セレクタ: developers.cloudflare.com/cloudflare-one/traffic-policies/identity-selectors/
セッション管理: developers.cloudflare.com/cloudflare-one/access-controls/access-settings/session-management/
デバイス登録: developers.cloudflare.com/cloudflare-one/team-and-resources/devices/device-registration/
Google: OAuth クライアントの管理(6ヶ月未使用削除・シークレットのローテーション): support.google.com/cloud/answer/15549257
Google: 内部アプリ/サードパーティアプリのアクセス制御: knowledge.workspace.google.com/admin/apps/control-which-apps-access-google-workspace-data
DEX: developers.cloudflare.com/cloudflare-one/insights/dex/ / DMARC Management: developers.cloudflare.com/dmarc-management/
Turnstile: developers.cloudflare.com/turnstile/ / WAF: developers.cloudflare.com/waf/ / SSL: developers.cloudflare.com/ssl/
通知 / Webhook: developers.cloudflare.com/notifications/get-started/configure-webhooks/
障害報告: blog.cloudflare.com/18-november-2025-outage/ / blog.cloudflare.com/5-december-2025-outage/
Cloudflare Status API: www.cloudflarestatus.com/api / APPI 対応: www.cloudflare.com/trust-hub/appi/
日本語・公的機関
IPA 中小企業の情報セキュリティ対策ガイドライン 第4.0版: www.ipa.go.jp/security/guide/sme/about.html
経済産業省/IPA サイバーセキュリティ経営ガイドライン Ver3.0: www.meti.go.jp/policy/netsecurity/downloadfiles/guide_v3.0.pdf
個人情報保護委員会 Q5-7(従業者モニタリング)/ Q7-53(クラウド例外)/ Q10-25(外的環境の把握): www.ppc.go.jp/all_faq_index/
同 漏えい等報告の義務化: www.ppc.go.jp/news/kaiseihou_feature/roueitouhoukoku_gimuka/
総務省 DMARC ガイドライン案: www.soumu.go.jp/main_content/000941399.pdf
JPCERT/CC インシデント報告: form.jpcert.or.jp/ / Google 送信者ガイドライン: support.google.com/a/answer/81126
用語集
用語 意味
Cloudflare One Zero Trust 製品群の新名称(2026年〜)
Cloudflare One Client 旧 WARP client。端末に入れるエージェント。CLI は warp-cli のまま
cloudflared サーバ側に入れる Tunnel コネクタ
Tunnel EC2 からのアウトバウンド接続のみで、インバウンドを開けずに Cloudflare と繋ぐ仕組み
プライベートネットワーク経路 公開ホスト名を作らず、WARP 経由でプライベートIPに到達させる方式
Split Tunnel どの通信を WARP に通すか(Include)/通さないか(Exclude)の設定
Gateway DNS / Network / HTTP のフィルタリングエンジン
DEX Digital Experience Monitoring。端末視点での到達性・遅延の合成監視
シート(Seat) Zero Trust のユーザーライセンス単位。認証で消費され、Remove まで解放されない
Origin CA Cloudflare が発行するオリジン用証明書。プロキシ経由でのみ有効
AOP Authenticated Origin Pulls。Cloudflare → オリジンの mTLS
RUA / RUF DMARC の集約レポート/失敗レポート
アライメント From ドメインと SPF/DKIM が認証したドメインが揃っていること。DMARC 判定の核
IdP Identity Provider(認証を担うサービス)。本構成では Google Workspace
Admin SDK Directory API Cloudflare が Google グループを読み取るために使う API。有効化しないとグループが取れない
Trust internal apps Google Admin Console の設定。OFF だとグループ取得だけが静かに失敗する
check_sessionGateway Allow ポリシーに設定する Cloudflare One Client のセッション有効期間。グループ変更の反映と退職者の失効を担保する唯一の手段
get-identityhttps://<team>.cloudflareaccess.com/cdn-cgi/access/get-identity。グループ取得の切り分けに最も有効なエンドポイント
SCIM IdP からのユーザー自動provisioning/deprovisioning。Google Workspace は非対応
break-glass 緊急時にのみ開ける代替経路。閉じる手順まで含めて設計する
本書は 2026年8月15日時点の Cloudflare 公式ドキュメントおよび公的機関の公表情報に基づいて作成しました。
Cloudflare の仕様・ダッシュボード構成は頻繁に変更されるため、実作業前に必ず実機でご確認ください。
第2部 第18章は法的助言ではありません。規程改定にあたっては社会保険労務士・弁護士にご確認ください。
社内システムのクラウド化とセキュリティ確保 — Cloudflare 構築手順書+運用計画書 / 2026-08-15