SYNON 記事 Cloudflare・インフラ

syncsync.jp
セキュリティ構築手順書

+ synon.co.jp との2ドメイン比較

エックスサーバー上のプロダクトサイトを Cloudflare で守るための、画面操作・CLI・設定値レベルの実務文書。既存の synon.co.jp 版と「何が同じで何が違うか」を明示します。

作成日: 2026-08-17 対象ドメイン: syncsync.jp ホスティング: エックスサーバー メール: Xserver 自前(維持) 位置づけ: 並行運用する第2ドメイン

0エグゼクティブサマリ

結論を3行で

syncsync.jp は synon.co.jp と「別の手順書」が必要ですホスティングもメール構成も根本的に違い、synon.co.jp 版の手順をそのまま流用すると受信メールが全滅する地雷を踏みます。
最大の技術的制約は「Xserver に Cloudflare Origin CA 証明書を設置できない」ことsynon.co.jp(EC2)で採用した Full (strict) + Origin CA + mTLS という構成は、syncsync.jp では成立しません。
最優先の作業は DNS 移管ではなく、DKIM レコードの退避ですXserver の DKIM 公開鍵は Xserver の DNS にしか存在せず、移管の瞬間に消えて DKIM が全滅します。
2つのドメインは「別の構成」── 同じ手順書は使えない synon.co.jp(コーポレート) Web オリジン STUDIO / Google Cloud メール Google Workspace SSL: Full (strict) + Origin CA + mTLS オリジン証明書を自由に設置できる前提の設計 DKIM: Google 用が未設定(新規設定が必要) SPF: 8 / 10 ルックアップ・Google が抜けている MX: Google Workspace の5レコード apex A とは独立 → apex をプロキシしても安全 Bot Fight Mode: 判断による Turnstile の実利は中(コーポレートの問い合わせ) syncsync.jp(プロダクト) Web オリジン Xserver 共有サーバ メール Xserver 自前(同一IP) SSL: Origin CA も mTLS も不可 Xserver の Let's Encrypt に依存する別設計が必要 DKIM: default セレクタで稼働中(退避が必要) SPF: 6 / 10 ルックアップ・3メカニズムが冗長 MX 0 syncsync.jp ── apex 自身を指す apex をプロキシした瞬間に受信メールが全滅 Bot Fight Mode: OFF 必須 アプリ/API 通信を巻き込む。Turnstile で代替
図1: synon.co.jp と syncsync.jp の構成差。赤い枠が「synon.co.jp 版の手順をそのまま使うと事故る箇所」

実測で判明した4つの重要事実

本書の作成にあたり、権威DNSに対して実測を行いました。事前の想定と食い違う点が4つあります。

#発見なぜ重大か
1DKIM は既に設定済み
(セレクタ default・RSA 2048bit)
「DKIM 未設定」という前提は誤りでした。この TXT を Cloudflare にコピーし損ねると、NS 切替の瞬間に DKIM が全滅します。Xserver は公開鍵を自社DNSにしか自動投入しません
2MX が apex 自身を指している
MX 0 syncsync.jp.
apex A レコードをオレンジ雲にした瞬間、全世界からの受信メールが Cloudflare のエッジに配送を試み、SMTP が通らず受信が全滅します。「MX をグレー雲に」という一般則だけでは防げません
3ワイルドカード * A レコードが存在するzzq7x9-nonexistent.syncsync.jp すら解決します。フィッシングとサブドメイン棚卸し不能の温床。移管時に1:1で再現しないと既存サービスが壊れ、そのまま残すとリスクが残ります
4DMARC の rua に個人アドレスが入っており、しかもレポートが届いていないRFC 9990 §4 の外部宛先検証レコードが Apple 側に存在しないため、準拠する受信者はこの URI を "MUST be ignored" として破棄します。さらに個人アドレスの公開はガバナンス上も問題です

syncsync.jp が「プロダクトサイト」であることの意味

syncsync.jp は工場・現場向けのペーパーレス化SaaS 「SyncSync Form」 の製品サイトで、料金プラン・問い合わせフォーム・モバイルアプリ/Web両対応を持ちます。これは synon.co.jp(コーポレートサイト)と決定的に性格が違います。

観点影響
顧客が見るサイト停止=商談機会と信用の損失。Free プランに SLA がないことの重みが synon.co.jp より大きい
問い合わせフォームがある⑤Turnstile の適用対象そのもの。スパム対策の実利が最も大きいのはこのドメイン
アプリ/API トラフィックがある可能性🔴 Bot Fight Mode を有効にしてはいけません。パス単位の除外ができず、正規のアプリ通信を巻き込みます
サブスクリプション課金申込・問い合わせデータに個人情報が含まれる。WAF とフォーム保護の優先度が上がる
静的LP中心キャッシュの効果が大きい。Tiered Cache + Cache Rules の投資対効果が synon.co.jp より高い

費用

¥0
フェーズ1の範囲は syncsync.jp でも追加費用ゼロ
0席
ドメイン追加で Zero Trust シートは消費しない
$20/月
1ゾーンだけ Pro 化する場合(新しい判断ポイント)
項目内容
Cloudflare ゾーン1アカウントに複数ゾーンを無料で追加可能。syncsync.jp を Free で追加しても課金は発生しません
Zero Trust シートドメインを追加してもシートは消費しません(シートはユーザー単位)。50シート問題に影響なし
1ゾーンだけ Pro 化(約$20/月)🔵 どちらのゾーンを Pro にするかが新しい判断ポイント。Webhook 通知はアカウント全体で解禁されるため、顧客影響が大きい syncsync.jp を Pro にするのが合理的8.2節

やってはいけないこと(先に読む)

#禁止事項起きること
1🔴 DKIM レコードを控えずに NS を切り替える送信メールの DKIM 署名が検証不能になり、DMARC も同時に落ちる
2🔴 apex(syncsync.jp)をいきなりオレンジ雲にする受信メールが全滅する(MX が apex を指しているため)
3🔴 ワイルドカードをオレンジ雲にして Full (strict) にする未登録サブドメインが 526 エラー(Xserver はワイルドカード証明書を持てない)
4🔴 api.syncsync.jp をオレンジ雲にするGoogle Sites 側で SSL エラー(525)。CNAME Flattening を "Flatten all" にすると所有権確認も壊れる
5🔴 Bot Fight Mode を有効にするパス単位の除外ができず、プロダクトのアプリ/API 通信を巻き込む
6🔴 +a:svXXXXX.xserver.jp を SPF に残したままにするXserver のサーバー移転でホスト名が変わり、SPF が静かに壊れる
7⚠️ Xserver サーバーパネルの「アクセス制限」を使う無料独自SSL の自動更新が失敗すると公式が明記

1実測した現状(2026-08-17 時点)

DNS レコード

syncsync.jp の現状 ── すべてが単一IP・単一サーバに集約されている 権威DNS ns1〜ns5.xserver.jp レコード A syncsync.jp → 198.51.100.10 * ワイルドカード → 198.51.100.10 A www → 198.51.100.10 CNAME mail → svXXXXX.xserver.jp CNAME api → ghs.googlehosted.com MX 0 syncsync.jp. ← apex 自身 TXT default._domainkey(DKIM 稼働中) TXT SPF(6ルックアップ・冗長) TXT _dmarc p=none / rua 片方不達 エックスサーバー svXXXXX.xserver.jp 198.51.100.10 Web・メール・FTP がすべて同居 = 単一障害点かつ単一の秘匿対象 赤=移管時の地雷  青=プロキシしてはいけないもの  緑=失うと即座に壊れるもの
図2: syncsync.jp の現状。Web・メール・FTP がすべて同一IPに乗っているため、「apex をプロキシする」判断が受信メールに直結する
syncsync.jp
  NS        ns1〜ns5.xserver.jp
  SOA       ns1.xserver.jp. root.xserver.jp.
  A         198.51.100.10        (PTR: svXXXXX.xserver.jp)
  *  (A)    198.51.100.10        ★ワイルドカードが存在
  www (A)   198.51.100.10
  mail      CNAME → svXXXXX.xserver.jp   ★明示レコードあり
  api       CNAME → ghs.googlehosted.com ★Google Sites / Workspace 系
  MX        0 syncsync.jp.        ★apex 自身を指している
  TXT       "v=spf1 +a:svXXXXX.xserver.jp +a:syncsync.jp +mx include:spf.sender.xserver.jp ~all"
  TXT       "google-site-verification=(Search Console 発行の43文字。現行値をそのまま転記)"
  _dmarc    "v=DMARC1; p=none; rua=mailto:noreply@syncsync.jp,mailto:sample@synon.co.jp;"
  default._domainkey   "v=DKIM1; k=rsa; p=XXXXXXXXXXXXXXXXXXXXXXXXXXXX..."  ★RSA 2048bit
  _adsp._domainkey     "dkim=unknown"        (ADSP は RFC 6686 で Historic。移管不要)
  DS / CAA / AAAA      なし
  _mta-sts / _smtp._tls / default._bimi   なし

診断結果

項目状態評価
DKIMdefault セレクタ・RSA 2048bit で稼働中✅ 良好。ただし移管時の退避が必須
SPF6ルックアップ。+a:svXXXXX +a:syncsync.jp +mxすべて同一IPを指す完全な冗長⚠️ 機能はしているが整理が必要
DMARCp=none。rua は2件だが片方(外部ドメイン宛)は届いていない⚠️ 可視化が半分しか効いていない
MXapex 自身を指す(Xserver 標準構成)🔴 Cloudflare 移管時の最大の地雷
ワイルドカード存在🔴 棚卸し不能・フィッシングの温床
DNSSEC未設定(DS なし)— 移管時の事故リスクは無い(むしろ好都合)
CAA未設定⚠️ 証明書の不正発行を防ぐレコードが無い
MTA-STS / TLS-RPT未設定⚠️ TLS-RPT は入れるべき。MTA-STS は入れてはいけない
BIMI未設定p=none では前提を満たさないため対象外

MTA-STS を「入れてはいけない」理由

synon.co.jp 版の手順書では MTA-STS を Workers でホストする方法を推奨しましたが、syncsync.jp では推奨しません。

MTA-STS の enforce モードは、受信MXホストが提示するTLS証明書の名前が MX ホスト名と一致することを要求します。ところが Xserver の公式FAQは、独自ドメイン名をメールサーバ名に指定した場合について次のように明記しています。

Xserver 公式FAQ 「SMTP/POP3/IMAP over SSLには対応しておりません」

つまり メールサーバの証明書は sv***.xserver.jp 系であり、syncsync.jp とは一致しない可能性が極めて高い。この状態で MTA-STS を enforce で公開すると、受信メールが配送不能になる恐れがあります。

これは公式ドキュメントからの推論です。実測して確定させてください
echo | openssl s_client -starttls smtp -connect syncsync.jp:25 -servername syncsync.jp 2>/dev/null \
  | openssl x509 -noout -subject -ext subjectAltName

提示された SAN に syncsync.jp が含まれていなければ、MTA-STS は導入不可(少なくとも enforce は不可)です。

代わりに TLS-RPT だけを入れてください 単独で導入でき、無害で、STARTTLS の失敗を可視化できます(5.5節)。

2synon.co.jp との比較 本書の中核

全体比較表

項目synon.co.jp(コーポレート)syncsync.jp(プロダクト)差の意味
サイトの性格会社案内SaaS製品サイト(SyncSync Form)停止時の損失は syncsync.jp のほうが大きい
構築基盤STUDIO(ノーコード / Google Cloud)Xserver(共有サーバ)オリジンの制御可能範囲が全く違う
NSXserverXserver同じ(移管作業は同手順)
apex A203.0.113.10(Google Cloud)198.51.100.10(Xserver)
www A198.51.100.10(Xserver)198.51.100.10(Xserver)⚠️ synon.co.jp は apex と www で別基盤。要確認事項
ワイルドカードあり(→ Google Cloud)あり(→ Xserver)両方に存在。どちらも棚卸しが必要
メール(MX)Google Workspace(5レコード)Xserver 自前MX 0 syncsync.jp🔴 手順が根本的に違う最大の要因
DKIMdefault(Xserver)のみ。Google Workspace 用は未設定default(Xserver)で稼働中synon.co.jp は Google 用 DKIM の新規設定が必要。syncsync.jp は既存レコードの退避が必要
SPF ルックアップ8 / 10(Google が抜けている)6 / 10(冗長だが機能している)synon.co.jp のほうが深刻
DMARCp=nonerua なし=レポート皆無)p=none + rua 2件(うち1件は届いていないどちらも実質的に可視化できていない
Origin CA 設置✅ 可(EC2 に設置可能)不可(Xserver は他社証明書持ち込み非対応)🔴 SSL 方針が分岐する決定的な差
mTLS(AOP)✅ 可不可(共有サーバのため)同上
Full (strict)✅ Origin CA で確実に成立⚠️ 条件付き(Let's Encrypt 自動更新の継続が絶対条件)syncsync.jp は継続監視が必須
オリジンIP秘匿✅ 可(SGで Cloudflare IP に限定)⚠️ 限定的(.htaccess のみ。メール・FTPには効かない)
Bot Fight Mode判断による🔴 OFF 必須(アプリ/API があるため)
Turnstile の実利中(コーポレートの問い合わせ)大(製品の問い合わせフォーム)⑤ を先にやるなら syncsync.jp
キャッシュの効果大(静的LP中心)⑦ の投資対効果は syncsync.jp が高い

「同じ手順が使えるもの / 使えないもの」

施策synon.co.jp 版の手順を流用できるか
① DNS移管の考え方(グレー雲で移管 → 証明書確認 → オレンジ雲)そのまま使える(ただし apex の扱いが分岐。4.4節)
① プロキシ判断(MX/mail をグレー雲)⚠️ 原則は同じだが、MX が apex を指すため追加の判断が必要(4.3節)
① SSL/TLS を Full (strict) に使えない。Origin CA も AOP も不可。別設計(4.5節)
① WAF Custom Rules 5本⚠️ 配分を変える(プロダクトサイト向けに再設計。4.6節)
① DDoS / Tiered Cache / Always Online✅ そのまま使える
② DMARC Managementそのまま使える(Cloudflare DNS 移管が前提なのは同じ)
② DKIM 設定手順使えない。Google Workspace ではなく Xserver サーバーパネルの手順(5.2節)
② SPF 修正使えない。推奨値が全く違う(5.3節)
② MTA-STS使えない。syncsync.jp では導入してはいけない(1.3節)
⑤ Turnstileそのまま使える(実装コードは同一)
⑥ Web Analytics / ⑦ Cache / ⑧ Security Center✅ そのまま使える
Zero Trust(WARP + Tunnel)ドメイン非依存のため2ドメイン共通。追加作業なし

どちらを先にやるべきか

結論:syncsync.jp を先に着手することを推奨します
#理由
1メールが Xserver 完結で構成が単純。synon.co.jp は Google Workspace + HubSpot + Xserver の三者が絡み、送信元の棚卸しに時間がかかります
2DKIM が既に動いている。synon.co.jp は Google 用 DKIM の新規設定+反映待ち(最大48時間)が必要ですが、syncsync.jp は既存レコードを移すだけ
3顧客影響のあるサイトで先に効果を出せる。WAF・キャッシュ・Turnstile の実利が大きい
4失敗の学習コストが安い。Xserver 単独構成のほうが切り分けが容易。ここで Cloudflare の運用に慣れてから、構成が複雑な synon.co.jp に着手できます
ただし1点だけ例外があります synon.co.jp の Google Workspace DKIM 有効化と SPF 修正(synon.co.jp 版 Step 2-A)は、DNS移管を待たずに今すぐ着手できる作業であり、放置すると Gmail の配信に直接影響します。この2つだけは syncsync.jp より先に、並行して実施してください。

2ドメイン運用で新たに発生する論点

#論点対応
1どちらのゾーンを Pro($20/月)にするかWebhook 通知はアカウント全体で解禁されるため、1つ Pro にすれば両ゾーンで Slack 通知が使える。顧客影響の大きい syncsync.jp を Pro にするのが合理的(WAF 強化の恩恵も大きい)
2WAF ルールの二重管理Free の Custom Rules はゾーンごとに5本。2ゾーンで計10本使えるが、共通ルールを2回書く手間が発生。Rules テンプレートを社内で標準化すること
3証明書・DNS の棚卸し対象が倍になるSecurity Center の週次レビューを2ゾーン分行う。ダングリングDNS はワイルドカードのせいで両方に潜在
4DMARC の運用が2系統synon.co.jp は Google Workspace、syncsync.jp は Xserver。同じ p=reject を目指すが、途中の判定基準と送信元の顔ぶれが違う。ランプアップは別スケジュールで管理
5Turnstile ウィジェットの管理Free は 20ウィジェット / アカウント。2ドメイン分でも十分だが、受託案件用と混ぜると枯渇する。受託案件は顧客アカウントで発行する原則を維持
6DEX / Zero Trust への影響なし。ドメイン追加はシートを消費せず、社内システム接続にも影響しません

synon.co.jp 版文書への訂正事項

本調査で、既存の synon.co.jp 版文書に精度不足が2点見つかりました。次回改訂時に反映してください。

#既存の記載正確な事実
1「DKIM が未設定」正確には「Google Workspace 用の DKIM(google セレクタ)が未設定」。Xserver 用の default._domainkey は存在し稼働しています。ただしこれは Xserver から送るメールにしか効かず、Google Workspace からの送信は依然として未署名なので、結論(Google 用 DKIM の設定が必要)は変わりません
2「オリジンは AWS EC2」を前提に Origin CA + AOP を推奨コーポレートサイトの apex は STUDIO(Google Cloud)でホストされています。EC2 は社内システム用です。STUDIO はノーコードSaaSのため Origin CA を設置できない可能性が高く、synon.co.jp の apex についても syncsync.jp と同じ「Origin CA が使えない」制約が当てはまる可能性があります。要確認事項9章
加えて www.synon.co.jp は Xserver(198.51.100.10)を指していますが、HTTP 応答が確認できませんでした。apex が STUDIO に移った際の取り残しレコード(ダングリング)の可能性があります。移管前に必ず確認してください。

3実施順序

全体像

syncsync.jp の作業は 4フェーズ・約8週間です。synon.co.jp 版と最も違うのは、「NS切替」と「プロキシ有効化」を意図的に2〜3日離す点です。Xserver は共有サーバでオリジン側の制御余地がほとんどなく、両方を同時にやると障害の切り分けが不可能になります。

4フェーズ・約8週間 ── 各フェーズに「中止条件」を置く フェーズ0 事前準備(1〜2週前) ・DKIM 退避(最優先) ・DNS 棚卸し ・TTL 300秒へ フェーズ1 ゾーン作成(1〜2日) ・全レコード1:1再現 ・全部グレー雲で ・旧NSと突合 フェーズ2 NS切替(+48h観察) ・NS を Cloudflare へ ・30分以内にメール検証 ・プロキシはまだ フェーズ3 プロキシ有効化 ・www → apex の順 ・Full → Full (strict) ・526 に注意 フェーズ4 認証強化・仕上げ ・SPF / DMARC ・Turnstile ・キャッシュ / ⑥⑦⑧ ここを 2〜3日 空ける 同時にやると切り分け不能になる 中止条件: F1=突合で差分が残る / F2=30分以内のメール着信テスト失敗 F3=526/525 が出る、SSL 自動更新の見通しが立たない
図3: 実施フェーズ。フェーズ2とフェーズ3の間隔が、この計画の設計上の要
フェーズ期間内容中止条件(ここで止めて戻す)
フェーズ0 事前準備切替の1〜2週間前DNS棚卸し・DKIM退避・TTL短縮・証明書期限記録・メールサーバ証明書のSAN確認
フェーズ1 ゾーン作成1〜2日Cloudflare にゾーン追加、全レコードをグレー雲で1:1再現、旧NSと突合突合で1件でも差分が残る
フェーズ2 NS切替1日(+48時間の観察)ネームサーバを Cloudflare へ。プロキシはまだ有効化しない30分以内のメール着信テストが失敗
フェーズ3 プロキシ有効化切替から2〜3日後www@ の順にオレンジ雲。SSL を Full → Full (strict)526/525 が出る、SSL自動更新の見通しが立たない
フェーズ4 認証強化・仕上げ1〜4週間SPF短縮・DMARC修正・TLS-RPT・DNSSEC・CAA・Turnstile・キャッシュ

「NS切替」と「プロキシ有効化」を分ける理由

これは syncsync.jp 版で特に強調したい設計判断です。

分けることで得られるもの ── 「切り戻しにかかる時間」が決定的に違う 同時にやった場合 メールが届かない → NSの設定ミスか、apex プロキシのせいか切り分けられない サイトが 526 → DNS伝播途中か、SSL要件を満たしていないのか不明 切り戻しに旧NSへの再変更が必要 → 復旧まで最大 24時間 分離した場合 NS切替直後はレコード内容だけが変数 → メールが壊れたら「レコードの写し間違い」と即断できる プロキシ有効化直後の 526 は → 100% SSL 要件の問題だと断定できる プロキシをグレー雲に戻すだけ → 復旧まで 数分(TTL 300秒)
図4: フェーズ2とフェーズ3を分ける効果。フェーズ3以降の障害はすべてダッシュボードのトグル操作で数分以内に切り戻せる
これが最大の利点です フェーズ3以降の障害は、すべて Cloudflare ダッシュボード上のトグル操作で数分以内に切り戻せます。NS を戻す必要がある事態を、フェーズ2の48時間の観察期間で潰しておくのが狙いです。

作業カレンダー(例:着手週を W0 とする)

作業担当所要
W0 月フェーズ0-1〜4(棚卸し・DKIM退避・証明書確認)情シス3h
W0 水フェーズ0-5(TTL を 300 秒へ)情シス15分
W1 火フェーズ1(Cloudflare ゾーン作成・全レコード再現・突合)情シス2h
W1 火 20:00フェーズ2(NS切替)情シス30分+着信テスト30分
W1 水〜木観察期間(プロキシ有効化しない)
W2 木 20:00フェーズ3-17(www をオレンジ雲)情シス1h
W2 金終日観察
W3 火 20:00フェーズ3-18(apex をオレンジ雲+MX付替え)情シス1h+メール再テスト
W3〜W4Cloudflare WAF を Log モードで観測情シス週2回15分
W5WAF を Block へ・SPF短縮・DMARC修正情シス2h
W6Turnstile 実装(問い合わせフォーム)開発4h
W7⑥⑦⑧・DNSSEC・CAA情シス2h
W8ワイルドカード廃止判断(Log 観測結果をもとに)情シス1h
金曜夕方の切替は禁止です 問題が発覚するのは土日で、Free プランにはテクニカルサポートも SLA も存在しません。火曜〜木曜の業務終了後に実施してください。

4Step 1 — ①DNS移管 + WAF / DDoS / CDN / SSL(Xserver 版)

4.1 フェーズ0:事前準備(ここを飛ばすと必ず事故ります)

4.1.1 DKIM レコードの退避 🔴 最優先

Xserver の DKIM 公開鍵は Xserver の DNS にしか自動投入されません。Cloudflare へ NS を切り替えた瞬間、このレコードは世界から消えます。

サーバーパネルにログインhttps://secure.xserver.ne.jp/xapanel/login/xserver/server/
メールカテゴリの「DKIM設定」をクリック
ドメイン一覧から syncsync.jp を選択
「DKIM設定一覧」タブ →[表示]ボタンをクリック
表示された TXT レコードの名前と値を全文コピー値は 400 文字超あります。途中で切れていないか必ず確認してください。
# 取得例(値はダミー。RSA 2048bit の公開鍵は 392 文字前後になる)
Name : default._domainkey.syncsync.jp
Type : TXT
Value: v=DKIM1; k=rsa; p=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
       ... (以下略・必ずサーバーパネルから実値を取得すること)
鍵が静かに変わる条件(本書で最も見落とされやすい罠) Xserver が DKIM 鍵を再生成すると、Xserver 側の秘密鍵は変わるのに Cloudflare 上の公開鍵は古いままになり、DKIM が無言で fail します。エラーも警告も出ません。

再生成が起きる操作:

  • サーバーパネル > DKIM設定 の OFF → ON トグル
  • 「新サーバー簡単移行」(サーバー移転)
  • プラン変更に伴うサーバー移設

→ 上記のいずれかを行ったら、必ず[表示]で現在値を再取得し、Cloudflare の TXT と突合してください(8.3節の恒久タスク)。

4.1.2 全 DNS レコードの棚卸し

一次情報(正): サーバーパネル > 「DNSレコード設定」 の全レコードを CSV / スクリーンショットで保存。併せて外部から実測して突合します(自動スキャンの取りこぼしを検出するため)。

# 権威DNSに直接問い合わせる
for t in A AAAA MX TXT NS CAA SOA; do
  dig @ns1.xserver.jp $t syncsync.jp +noall +answer
done

for h in www api mail ftp smtp pop imap autodiscover autoconfig cpanel webmail; do
  dig @ns1.xserver.jp A     $h.syncsync.jp +noall +answer
  dig @ns1.xserver.jp CNAME $h.syncsync.jp +noall +answer
done

# 特殊レコード
dig @ns1.xserver.jp TXT default._domainkey.syncsync.jp +noall +answer
dig @ns1.xserver.jp TXT _dmarc.syncsync.jp +noall +answer

# ワイルドカードの確認(存在すれば何でも解決する)
dig @ns1.xserver.jp A zzq7x9-nonexistent.syncsync.jp +noall +answer

さらに、実在サブドメインの棚卸し(ワイルドカード対策)。ワイルドカードがあるため「DNS を見れば実在サブドメインが分かる」という前提が成立しません。以下3つを突き合わせます。

情報源取得方法位置づけ
Xserver のドメイン設定/サブドメイン設定サーバーパネル > 「ドメイン設定」「サブドメイン設定」の一覧🥇 これが正解の一次情報。実際に vhost が存在するホスト名
アクセスログの Host ヘッダ(過去3ヶ月)awk '{print $NF}' access_log | sort | uniq -c | sort -rn実際に使われているホスト名
証明書透明性ログ(CT)https://crt.sh/?q=%25.syncsync.jp過去に証明書が発行されたホスト名(=誰かが使った痕跡)

現時点で判明しているもの: @(apex) / www / api / mail / ftp(要確認:ワイルドカード由来の可能性)

4.1.3 メールサーバ証明書の SAN 確認(MTA-STS の可否を確定させる)

echo | openssl s_client -starttls smtp -connect syncsync.jp:25 -servername syncsync.jp 2>/dev/null \
  | openssl x509 -noout -subject -issuer -ext subjectAltName

# 465 (SMTPS) でも確認
echo | openssl s_client -connect syncsync.jp:465 -servername syncsync.jp 2>/dev/null \
  | openssl x509 -noout -subject -ext subjectAltName
結果判断
SAN に syncsync.jp含まれるMTA-STS を testingenforce で導入可能(それでも段階導入すること)
SAN が *.xserver.jpのみ🔴 MTA-STS 導入不可。TLS-RPT のみ。これが濃厚な想定です

4.1.4 現行 SSL 証明書の有効期限を記録

echo | openssl s_client -connect 198.51.100.10:443 -servername syncsync.jp 2>/dev/null \
  | openssl x509 -noout -dates -issuer -subject

notAfter の日付をカレンダーに登録します。Xserver の無料独自SSL は有効期間90日で、自動更新は「期限の30日前・25日前・20日前」の3回試行されます。この更新ウィンドウが、フェーズ3以降の最重要監視ポイントになります(4.5節)。

4.1.5 TTL を下げる

サーバーパネル > DNSレコード設定 で、主要レコード(A / MX / TXT)の TTL を 300秒に変更します。切替の48時間前までに実施してください。切り戻しが必要になった際の復旧時間がここで決まります。

4.1.6 Xserver 側セキュリティ機能の棚卸し 🔴 Cloudflare と衝突します

前提となる事実 Cloudflare をオレンジ雲にすると、Xserver から見た接続元IPは「すべて Cloudflare の anycast IP(Cloudflare, Inc. 名義/米国登録)」になります。この事実が Xserver の各種セキュリティ機能を誤発火させます。
Xserver の機能(サーバーパネル)初期状態プロキシ後の挙動推奨
WordPressセキュリティ設定 > 国外アクセス制限🔴 ONCloudflare IP を「国外IP/海外クラウド所有IP」と判定し、管理画面・ログイン・REST API が全面ブロックされる可能性が非常に高いOFF にし、同等の防御を Cloudflare WAF(Country ルール)で実装
同 > ログイン試行回数制限ON全アクセスが少数の Cloudflare IP に見えるため誤発火しやすいOFF にし、Cloudflare Rate Limiting へ移管
同 > REST API 制限 / XML-RPC 制限ON同上用途次第。API を使うなら Cloudflare 側で制御
WAF設定(XSS/SQL/ファイル/メール/コマンド/PHP の6種)ON誤検知が多い。Cloudflare Events に記録がないのに 403 が返る残す(オリジン直叩きへの最終防衛)。誤検知が出た該当ルールのみ OFF
アクセス制限(Basic認証等)OFF🔴 有効だと無料独自SSL の自動更新が失敗すると公式が明記使わない
アクセス拒否設定ブラックリスト専用(許可リスト機能なし)オリジン秘匿には使えない。.htaccess で実装(4.5.6)
代替手段 2025/06/04 に Xserver に 「指定したIPアドレスからの接続を許可」 機能が追加されています。ここに Cloudflare の IP レンジを登録すれば「国外アクセス制限」を ON のまま維持できる可能性があります。

⚠️ ただし 登録可能件数の上限と CIDR 表記の可否が公式マニュアルに明記されていません。Cloudflare は IPv4 だけで15レンジあります。事前に検証してください9章)。収まらないなら「国外アクセス制限 OFF + Cloudflare WAF」のほうが構成として健全です。

4.1.7 訪問者の実IPを復元する準備

Xserver は共有サーバのため mod_remoteip / ngx_http_realip_module利用者が設定できません。Cloudflare 経由だとアクセスログもアプリも「全員が Cloudflare のIP」に見えます。

WordPress の場合(推奨):Cloudflare 公式プラグイン(Cloudflare by Cloudflare, Inc.)を導入して REMOTE_ADDRCF-Connecting-IP で置換するか、wp-config.php先頭に以下を記述します。

<?php if (isset($_SERVER['HTTP_CF_CONNECTING_IP']))
  $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
これを入れないと コメントスパム対策・ログイン試行制限系プラグイン(SiteGuard, Wordfence 等)が「全員が同じIP」と誤認し、正当ユーザーを巻き込んでブロックします。プロキシ有効化(フェーズ3)より前に入れてください。
Cloudflare 公式の注記 "This command will only make the IP address available to scripts that need it. It doesn't store the IP in your actual server logs." ── サーバのアクセスログには依然として Cloudflare のIPが記録されます。実IPベースの解析は Cloudflare 側の Analytics に寄せる、と割り切るのが現実的です(⑥Web Analytics が効いてくる理由でもあります)。

4.2 フェーズ1:Cloudflare ゾーン作成(NS はまだ切り替えない)

4.2.1 ゾーン追加

dash.cloudflare.com にログイン(synon.co.jp と同一アカウントでOK。複数ゾーンは無料)
Add a sitesyncsync.jpFree プランを選択
自動スキャンで既存レコードが取り込まれる
Cloudflare が割り当てた 2つのネームサーバ(例 xxx.ns.cloudflare.com)を控える
自動スキャンは信用しないでください 特にワイルドカード(*)と DKIM(default._domainkey)は取りこぼされやすいレコードです。次の 4.2.2 で全件を手作業で検証します。

4.2.2 レコードの1:1再現(★このフェーズの本体)

原則:フェーズ1では全レコードを「DNS only(グレー雲)」で作成します。切替時の変数を最小化するためです。

TypeNameContentProxy備考
A@198.51.100.10DNS onlyフェーズ3で判断(4.4節)
Awww198.51.100.10DNS onlyフェーズ3でオレンジ雲へ
A*198.51.100.10DNS only🔴 自動スキャンで漏れやすい。必ず手動確認
Amail198.51.100.10DNS onlyCNAME を A に変換(理由は 4.3節)
Aftp198.51.100.10DNS onlyFTP はプロキシ非対応
CNAMEapighs.googlehosted.comDNS only🔴 絶対にオレンジ雲にしない(4.7節)
MX@案A: 10 mail.syncsync.jp / 案B: 0 syncsync.jp4.3節で決定
TXT@v=spf1 +a:svXXXXX.xserver.jp +a:syncsync.jp +mx include:spf.sender.xserver.jp ~all当面は現行値のまま。短縮はフェーズ4
TXT@google-site-verification=(Search Console 発行の43文字。現行値をそのまま転記)🔴 落とすと Google Workspace の所有権確認が外れる
TXTdefault._domainkey4.1.1 で取得した全文🔴 最重要
TXT_dmarc現行値のまま修正はフェーズ4(5.4節)
TXT_adsp._domainkeydkim=unknown移管不要。ADSP は RFC 6686 で Historic
DKIM の値が 255 文字を超える件について DNS の TXT レコードは1文字列あたり最大255バイトですが、Cloudflare ダッシュボードでは分割を意識する必要はありません。長い値をそのまま貼り付ければ、Cloudflare が内部で "..." "..." の連結形式に自動変換します。保存後に dig TXT default._domainkey.syncsync.jp で引き、値が連結されて元通りになることを確認してください。

4.2.3 CNAME Flattening の確認 🔴

DNS > Settings > CNAME Flattening「Flatten CNAME at root」(デフォルト) であることを確認します。

絶対に「Flatten all CNAMEs」に変更しないでください Cloudflare 公式の警告:
"If a CNAME target is being used to verify a domain for a third-party service, turning on CNAME flattening for all CNAME records may cause the verification to fail since the CNAME record itself will not be returned directly."

api.syncsync.jpghs.googlehosted.com は、CNAME が CNAME のまま返ることで Google 側がドメイン所有権を確認し証明書をプロビジョニングしています。フラット化すると A レコードとして返るため、所有権確認と証明書更新が壊れます。

4.2.4 切替前の突合検証 ★ここで差分ゼロにする

NS を切り替える前に、Cloudflare の NS に直接問い合わせて内容を検証します。これができるのが「NS切替を後回しにする」最大の利点です。

CFNS=xxx.ns.cloudflare.com    # Cloudflare が割り当てたNSに置き換える
OLDNS=ns1.xserver.jp

# 主要レコードを新旧で並べて比較
for t in A MX TXT NS SOA; do
  echo "=== $t ==="
  echo "--- OLD ---"; dig @$OLDNS $t syncsync.jp +noall +answer
  echo "--- NEW ---"; dig @$CFNS  $t syncsync.jp +noall +answer
done

# DKIM(最重要)— 値が完全一致することを目視確認
dig @$OLDNS TXT default._domainkey.syncsync.jp +noall +answer
dig @$CFNS  TXT default._domainkey.syncsync.jp +noall +answer

# ワイルドカード
dig @$CFNS A zzq7x9-nonexistent.syncsync.jp +noall +answer

チェックリスト(全項目にチェックが入るまで NS を切り替えない)

4.3 【最重要】MX が apex を指している問題 — 案A / 案B の判断

4.3.1 何が起きるのか

apex をオレンジ雲にした瞬間、受信メールが全滅する ✕ apex をプロキシした場合 送信側MTA Gmail など MX 0 syncsync.jp → apex A を引く Cloudflare 104.x / 172.6x SMTP は Cloudflare の HTTPプロキシを通らない → 配送不能 同時に SPF も壊れる(+a:syncsync.jp と +mx が Cloudflare IP に展開) ○ 案A:MX をメール専用ホストに付け替える 送信側MTA Gmail など MX 10 mail.syncsync.jp グレー雲の A レコード Xserver 198.51.100.10 メールはオリジンに直接届き、apex は Cloudflare で守れる SPF も v=spf1 mx ... に整理でき、6→4ルックアップに削減 これは「MX をグレー雲に」という一般則では防げない MX レコードはそもそもプロキシ不可なので、常にグレーである。問題は MX が指す先の A レコード。 Xserver のデフォルト DNS が MX 0 <ドメイン名> を生成するため、Xserver ユーザーは全員この地雷を踏み得る。 どちらの案でも必ずグレー雲(DNS only)にするレコード mail / smtp / pop / imap / autodiscover / autoconfig / ftp / svXXXXX を指すもの全般 / api SMTP・IMAP・POP3・FTP は Cloudflare の標準HTTPプロキシを通過できない
図5: MX が apex を指す構成の地雷と、案A による解消。Xserver のデフォルト構成に起因する、Xserver ユーザー共通の落とし穴
MX  syncsync.jp.  →  0 syncsync.jp.     ← MX が apex 自身を指している
A   syncsync.jp.  →  198.51.100.10
Cloudflare 公式 "Mail protocols such as SMTP, IMAP, and POP3 do not work through Cloudflare's standard HTTP proxy."
"the hostname it points to must also resolve to a DNS-only target"

4.3.2 案A:MX をメール専用ホストに付け替える(★推奨)

TypeNameContentProxy
Amail198.51.100.10DNS only(グレー)
MX@mail.syncsync.jp(優先度 10
A@198.51.100.10Proxied(オレンジ) ← apex を守れる
Awww198.51.100.10Proxied(オレンジ)
mail.syncsync.jp は必ず A レコードで作ること。CNAME にしないこと 現状 Xserver では mail.syncsync.jp は CNAME → svXXXXX.xserver.jp ですが、RFC 2181 §10.3 により MX の指す先は CNAME であってはなりません。Cloudflare へ移す際に A レコードに変換してください。副次効果として、svXXXXX というサーバー移転で変わるホスト名への依存も切れます。
要検証・本番切替前のテスト Xserver のメールサーバが mail.syncsync.jp 宛の SMTP 接続でも syncsync.jp 宛メールを正常に受け付けるか。同一IPなので理屈上は問題ないはずですが、Xserver 公式に「MX を変更してよい」という明示的記載は見つかりませんでした。
swaks --server 198.51.100.10 --to postmaster@syncsync.jp --from test@example.com \
      --h-Subject "MX pre-flight test" --body "test"

4.3.3 案B:apex をグレー雲のままにする(安全だが機能を捨てる)

TypeNameContentProxy
A@198.51.100.10DNS only(グレー)
Awww198.51.100.10Proxied(オレンジ)
MX@0 syncsync.jp(現状のまま)

4.3.4 どちらを選ぶか

案A(MX付替え)案B(apex グレー)
apex の DDoS/WAF 保護✅ あり❌ なし
オリジンIPの秘匿⚠️ 部分的(mail から漏れる)❌ なし
メール事故のリスク⚠️ 中(要事前テスト)✅ 低(無変更)
SPF の整理✅ しやすい⚠️ +a:syncsync.jp が残る
作業量
推奨:案A ただし 4.3.2 の swaks テストが成功することが絶対条件です。テストできない/不安が残る場合は、まず案Bで運用を開始し、www のプロキシが安定してから案Aへ移行してください。案B → 案A の移行はいつでも可能です。

4.4 フェーズ2〜3:NS切替とプロキシ有効化

4.4.1 NS 切替(フェーズ2)

Xserverアカウント(サーバーパネルではありません)で操作します。

https://secure.xserver.ne.jp/xapanel/login/xserver/ にログイン
トップページ下部の 「ドメイン」 セクション → syncsync.jp をクリック
ネームサーバー設定欄の 「設定変更」 をクリック
「その他のサービスで利用する」 を選択し、Cloudflare の2つの NS を一字一句正確に入力
「確認画面へ進む」→「設定を変更する」
公式の反映時間 「ネームサーバーの変更が完全に反映されるまでには一定時間必要となります。数時間~24時間程度を目安としてお待ちください。」

⚠️ syncsync.jp のレジストラが Xserverドメイン以外(お名前.com 等)の場合は、そちらの管理画面で変更します。JPドメインなので、レジストラ側の反映に加えて JPRS のゾーン更新タイミングも影響します。

「NS相違」「Aレコード相違」の警告は正常です Xserver 公式マニュアルが明記しています:「※ネームサーバーを他社サーバーのものでご利用される場合は、『NS相違』と表示された状態で問題ありません。」
Web(vhost)・メール・FTP はすべて動作し続けます。運用担当者に「この警告は無視してよい」と周知してください。

4.4.2 切替後30分以内に必ず実施する確認

#確認項目方法期待値
1外部→社内のメール着信Gmail 等から info@syncsync.jp へ送信数分以内に着信
2社内→外部の送信+認証info@syncsync.jp から Gmail へ送信 → 「メッセージのソースを表示」spf=PASS dkim=PASS dmarc=PASS
3Web 表示apex / www / api の3つを開く従来どおり
4メールクライアントIMAP 993 / SMTP 465 で送受信正常
5ワイルドカードdig +short A zzq7x9.syncsync.jp198.51.100.10
6DKIMdig +short TXT default._domainkey.syncsync.jp旧値と一致
#2 で dkim=PASS が出なければ、その場で切り戻してください DKIM の写し間違いが最も可能性の高い原因です。そして 24〜48時間、プロキシを有効化しないでください。DNS 移管の成否とプロキシの問題を分離するためです。

4.4.3 プロキシ有効化(フェーズ3)

手順操作直後に確認すること
SSL/TLS モードを Full(SSL/TLS > Overview)Full (strict) はまだにする
www だけオレンジ雲にサイト表示 / ログイン / 管理画面 / フォーム送信
(48時間観察)5xx が出ていないか Analytics で確認
apex をオレンジ雲に(案A採用時。先に MX を 10 mail.syncsync.jp へ変更し、mail A を作成してから)🔴 直後にメール着信・送信を再テスト
(48時間観察)
Full (strict) へ昇格526 が出ないこと(4.5節)
③ の直後のメール再テストは省略しないでください これを飛ばして週末を迎えると、月曜まで受信メールが全滅していたことに誰も気づきません。

4.5 SSL 設計 — synon.co.jp とは別物になる 🔴

4.5.1 なぜ synon.co.jp の設計が使えないのか

オリジン側の証明書をどう用意するか ── ここだけが決定的に違う synon.co.jp(EC2 を想定した設計) ブラウザ Cloudflare EC2 Universal SSL Origin CA Full (strict) + Origin CA(15年有効)+ mTLS でオリジンを固定 syncsync.jp(Xserver 共有サーバ) ブラウザ Cloudflare Xserver Universal SSL LE 証明書 Full (strict) は「LE の自動更新が回り続けること」が絶対条件 Xserver で「できないこと」── 公式が明示している制約 他社証明書の持ち込み 「SSL証明書の持ち込みには 対応しておりません」 → Origin CA 不可 クライアント証明書の設置 共有サーバのため Apache の SSL 設定を変更できない → mTLS(AOP)不可 ワイルドカード証明書 「ワイルドカードSSLは 取り扱っていません」 → * をプロキシ不可
図6: SSL 設計の分岐。synon.co.jp 版で採用した3つの要素のうち2つが、Xserver では物理的に使えない
構成要素synon.co.jpsyncsync.jp理由
Cloudflare Origin CA の設置✅ 可不可他社証明書の持ち込み非対応
Authenticated Origin Pulls(mTLS)✅ 可不可クライアント証明書の設置+Apache設定が共有サーバでは不可
Full (strict)✅ 確実に成立⚠️ 条件付きXserver の無料独自SSL(Let's Encrypt)が有効期限内で、ホスト名が一致していれば成立
ワイルドカード証明書✅(Origin CA で発行可)不可Xserver がワイルドカードSSLを扱っていない

4.5.2 採用する構成

ブラウザ ──[Universal SSL(Cloudflare 発行・無料)]──> Cloudflare
Cloudflare ──[Full (strict):Xserver の無料独自SSL = Let's Encrypt を検証]──> Xserver
Cloudflare の Full (strict) 要件(公式) 証明書が unexpired であり、a publicly trusted certificate authority または Cloudflare's Origin CA が発行し、a Common Name (CN) or Subject Alternative Name (SAN) that matches the requested or target hostname を含むこと。満たさない場合は 526 エラー。

Let's Encrypt は公的CAなので、「有効期限内」「ホスト名一致」の2条件さえ満たせば Full (strict) は成立します。

4.5.3 🔴 本件最大の未確定リスク:Let's Encrypt の自動更新がプロキシ下で回るか

Xserver 公式が明示する更新の前提条件(原文) 「対象ドメインの『wwwあり/なし』両方のAレコードが当サービスのご契約サーバーを参照している必要があります」

オレンジ雲にすると、A レコードは Cloudflare の IP を返します。この条件に文字どおり反します。

証明書90日サイクルと「気づかないまま落ちる」構造 有効期間 90日 ── この間は何も起きない 自動更新の試行期間 期限切れ 30日前 25日前 20日前 0日 更新が失敗した場合に起きること ・3回の試行はすべて静かに失敗する ・通知はなく、サイトは正常に見え続ける ・期限切れの瞬間に Full (strict) が 526 を返す → サイト全体が停止。しかも原因が見えにくい だから3つの防波堤を置く ① ACME を妨げない設定を先に入れる(Cache/WAF Skip) ② notAfter を毎日監視し、18日を切ったら警報 ③ グレー雲へ戻して手動更新するフォールバック手順 → ①②③ すべて必須。1つでも欠けると危険
図7: 526 リスクの構造。「落ちるまで誰も気づかない」性質が最大の問題であり、自前の期限監視が不可欠
見方内容
通る可能性がある公式が更新失敗の原因として「アクセス制限」「リダイレクト」を挙げていることから、検証方式は HTTP-01(/.well-known/acme-challenge/ への HTTP アクセス)である可能性が高い。プロキシ下でも Let's Encrypt → Cloudflare → Xserver と中継されるので、チャレンジファイルには到達し得る
通らない可能性があるXserver が更新前に A レコードの事前チェックを行っていれば、Cloudflare のIPを見て即失敗する。公式が条件として明記している以上、この可能性は無視できない
追加のリスクCloudflare の WAF / Bot Fight Mode / Under Attack Mode が ACME のリクエストにチャレンジを返すと失敗する

4.5.4 リスク回避策(必ず全部やる)

(a) ACME を絶対に妨げない設定を先に入れる

設定場所内容
Cache Rules ルール1Rules > Cache Rules(最上位)(http.request.uri.path contains "/.well-known/")Bypass cache
WAF Skip ルールSecurity > WAF > Custom rules(最上位)(http.request.uri.path contains "/.well-known/acme-challenge/")Skip: All remaining custom rules, Managed rules, Rate limiting
Always Use HTTPS の例外Rules > Configuration Rules/.well-known/acme-challenge/ を除外
Bot Fight ModeSecurity > Bots🔴 OFF(ACME を誤ブロックする実例あり。プロダクトサイトとしても OFF が必須 — 4.6節)
Under Attack ModeSecurity平常時 OFF

(b) 更新ウィンドウを監視する(恒久運用)

#!/bin/bash
# check-origin-cert.sh ── cron で毎日実行
EXP=$(echo | openssl s_client -connect 198.51.100.10:443 -servername syncsync.jp 2>/dev/null \
      | openssl x509 -noout -enddate | cut -d= -f2)
DAYS=$(( ($(date -d "$EXP" +%s) - $(date +%s)) / 86400 ))
echo "origin cert expires in $DAYS days ($EXP)"
if [ "$DAYS" -lt 18 ]; then
  echo "ALERT: origin certificate not renewed. 526 risk imminent." >&2
  exit 1
fi
198.51.100.10 を直接叩いている点が重要です syncsync.jp を名前解決すると Cloudflare のエッジ証明書を見てしまい、オリジンの状態が分かりません。

さらに Cloudflare 側でも二重に監視します:DEX 合成テスト(synon.co.jp 版 Step 4 で構築済み)で https://syncsync.jp/ を監視 → 526 になれば即検知。Notifications で「Origin Error Rate Alert」を設定(Free でメール通知は可能。Webhook には Pro が必要 — 8.2節)。

(c) フォールバック手順を用意しておく

Cloudflare > DNS で該当レコードを 一時的に DNS only(グレー雲) に戻す
dig で A レコードが 198.51.100.10 を返すまで待つ(TTL 300秒なので数分)
サーバーパネル > SSL設定 から 手動更新
成功を確認したらオレンジ雲へ戻す
この切り戻しが数分で済むのは、DNS が Cloudflare 側にあるからです NS を Xserver に戻す必要はありません。

(d) 代替策の確認(サポートに問い合わせる価値あり)

サーバーパネル > SSL設定 の 「他社ネームサーバーでのDNS認証」(DNS-01)更新時にも選択可能かを Xserver サポートに確認してください。DNS-01 ならプロキシの影響を一切受けません。公式マニュアルはこのオプションを「他社サーバーからの移転時の事前発行」の文脈でしか説明しておらず、継続的な自動更新に使えるかは不明です。

4.5.5 段階導入の順序

Flexible(使わない)
  ↓
Full          ← まずここで開始。オリジン証明書の内容を検証しないので 526 が出ない
  ↓  (プロキシ安定を48時間確認)
Full (strict) ← 昇格。ここで初めて 526 のリスクが顕在化する
Flexible は使わないでください オリジン間が平文になるうえ、Xserver は常時SSL化済みなのでリダイレクトループの原因になります。

4.5.6 オリジンIP秘匿(.htaccess による Cloudflare IP 制限)

サーバーパネルの「アクセス拒否設定」は拒否(ブラックリスト)専用で許可リスト機能がなく、「アクセス制限」機能は SSL 自動更新を壊すので使えません。.htaccess で実装します(サーバーパネル > 「.htaccess編集」)。

# ---- Cloudflare 以外からの HTTP アクセスを拒否(Apache 2.4 系)----
<RequireAny>
  Require ip 173.245.48.0/20
  Require ip 103.21.244.0/22
  Require ip 103.22.200.0/22
  Require ip 103.31.4.0/22
  Require ip 141.101.64.0/18
  Require ip 108.162.192.0/18
  Require ip 190.93.240.0/20
  Require ip 188.114.96.0/20
  Require ip 197.234.240.0/22
  Require ip 198.41.128.0/17
  Require ip 162.158.0.0/15
  Require ip 104.16.0.0/13
  Require ip 104.24.0.0/14
  Require ip 172.64.0.0/13
  Require ip 131.0.72.0/22
</RequireAny>

# ---- ACME チャレンジは無条件許可(SSL自動更新を守る)★絶対に消さない ----
<Files ~ "^\.well-known">
  Require all granted
</Files>
#導入にあたっての注意
1Cloudflare の IP レンジは変更されます。https://www.cloudflare.com/ips-v4/四半期ごとに確認.htaccess を更新する運用を決めること(上記は2026年8月時点)
2メールと FTP には効きません。.htaccess は HTTP のみ。オリジンIPは mail.syncsync.jp から依然として判明します
3段階導入を強く推奨。まず .htaccess なしで Cloudflare 経由を安定させ、SSL 自動更新が1サイクル(90日)成功したことを確認してから追加すること。いきなり入れると更新失敗の原因切り分けが不可能になります
4🔴 /.well-known/ の除外を絶対に忘れないこと
結論 .htaccess によるIP制限は「フェーズ4以降・SSL更新が1サイクル通ってから」。焦って入れないでください。

4.6 WAF 設計 — プロダクトサイト向けに再配分する

4.6.1 Free プランの制約

機能Free の上限
Custom Rules5本 / ゾーンLog アクションは使えない
Rate Limiting Rules1本 / ゾーン(期間は 10秒固定
Managed RulesetCloudflare Free Managed Ruleset のみ(OWASP コアルールセットは有料)
Logpush
Security Events の保持24時間
Free では Custom Rules に Log アクションがありません 「まず Log で観測してから Block」という定石が使えないため、代替として Managed Challenge を Block の手前段階として使います(誤検知しても人間なら通過できる)。

4.6.2 syncsync.jp 用の5本

Custom Rules 5本の優先順位 ── 1本目を Skip に使うのが設計の要 ① 00-skip-acme-and-api /.well-known/acme-challenge/ + api.syncsync.jp → Skip(残り全ルール・Managed・Rate Limiting) Skip ② 10-block-admin-from-outside /wp-admin/ ・/wp-login.php ・/xmlrpc.php でオフィス固定IP以外 → 管理画面の保護 Managed Challenge ③ 20-block-bad-methods-and-paths TRACE/TRACK/DEBUG ・/.git/ ・/.env ・/wp-config → 設定ファイル探索の遮断 Block ④ 30-protect-contact-form ★プロダクトサイト固有 /contact ・/inquiry への POST(bot 以外)→ ⑤Turnstile と二重で問い合わせフォームを守る Managed Challenge ⑤ 40-geo-and-asn 高リスク国からのアクセス(/.well-known/ を除く)→ Xserver の「国外アクセス制限」の代替 Managed Challenge 評価順 Rate Limiting(Free は1本・10秒固定): /wp-login.php ・/xmlrpc.php を 5リクエスト/10秒で Block 10分 Xserver の「ログイン試行回数制限」を OFF にする代わりに、Cloudflare 側で実IP単位に効かせる
図8: WAF Custom Rules の構成。Free の5本枠のうち1本を Skip ルールに投資することで、SSL 更新と API を確実に守る
#名前アクション意図
100-skip-acme-and-api(http.request.uri.path contains "/.well-known/acme-challenge/") or (http.host eq "api.syncsync.jp")Skip🔴 最上位固定。SSL更新とAPIを絶対に守る
210-block-admin-from-outside(...wp-admin/ or wp-login.php or xmlrpc.php) and not ip.src in {<オフィス固定IP>}Managed ChallengeBlock でなく Challenge にするのは、リモート勤務者を締め出さないため
320-block-bad-methods-and-paths(http.request.method in {"TRACE" "TRACK" "DEBUG"}) or (...contains "/.git/" or "/.env" or "/wp-config")Block設定ファイル・リポジトリの探索を遮断
430-protect-contact-form(...contains "/contact" or "/inquiry") and http.request.method eq "POST" and not cf.client.botManaged Challenge🔵 プロダクトサイト固有。⑤Turnstile と二重で守る
540-geo-and-asn(ip.src.country in {...}) and not (http.request.uri.path contains "/.well-known/")Managed ChallengeXserver の「国外アクセス制限」を OFF にした分をここで代替

4.6.3 🔴 Bot Fight Mode は OFF

理由説明
パス単位の除外ができないゾーン全体に一律適用され、/api//.well-known/ を除外できません
アプリ/API 通信を巻き込むSyncSync Form はモバイルアプリ/Web 両対応。アプリからの HTTP 通信は「ブラウザらしくない」ため、正規の通信がチャレンジされます
ACME を誤ブロックする実例あり4.5.3 のリスクを増幅します
決済系 Webhook を誤ブロックする実例ありサブスクリプション課金がある以上、致命的です
代わりに Bot 対策は ⑤Turnstile(フォーム単位)Custom Rule #4(パス単位の Managed Challenge) で、対象を絞って行います。これがプロダクトサイトでの正しいやり方です。

4.6.4 Xserver WAF との二重化 — 切り分けられるようにしておく

どちらが遮断したか見分け方
CloudflareSecurity > Events に記録が残る
XserverCloudflare Events に記録がないのに 403 が返る、または Cloudflare 側で 5xx になる
  1. 防御の主戦場は Cloudflare WAF に一本化(Free でも Cloudflare Free Managed Ruleset は使えます)
  2. Xserver WAF は「オリジン直叩き」への最終防衛として残す。誤検知が出たら該当ルールのみ OFF
  3. Xserver WAF の検知ルールは6種:XSS / SQL / ファイル / メール / コマンド / PHPシグネチャが素朴で、WordPress 管理画面(テーマ編集、記事本文に lsmail を含む等)で誤検知が多いことが知られています
  4. 移行直後の1〜2週間は、Cloudflare の Custom Rules を Block ではなく Managed Challenge で運用し、Security > Events を毎日確認してから Block へ

4.6.5 その他の推奨設定

設定場所推奨値備考
Always Use HTTPSSSL/TLS > Edge CertificatesON/.well-known/acme-challenge/ は Configuration Rules で例外化
Minimum TLS Version同上TLS 1.2
Automatic HTTPS Rewrites同上ON混在コンテンツ対策
HSTS同上後回し(安定後)一度入れると切り戻しが困難
BrotliSpeedON
Rocket LoaderSpeed🔴 OFFJS を壊しやすい。プロダクトサイトでは特に危険
DDoS ProtectionSecurity > DDoSデフォルトFree でも L3/L4/L7 保護は無制限
Always OnlineCaching > ConfigurationONオリジン障害時に Internet Archive のキャッシュを返す。Xserver 障害時の保険
DNSSECDNS > SettingsNS切替が Active になった後に ON現在 DS なし。有効化後にレジストラへ DS 登録

4.7 api.syncsync.jp の扱い 🔴

必ず DNS only(グレー雲)にしてください
#理由
1SSL ハンドシェイク失敗(525エラー)が多発。Google Sites / ghs.googlehosted.com をオリジンにした場合の実例が Cloudflare コミュニティに複数あり、解決策はいずれも「プロキシを外す」です
2Cloudflare 公式が SaaS ホスティングをグレー雲対象として明記。「SaaS-hosted websites(causes SSL errors, redirect loops, or broken assets)」および「Domain verification(CNAME/TXT records for third-party services)」
3CNAME フラット化の影響(4.2.3 参照)
dig CNAME api.syncsync.jp +short
# → ghs.googlehosted.com. が CNAME として返ること(A レコードに化けていないこと)

dig TXT syncsync.jp +short | grep google-site-verification
curl -sI https://api.syncsync.jp/ | head -1

4.8 ワイルドカード * の扱い

4.8.1 リスク

#リスク内容
1サブドメインテイクオーバー / ダングリングDNSXserver 側で「ドメイン設定」から外したサブドメインも DNS では解決し続けます。ワイルドカードの存在自体が「どのサブドメインが実在するか」の把握を不可能にし、棚卸しを妨げます
2フィッシングlogin-microsoft-verify.syncsync.jp のような任意の詐称的サブドメインが自社ドメインで解決してしまいます。攻撃者がサーバ側に何も置けなくても、「解決する」こと自体が組織的信用の材料に使われます。顧客を持つプロダクトドメインでは実害が大きい
3CT ログによる無差別発行の助長ワイルドカード+HTTP-01 の組み合わせは、意図しないホスト名で証明書が取れる余地を生みます
4SPF / MX との干渉ワイルドカードをオレンジ雲にすると、* にマッチする全ホストが Cloudflare IP を返します。mail smtp 等の明示レコードを作り忘れると、メール系ホスト名がプロキシに吸われます
5Security Insights の可視性低下「unproxied records」「dangling records」の粒度検査が無意味になります

4.8.2 Cloudflare での挙動(公式仕様)

仕様内容
プロキシ可否"Customers on all plans can create and proxy wildcard DNS records."(以前は Enterprise 限定でしたが、現在は全プランで可能)
多階層"Wildcards are multi-level by default" — *.syncsync.jpa.b.syncsync.jp もカバー(Xserver の現状と同じ挙動)
明示レコードの優先"A wildcard record applies only when no exact record exists at the queried name." — www / api / mail の明示レコードは従来どおり優先されます

4.8.3 🔴 ワイルドカードをオレンジ雲+Full (strict) にしてはいけない

レイヤ状況
ブラウザ ⇔ CloudflareUniversal SSL が *.syncsync.jp1階層までカバー → OK
Cloudflare ⇔ Xserver(Full strict)🔴 Xserver はワイルドカード証明書を扱っておらず、「ドメイン設定/サブドメイン設定」に登録して無料独自SSLを個別発行したホスト名しか証明書を持たない → 未登録サブドメインは 526 エラー

Total TLS(深い階層をカバー)は Advanced Certificate Manager(有料アドオン)が必要で、しかもオリジン側の問題は解決しません。

4.8.4 段階的な廃止手順(フェーズ4以降)

ワイルドカード廃止は「移管とは別フェーズ」で段階的に 1. 棚卸し ドメイン設定一覧 アクセスログ CT ログ 2. 1:1 再現 移管時は * も含めて そのまま再現する 何も壊さないのが最優先 3. 観測 2〜4週 明示レコード以外の host へのアクセスを Managed Challenge で可視化 4. 削除 or 受け皿 ヒット0 → * を削除 心配なら 301 リダイレクト (多階層は TLS エラー) 5. 見返り np=reject が使える 実在しないサブドメインを 騙るなりすましを即拒否 検証: dig +short A randomxyz987.syncsync.jp が NXDOMAIN になり、www / api / MX は従来どおり解決すること
図9: ワイルドカード廃止の5段階。移管と同時にやらず、観測期間を挟むのが要点
ワイルドカードを廃止したら、DMARC に np=reject を付けられます 存在しないサブドメインを騙るなりすましを即座に拒否できます(5.4節)。これがワイルドカード廃止の直接的な見返りです。

恒久運用:新規サブドメインは「Xserver のサブドメイン設定」と「Cloudflare の明示レコード」を必ずセットで作る運用に。Security Center > Security Insights で Dangling レコード検出を月次チェック。

5Step 2 — ②メール認証(Xserver 版)

この章は synon.co.jp 版と互換性がありません synon.co.jp は Google Workspace が送信元ですが、syncsync.jp は Xserver 自前のメールサーバが送信元です。設定場所も推奨値も別物です。

5.1 現状と到達目標

項目現状到達目標難易度
DKIMdefault セレクタ・RSA 2048bit で稼働中移管後も同じ値で稼働(+鍵再生成時の突合運用)低(写すだけ)だが失敗の代償が最大
SPF⚠️ 6ルックアップ・3メカニズムが同一IPを指す完全な冗長v=spf1 mx include:spf.sender.xserver.jp ~all4ルックアップ中(実測が必要)
DMARC⚠️ p=none・rua 2件中1件が届いていないp=reject; sp=reject; np=reject + Cloudflare DMARC Management中(4ヶ月のランプアップ)
TLS-RPT❌ 未設定v=TLSRPTv1; rua=mailto:tlsrpt@syncsync.jp
MTA-STS❌ 未設定🔴 導入しない(1.3節・5.5節)
CAA❌ 未設定発行可能CAを限定 + ワイルドカード発行を禁止
BIMI❌ 未設定対象外p=quarantine 以上が前提。VMC に年額十数万円)

5.2 DKIM — 「設定する」のではなく「守る」

移管で「秘密鍵と公開鍵の管理者」が2つに分かれる ── これが事故の温床 移管前:Xserver が両方を管理 秘密鍵(署名) Xserver 内部 公開鍵(TXT) Xserver の DNS 自動的に整合する(人が意識する必要がない) 移管後:管理者が2つに分かれる 秘密鍵(署名) Xserver が管理 公開鍵(TXT) Cloudflare が管理 手動でしか同期しない ズレても警告は一切出ない Xserver 側で鍵が再生成される3つの操作 ── どれも「無言で DKIM が fail」する DKIM設定の OFF → ON トグル操作しただけで再生成 新サーバー簡単移行 IPとホスト名も同時に変わる プラン変更に伴う移設 意図せず発生することがある
図10: DKIM の管理者が分離する構造。これが「月次で突合する」という運用ルールが必要な理由

5.2.1 何をするのか

syncsync.jp の DKIM は既に動いています。この章の目的は新規設定ではなく、移管の過程で壊さないことと、将来静かに壊れるのを防ぐことの2点です。

5.2.2 手順

現在値の取得サーバーパネル > 「DKIM設定」 > 対象ドメイン > 「DKIM設定一覧」 >[表示]
Cloudflare に登録Type=TXT / Name=default._domainkey / Content=[表示]の全文 / TTL=Auto
255バイト分割は不要。Cloudflare が内部で自動変換します
検証旧NSと新NSで値が完全一致すること、および実送信で dkim=pass header.s=default が出ること
Xserver 側の設定は触らないサーバーパネルの DKIM設定は「ON のまま」にしておきます。OFF にすると署名自体が止まります
# 値が旧NSと完全一致すること
dig @ns1.xserver.jp        TXT default._domainkey.syncsync.jp +short > /tmp/old.txt
dig @<CloudflareのNS>      TXT default._domainkey.syncsync.jp +short > /tmp/new.txt
diff /tmp/old.txt /tmp/new.txt && echo "MATCH"

# 実際の署名検証(NS切替後)— Gmail の「メッセージのソースを表示」で確認
#   Authentication-Results: mx.google.com;
#     dkim=pass header.i=@syncsync.jp header.s=default
Xserver 公式マニュアルの注記 「他社ネームサーバーを利用する場合は、サーバーパネルで設定を行った後、他社ネームサーバー側でDNSレコードを追加してください」
つまり DNS レコードだけが Cloudflare 側に移る、という理解が正しいです。

5.2.3 🔴 恒久運用:鍵の突合を月次タスクにする

■ 月次(毎月第1営業日・所要5分)
  1. サーバーパネル > DKIM設定 >[表示]で現在の公開鍵を取得
  2. dig +short TXT default._domainkey.syncsync.jp と突合
  3. 不一致なら Cloudflare の TXT を更新

■ Xserver の以下の操作を行った直後は、必ず即日で上記を実施
  - DKIM設定の ON/OFF 操作
  - 新サーバー簡単移行
  - プラン変更
#!/bin/bash
# dkim-drift-check.sh ── cron で月次実行
CUR=$(dig +short TXT default._domainkey.syncsync.jp | tr -d '"' | tr -d ' ')
KNOWN=$(cat /etc/syncsync/dkim-known-good.txt)
if [ "$CUR" != "$KNOWN" ]; then
  echo "ALERT: DKIM record for syncsync.jp changed." >&2
  exit 1
fi
echo "DKIM record OK"
このスクリプトの限界 これは「DNS 上の値が変わったか」を見るだけで、「Xserver 側の秘密鍵が変わったか」は分かりません。本当の検知は DMARC 集約レポートで dkim=fail が急増することです(5.4節)。だから DMARC Management を必ず有効化してください。

5.3 SPF — 6ルックアップを4に減らす

SPF ルックアップ 6 → 4 ── 冗長を削り、将来の追加余地を作る 現状:6 / 10 ルックアップ +a:svXXXXX.xserver.jp 移転で壊れる +a:syncsync.jp プロキシで壊れる +mx apex を指す限り同じ問題 include:spf.sender.xserver.jp 必要 └ _spf.sender4 / _spf.sender5(+2) 3メカニズムが同じ 198.51.100.10 を指す完全な冗長 推奨:4 / 10 ルックアップ v=spf1 mx include:spf.sender.xserver.jp ~all mx → mail.syncsync.jp(グレー雲・A)→ オリジンの実IP プロキシの影響を受けない 移転時は mail の A を1箇所直すだけ → 6回分の余裕ができる(将来 Google Workspace 等を追加可能) 上限(10回)を超えると permerror ── 「SPF なし」より悪い DMARC の SPF 側判定が常に fail する。include:_spf.google.com は単独で 4回消費するため、現状の 6 に足すと即超過
図11: SPF の削減。単に短くするのではなく、「プロキシとサーバー移転の両方に強い形」に組み替えるのが要点

5.3.1 現状の何が問題か

v=spf1 +a:svXXXXX.xserver.jp +a:syncsync.jp +mx include:spf.sender.xserver.jp ~all

# 実測した展開結果
syncsync.jp          A → 198.51.100.10
svXXXXX.xserver.jp   A → 198.51.100.10
MX = syncsync.jp     → A → 198.51.100.10     ← 3つとも同じIP

include:spf.sender.xserver.jp
  → spf.sender.xserver.jp   "v=spf1 include:_spf.sender4.xserver.jp include:_spf.sender5.xserver.jp ~all"
  → _spf.sender4.xserver.jp  ip4:183.181.94.185/.186/.187/.188, 183.181.99.206/.207/.208, 183.181.94.252
  → _spf.sender5.xserver.jp  ip4:183.90.235.128/25, 202.233.64.0/24, 85.131.196.0/24, ...

198.51.100.10 は上記の送信リレー群(183.x / 202.x / 85.x)に含まれていません。つまり「サーバ自身のIP」と「Xserver の送信リレー」は別物で、両方を書く現在の構成には理由がある可能性があります(5.3.3 で実測して確定させます)。

5.3.2 🔴 Cloudflare プロキシで SPF が壊れる仕組み

メカニズムapex をオレンジ雲にした後
+a:syncsync.jpapex A が Cloudflare の anycast IP に解決される → 198.51.100.10 が認可されなくなり、Cloudflare のIP群が代わりに認可される(他人の送信も通り得る危険な状態)
+mxMX ホストが syncsync.jp なので同じ問題
+a:svXXXXX.xserver.jpxserver.jp ゾーンで解決されるので影響を受けない(ただし別の問題がある)

これは 4.3節の MX 問題と表裏一体です。apex をプロキシすると、受信(MX)と送信認証(SPF)が同時に壊れます。

5.3.3 実測して確定させる

#送信経路手順
1メールクライアント(SMTP-AUTH 587/465)Thunderbird 等から info@syncsync.jp → Gmail へ送信
2Web フォーム(PHP mail()サイトの問い合わせフォームから、宛先を Gmail に設定して送信
3Xserver Webメールブラウザの Webメールから Gmail へ送信
Received: from svXXXXX.xserver.jp (svXXXXX.xserver.jp. [198.51.100.10])
        by mx.google.com with ESMTPS id ...
                                          ↑ ここのIPが 198.51.100.10 か 183.x/202.x/85.x か
3経路すべてで観測されたIP推奨 SPF
183.x / 202.x / 85.x のみv=spf1 include:spf.sender.xserver.jp ~all3ルックアップ
198.51.100.10 も含むv=spf1 mx include:spf.sender.xserver.jp ~all4ルックアップ)← 保守的な既定値

補助ツール:check-auth@verifier.port25.com へ送信すると SPF/DKIM/DMARC の判定結果が自動返信されます。Cloudflare DMARC Management のレポートで送信元IPを網羅的に把握し、1ヶ月運用してから SPF を確定させるのが最も確実です。

5.3.4 推奨する移管後の値

v=spf1 mx include:spf.sender.xserver.jp ~all       # 案A(MX付替え)採用時
v=spf1 a:mail.syncsync.jp include:spf.sender.xserver.jp ~all   # 案B の場合はこちら
なぜこれが良いのか説明
SPF と MX が単一の情報源で連動するMX が mail.syncsync.jp(グレー雲・A=198.51.100.10)を指しているので、mx メカニズムは常にオリジンの実IPに解決されます。プロキシの影響を受けません
サーバー移転に強い移転時は mail.syncsync.jp の A レコードを1箇所直すだけ。SPF は書き換え不要
svXXXXX への依存が消えるサーバー移転でホスト名が変わっても壊れません
ルックアップに余裕ができる将来 Google Workspace や MA ツールを追加できます
SPF を変更した直後の1週間は、DMARC レポートを毎日確認してください 見落としていた送信経路(社内の業務システム、監視ツール、CI からの通知メール等)が spf=fail になっている可能性があります。~all(softfail)なので即座に配信不能にはなりませんが、受信側のスパム判定は確実に厳しくなります。

変更のタイミングはフェーズ4(プロキシが安定してから)。移管と同時に変えないでください。

5.4 DMARC — rua の修正と Cloudflare DMARC Management

5.4.1 現状の問題

_dmarc.syncsync.jp  TXT  "v=DMARC1; p=none; rua=mailto:noreply@syncsync.jp,mailto:sample@synon.co.jp;"
#問題深刻度
1外部ドメイン宛のためレポートが届いていない🔴
2rua の宛先は DNS に記載される=全世界に公開される(宛先の選び方に注意が必要)🔴 ガバナンス
3noreply@syncsync.jp が受け皿として不適切⚠️
4p=none のまま止まっている=なりすましを一切ブロックしていない⚠️

5.4.2 なぜ届かないのか(RFC 9990 §4)

外部宛先検証(RFC 9990 §4)── 受信側が「受け取ってよい」と宣言していないと破棄される 受信者(Gmail 等) レポートを作る側 _dmarc.syncsync.jp を読む rua=mailto:...@synon.co.jp を発見 自ドメイン以外なので確認する syncsync.jp._report._dmarc.synon.co.jp NXDOMAIN(レコードが存在しない) 実測で確認済み URI を破棄 MUST be ignored 実測による裏付け syncsync.jp._report._dmarc.synon.co.jp → NXDOMAIN *._report._dmarc.synon.co.jp → NXDOMAIN _dmarc.synon.co.jp → 正常に応答 ゾーンは生きている=「引けない」のではなく「存在しない」 是正には宣言レコードが必要 synon.co.jp は自社管理ドメインなので、宛先側に syncsync.jp._report._dmarc.synon.co.jp TXT "v=DMARC1" → を publish するか、rua を同一ドメイン宛にする
図12: DMARC の外部宛先検証。rua に自ドメイン外のアドレスを書く場合は、受信側の宣言レコードが必須
RFC 9990 §4 の原文 "Where the above algorithm fails to confirm that the external reporting was authorized by the Report Consumer, the URI MUST be ignored by the Mail Receiver generating the report."

→ RFC 9990 §4 に準拠する Mail Receiver(Google / Microsoft / Yahoo! JAPAN 等の主要プロバイダはいずれも準拠)は、この URI を破棄します。

5.4.3 ガバナンス上の問題

#問題
1属人化 / 退職リスク。rua を個人のアカウント宛にすると、退職・異動・アカウント停止でメール認証の可視性が無言で失われます。宛先は個人ではなく部門の共有メールボックスにしてください
2DNS は公開情報。Xserver の DMARC 設定マニュアル自身が警告しています ── 「レポート通知先のメールアドレスはDNSレコードに記載されるため、外部からの参照が可能となります」。rua に書いたアドレスは全世界に公開され、スピアフィッシングとスパムの標的になります。個人名を含むアドレスや、他用途と兼用しているアドレスを rua に書かないでください
3企業データの社外流出。DMARC 集約レポートには、自社ドメインを名乗る送信元IP・送信量・認証結果が含まれます。これは社内のメール送信インフラの構成情報であり、自社が管理しないドメインのメールボックスに送るべきものではありません
4noreply@syncsync.jp も不適切。集約レポートは XML の gzip 添付で1日あたり数十〜数百通届きます。レポートを人が読むのは現実的ではありません

5.4.4 即時のアクション(フェーズ4)

(1) DMARC レコードを差し替える

Name   : _dmarc
Type   : TXT
Content: v=DMARC1; p=none; rua=mailto:dmarc-reports@syncsync.jp; adkim=r; aspf=r

(2) Cloudflare DMARC Management を有効化する(無料)

項目内容
場所Cloudflare ダッシュボード > Email > DMARC Management
前提Cloudflare DNS を利用していること(フェーズ2完了後)
プラン「Available on all plans」 ── Free で使えます
対応範囲apex ドメインのみsyncsync.jp は該当)
初回レポート有効化から最大24時間
機能SPF/DKIM/DMARC の合否を送信元別に可視化。Cloudflare のアドレスを rua に自動追記
注意 公式に「DMARC Management does not support modifications to SPF records when a CNAME record in your zone points to an external domain.」とあります。本件は api.syncsync.jp が外部CNAME なので、SPF の自動編集機能は使えない可能性があります。DMARC レポートの受信自体には影響しないはずですが、要検証です(9章)。
これが「DKIM が静かに壊れたこと」を検知する唯一の実用的な手段です 5.2.3 のスクリプトは DNS 側しか見ていませんが、DMARC レポートは実際の署名検証結果を返します。

(3) CAA を追加

syncsync.jp.  CAA  0 issue "letsencrypt.org"      # Xserver の無料独自SSL
syncsync.jp.  CAA  0 issue "pki.goog"             # Google(api.syncsync.jp 用)
syncsync.jp.  CAA  0 issue "ssl.com"              # Cloudflare Universal SSL
syncsync.jp.  CAA  0 issuewild ";"                # ワイルドカード証明書の発行を禁止
syncsync.jp.  CAA  0 iodef "mailto:security@syncsync.jp"
CAA は「入れすぎると証明書が取れなくなる」レコードです 追加後、必ず次の証明書更新が成功することを確認してください。不安なら issuewild ";"iodef だけから始めてください(これだけでもワイルドカードの不正発行を防げます)。

5.4.5 段階的強化ロードマップ

時期DMARC レコード先に進む条件
移管直後v=DMARC1; p=none; rua=mailto:dmarc-reports@syncsync.jp; adkim=r; aspf=rDKIM の Cloudflare 移植完了
+1ヶ月(変更なし・観測に専念)レポートで全送信元の SPF/DKIM を洗い出す。Webフォーム・業務システム・監視ツール・CI通知を含めて漏れなく
+2ヶ月v=DMARC1; p=quarantine; sp=quarantine; rua=...pass 率 99%以上が2週間継続
+4ヶ月v=DMARC1; p=reject; sp=reject; np=reject; rua=...事故ゼロが2ヶ月継続
併せてSPF を ~all-all同上

DMARCbis(RFC 9989 / 9990 / 9991、2025年)での主な変更点

変更内容本件への影響
pct タグの削除段階導入は p の値そのもので行う🔴 新しい DMARC レコードに pct= を書かないこと
rf / ri タグの廃止レポート形式・間隔タグが廃止書かない
t タグの新設"DMARC policy test mode"。p=reject; t=y で「reject を宣言しつつ実際には強制しない」テスト運用が可能pct の代替として段階導入に使えます
np タグの新設存在しないサブドメイン専用のポリシー🔵 本件で極めて有用。ワイルドカードを廃止した後(4.8節)に np=reject を付けると、実在しないサブドメインを騙るなりすましを即座に拒否できます
DNS Tree WalkPublic Suffix List への依存をやめ、DNS を上位へ辿って Organizational Domain を決定実務影響は小さいが、サブドメインに独自の _dmarc を置いた場合の解釈が変わり得る
np=reject を付けられる前提 「ワイルドカード * を削除していること」です。ワイルドカードがあると全サブドメインが「存在する」ことになり、np が効きません。4.8節のワイルドカード廃止と、この np=reject はセットで計画してください。

5.4.6 rua に外部の解析SaaSを使う場合

dig +short TXT syncsync.jp._report._dmarc.<受信ドメイン>
# → "v=DMARC1" が返ること。返らなければレポートは届きません

rua=mailto:dmarc-reports@syncsync.jp のように自ドメイン宛なら、この検証レコードは不要です。

5.5 TLS-RPT のみ導入し、MTA-STS は導入しない

5.5.1 判断の根拠

DANE は原理的に不可能です DANE には DNSSEC が必須ですが、加えて Xserver 側で TLSA レコードに対応する証明書運用の制御ができません。

5.5.2 TLS-RPT の導入(低リスク・単独で有効)

Name   : _smtp._tls
Type   : TXT
Content: v=TLSRPTv1; rua=mailto:tlsrpt@syncsync.jp

5.5.3 将来 MTA-STS を導入する場合の条件

1. TLS-RPT を先に入れて1ヶ月観測(失敗がゼロであることを確認)
   ↓
2. MTA-STS を mode: testing で公開(強制しない・レポートだけ取る)
   ↓
3. さらに1ヶ月、レポートで失敗ゼロを確認
   ↓
4. mode: enforce へ
testing から enforce に上げる際 max_age を短く(86400秒程度)してから上げてください。MTA-STS のポリシーは送信側にキャッシュされるため、max_age が長いと切り戻しても長時間反映されません。

5.5.4 BIMI は対象外

前提条件現状
DMARC が p=quarantine 以上p=none(+4ヶ月で到達予定)
SPF/DKIM が安定して pass⚠️ 移管後に確認
VMC(Verified Mark Certificate)❌ DigiCert / Entrust が発行、年額十数万円規模。商標登録済みロゴが必要

p=quarantine 到達が先であり、50名規模で VMC 費用を投じる価値があるかは別途経営判断です。フェーズ1の対象外とします。

5.6 メールクライアント設定(50台展開用の確定値)

項目
受信サーバーsvXXXXX.xserver.jp / IMAP / 993 / SSL-TLS
送信サーバーsvXXXXX.xserver.jp / SMTP / 465(SSL)または 587(STARTTLS)
ユーザー名メールアドレス全体user@syncsync.jp
認証通常のパスワード(SMTP-AUTH 必須
syncsync.jp をメールサーバ名に指定しないでください Xserver は独自ドメイン名での over SSL に対応していません。公式推奨は sv***.xserver.jp + over SSL です。

⚠️ svXXXXX はサーバー移転で変わります。50台のクライアント設定に直書きしている状態は、移転時に一斉障害になります。移転計画がある場合は事前にサポートへ確認し、展開手順(MDM / スクリプト配布)を用意してください。

設定場所初期値推奨
SMTP認証の国外アクセス制限サーバーパネル > SMTP認証セキュリティ設定ONON のまま。除外ホストは google.com, outlook.com, hotmail.com, ap-northeast-1(.compute).amazonaws.com 等。海外出張・海外リモートがあると送信できなくなるので、その場合は Zero Trust(WARP)経由で国内 IP から送る
受信側DMARC設定サーバーパネル > 迷惑メールフィルタ設定OFFON 推奨。「DKIM認証、SPF認証の両方が認証失敗した場合、送信側DMARCポリシーに沿った処理を行います」。これを ON にして初めて、受信メールの SPF/DKIM 検証が意味を持ちます
迷惑メールフィルタ同上Cloudmark Authority 推奨(スタンダード/プレミアムで100アカウントまで)
メール仕様の上限を把握しておくこと 送信数目安 1,500通/時間・15,000通/日(全プラン共通)/1通あたり約100MB/MTA は Postfix /ウイルスチェックは WithSecure。

SaaS プロダクトの通知メール(アカウント登録、パスワードリセット、日次レポート等)を Xserver から送ると、この上限に当たり得ます。顧客数が増える局面では、トランザクショナルメールは専用サービス(SendGrid / Amazon SES / Postmark 等)へ分離することを検討してください。その際は SPF のルックアップ数に余裕があること(5.3.4 で4回まで削減済み)が効いてきます。

6Step 3 — ⑤Turnstile(syncsync.jp が最大の適用先)

実装コードは synon.co.jp 版と共通です HTML / PHP / React / siteverify / エラーコード一覧 / テストキーは cloudflare-secure-cloud-buildout-operations.md の Step 5 と完全に同一です。本章では重複を避け、syncsync.jp 固有の判断と設定だけを扱います。

6.1 なぜ syncsync.jp が最優先の適用先なのか

観点synon.co.jpsyncsync.jp
フォームの種類会社への一般問い合わせ製品の問い合わせ・資料請求・トライアル申込
スパムの実害迷惑メールが増える営業リードの汚染。本物の見込み客が埋もれる
入力される情報氏名・会社名氏名・会社名・電話番号・導入検討状況(=個人情報)
送信経路メールメール+おそらく業務システム/CRM
4.6.2 の WAF ルール #4Managed Challenge と二重で守る設計
Bot Fight Mode を OFF にする判断とセットです 4.6.3 で Bot Fight Mode を OFF にすると決めたため、フォーム保護は Turnstile が担うことになります。この2つは一体の設計判断です。

6.2 ウィジェットの構成(syncsync.jp 用)

項目Free
ウィジェット数20個 / アカウント
ホスト名10ホスト名 / ウィジェット
チャレンジ/検証回数無制限("Unlimited challenges (traffic or verification requests)")
Any hostname ウィジェット❌(Enterprise のみ)
「siteverify 100万回まで」という記述について 日本語記事でよく見かけますが、これは2023年の GA ブログの記述です。2026年8月時点の公式 plans ページでは Free に対して "Unlimited challenges (traffic or verification requests)" と明記されており、回数上限の記載はありません。
#ウィジェット名ホスト名用途
1syncsync-prodsyncsync.jp, www.syncsync.jp本番の問い合わせフォーム
2syncsync-stagingステージングのホスト名検証環境
3syncsync-devlocalhost, 127.0.0.1ローカル開発
本番・ステージング・localhost を1つのウィジェットにまとめないでください シークレットキーが漏洩した際の影響範囲を切り分けられなくなります。Free で20個作れるので十分です。

受託案件用のウィジェットは顧客の Cloudflare アカウントで発行してください8.5節)。

ウィジェット設定(社内標準値)

項目
Widget ModeManaged
Appearanceinteraction-only
Sizeflexible
Languageja
Themeauto
Pre-clearance有効化を検討(6.4節)
Managed + appearance="interaction-only" を推奨する理由 正常なユーザーには何も表示されず(=Invisible 相当のUX)、疑わしい場合だけチェックボックスが出ます。Invisible モードと違い、プライバシーポリシーへの Turnstile Privacy Addendum 参照義務が発生しません(公式に義務付けられているのは Invisible モードのみ)。

⚠️ この解釈は「公式が Invisible モードにのみ義務を明記していること」に基づきます。プロダクトサイトなので、厳密には法務確認を推奨します。

6.3 syncsync.jp 側の実装で変える点

(1) hostname 検証の許可リスト

// ★ syncsync.jp 用に変更する2箇所
$allowedHosts = ['syncsync.jp', 'www.syncsync.jp'];
if (!in_array($result['hostname'] ?? '', $allowedHosts, true)) {
    error_log('[Turnstile] hostname mismatch: ' . ($result['hostname'] ?? ''));
    return ['ok' => false, 'errors' => ['hostname-mismatch']];
}
if (($result['action'] ?? '') !== 'product-inquiry') {   // ← フォームごとに変える
    return ['ok' => false, 'errors' => ['action-mismatch']];
}

action はフォームごとに別の値を使ってください。同じウィジェットのトークンを別フォームで使い回す攻撃を防げます。

フォームaction の値
製品問い合わせproduct-inquiry
資料請求document-request
トライアル申込trial-signup

(2) Xserver 環境でのシークレットキーの置き場所

synon.co.jp 版では getenv('TURNSTILE_SECRET_KEY') を使っていますが、Xserver の共有サーバでは環境変数の設定方法が限られます。

方法可否備考
.htaccessSetEnv✅ 可ただし .htaccess は Web公開ディレクトリに置かれる。設定ミスで中身が見えるリスク
公開ディレクトリ外の PHP ファイルから require推奨public_html の外に置く
wp-config.phpdefine()⚠️ 可WordPress の場合。public_html 内なので保護が必要
ソースコードに直書き🔴 禁止Git に載る
/home/<アカウント>/syncsync.jp/
├── secrets.php          ← ★ ここ(Web からアクセスできない)
└── public_html/
    ├── index.php
    └── contact.php      ← require __DIR__ . '/../secrets.php';
<?php
// /home/<アカウント>/syncsync.jp/secrets.php
return [
    'turnstile_secret' => '0x4AAAAAAA...',
];
<?php
// public_html/contact.php の冒頭
$secrets = require __DIR__ . '/../secrets.php';
$turnstileSecret = $secrets['turnstile_secret'];

(3) WordPress / Contact Form 7 を使っている場合

方法内容
専用プラグイン「Turnstile for Contact Form 7」等のプラグインを使う(最も簡単)
reCAPTCHA 互換シム<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?compat=recaptcha"> に差し替え、sitekey を差し替え、サーバ側の検証先URLとシークレットを差し替える。HTML 側はほぼ無改修
wpcf7_validate フックで自前実装最も制御が効く。PHP 実装を add_filter('wpcf7_validate', ...) から呼ぶ
reCAPTCHA v3 からの移行は、互換シムでは 1:1 に対応しません v3 の score に相当するフィールドは Turnstile の siteverify レスポンスに存在しません(Turnstile は success の true/false のみ)。v3 でスコア閾値による分岐ロジックを組んでいる場合は、その部分の再設計が必要です。

(4) Cloudflare 経由での実IP(remoteip

siteverifyremoteip パラメータには、$_SERVER['REMOTE_ADDR'] ではなく CF-Connecting-IP を渡してください。4.1.7 の実IP復元を入れていれば REMOTE_ADDR が置換されているので、そのままで正しく動きます。入れていない場合は全リクエストが Cloudflare のIPになり、remoteip が無意味になります。

6.4 Pre-clearance — syncsync.jp では有効

Turnstile + WAF ルール + Pre-clearance で「二重チャレンジ」を避ける ユーザーが フォームを開く product-inquiry Turnstile が検証 Managed / interaction-only 多くのユーザーは無操作 cf_clearance Cookie Pre-clearance = managed が発行される POST 時の WAF #4 Managed Challenge を スキップできる 送信完了 離脱ゼロ Pre-clearance が使える条件 「ウィジェットの hostname が、WAF ルールを持つゾーンと 一致していること」= Cloudflare プロキシ配下でのみ有効 ✓ syncsync.jp / www  ✗ api.syncsync.jp(DNS only のため) これが「Bot Fight Mode を OFF にできる」理由 ゾーン全体に一律のボット対策をかける代わりに、 「守るべきフォームだけ」を Turnstile で守る。 アプリ/API 通信は一切巻き込まれない
図13: Turnstile と WAF ルールの連携。Pre-clearance により、二重チャレンジによる離脱を防げる
レベルスキップされるチャレンジ
InteractiveinteractiveInteractive のみ
Managed(推奨)managedManaged と Non-Interactive
Non-Interactivenon-interactiveNon-Interactive のみ

6.5 検証チェックリスト

#確認方法
1ウィジェットが表示されるフォームページを開く。interaction-only なので通常は何も見えないのが正常
2トークンがフォームに入るDevTools > Elements で <input type="hidden" name="cf-turnstile-response"> に値が入っていること
3サーバ側検証が効いているJS を無効にしてフォームを送信 → 400 で拒否されること
4hostname 検証が効いている別ホストから同じ sitekey で取得したトークンを送る → hostname-mismatch
5リプレイが拒否される同じトークンを2回送る → timeout-or-duplicate
6テストキーで自動テスト1x00...AA(常に成功)/ 2x00...AA(常に失敗)/ 3x00...AAtimeout-or-duplicate)の3種を単体テストに組み込む
7Pre-clearanceTurnstile 通過後に cf_clearance Cookie が発行され、POST 時に Challenge が出ないこと

7Step 4 — ⑥Web Analytics / ⑦Tiered Cache / ⑧Security Center

基本手順は synon.co.jp 版 Step 6 と同じです 本章では syncsync.jp で判断・設定値が変わる点だけを扱います。

7.1 ⑥ Web Analytics

手順は同じ:アカウントレベルのダッシュボード > Web Analytics > Add a site → プロキシ済みゾーンならホスト名を選んで DoneJSビーコンは Cloudflare が自動注入するため、オリジン側のコード変更は不要です。

項目内容
重要度が高い4.1.7 のとおり、Xserver のアクセスログには実IPが残りません。Cloudflare 経由にした瞬間、Xserver 側の解析は事実上使えなくなります。Web Analytics が実質的な唯一の解析手段になります
流入分析の価値が高いどの流入元から問い合わせに至ったかを見たい。Web Analytics はクライアントサイド計測なのでボット除去済みの実ユーザー数が取れます
⚠️ 自動注入が失敗する条件オリジンが Cache-Control: public, no-transform を返しているとレスポンスを改変できず注入できません。WordPress のキャッシュプラグインが no-transform を付けることがあります
⚠️ 既存の解析ツールとの併用Google Analytics 等を入れている場合、数値は一致しません(計測方式が違う)。「どちらが正しいか」ではなく「何を測っているか」で使い分けてください
curl -s https://syncsync.jp/ | grep -i "cloudflareinsights\|cf-beacon"
# DevTools の Network タブで beacon.min.js の読み込みと /cdn-cgi/rum への POST を確認
プライバシーポリシーへの記載 「Cookieを一切使わない」「GDPR準拠」といった断定は公式ドキュメントに明示がありません。プロダクトサイトのプライバシーポリシーに書く場合は、Cloudflare のプライバシーポリシー本文と DPA を別途確認してください。

7.2 ⑦ Tiered Cache + Cache Rules — syncsync.jp で最も効く施策

パス:Caching > Tiered Cache → トグルを OnSmart Tiered Cache は Free でも利用できます。レイテンシデータを用いてオリジンごとに最も近い上位層を1つ自動選択します。

理由説明
静的LP中心料金プラン・機能紹介ページはほぼ静的。エッジキャッシュがそのまま効きます
共有サーバがオリジンXserver は共有サーバなので、同居する他ユーザーの負荷でレスポンスが揺れます。キャッシュヒット率を上げるほどこの影響を受けません
顧客が見るサイト表示速度がそのまま商談の印象になります
Always Online の保険Xserver 障害時に Internet Archive のキャッシュを返せます(Free はクロール30日ごと

7.2.1 Cache Rules(Free は10本・上から順に評価)

順序が重要です ルール1・2を必ずルール4より上に置いてください。
# ルール1:管理系・動的パスを完全バイパス(最上位)
(http.request.uri.path contains "/wp-admin/")
or (http.request.uri.path contains "/wp-login.php")
or (http.request.uri.path contains "/wp-cron.php")
or (http.request.uri.path contains "/wp-json/")
or (http.request.uri.path contains "/xmlrpc.php")
or (http.request.uri.path contains "/.well-known/")     ← ACME 保護。絶対に外さない
or (http.request.uri.path contains "/contact")          ← フォーム保護
or (http.request.uri.path contains "/inquiry")
→ Cache eligibility: Bypass cache

# ルール2:ログイン中ユーザーをバイパス(Cookie 判定)
(http.cookie contains "wordpress_logged_in_")
or (http.cookie contains "wp-postpass_")
or (http.cookie contains "comment_author_")
→ Cache eligibility: Bypass cache

# ルール3:静的アセットを長期キャッシュ
(http.request.uri.path.extension in
  {"css" "js" "jpg" "jpeg" "png" "gif" "webp" "avif" "svg" "ico"
   "woff" "woff2" "ttf" "eot" "mp4" "pdf"})
→ Cache eligibility: Eligible for cache
  Edge TTL   : Ignore cache-control header and use this TTL = 1 month
  Browser TTL: Override origin = 1 year

# ルール4:HTML をエッジキャッシュ(効果大/リスク中・必ずルール1,2より下)
(http.host eq "syncsync.jp" or http.host eq "www.syncsync.jp")
→ Cache eligibility: Eligible for cache
  Edge TTL   : Ignore cache-control header and use this TTL = 2 hours
  Browser TTL: Respect origin
  Cache Key  : Cache deception armor ON
ルール4の注意 記事・料金ページの更新時にパージが必要です。Cloudflare 公式 WordPress プラグイン(Automatic Cache Management)を併用すると、投稿更新時に自動パージされます。
Free の Edge Cache TTL の最小値は2時間です(Pro=1時間、Business=1秒)。「更新して30分で反映」という運用はできません。

7.2.2 🔴 Xserver 側のキャッシュを OFF にして責任分界点を1箇所にする

3層キャッシュは 50名規模の運用体制では管理不能になる ✕ 3層キャッシュ ① WordPress キャッシュプラグイン ② Xserver サーバーキャッシュ / ブラウザキャッシュ ③ Cloudflare Cache Rules 「古い内容が出る」時、どの層をパージすべきか誰も分からない ○ Cloudflare の1箇所に寄せる ① WordPress キャッシュプラグイン → 無効化 ② Xserver サーバー/ブラウザキャッシュ → OFF ③ Cloudflare Cache Rules のみ Purge Everything の1操作で必ず解決する状態にしておく
図14: キャッシュの責任分界点。Xアクセラレータは残しても害は小さいが、HTML をキャッシュする層は1つに絞る
Xserver の機能場所推奨
Xアクセラレータサーバーパネル > XアクセラレータVer.2 は静的ファイル配信の高速化。Cloudflare がキャッシュするなら効果が薄い。残しても害は小さい
サーバーキャッシュ設定サーバーパネル🔴 OFF 推奨。HTML を Cloudflare でキャッシュするなら二重管理
ブラウザキャッシュ設定サーバーパネル🔴 OFF 推奨。Cache Rules の Browser TTL と競合
WordPress のキャッシュプラグインWP管理画面🔴 無効化推奨(WP Super Cache, W3 Total Cache 等)

7.2.3 検証

# 静的アセット:2回叩いて MISS → HIT を確認
curl -sI https://syncsync.jp/assets/style.css | grep -i "cf-cache-status\|age\|cache-control"
curl -sI https://syncsync.jp/assets/style.css | grep -i "cf-cache-status"

# フォームページ:BYPASS になること(キャッシュされていたら事故)
curl -sI https://syncsync.jp/contact/ | grep -i "cf-cache-status"
cf-cache-status意味
HIT / MISS / EXPIREDキャッシュあり / なし(オリジン取得)/ 期限切れ
STALE期限切れだがオリジンに到達できずキャッシュから配信
BYPASSオリジンのヘッダ(no-store 等)または Cache Rules によりキャッシュされなかった
DYNAMICリクエスト時点でキャッシュ対象外と判定
NONE / UNKNOWNCloudflare が生成したレスポンス(WAFブロック等)
Tiered Cache の効果は単一リクエストからは確認できません (Free には Argo Analytics がないため)Caching > Overview のキャッシュヒット率を、有効化の前後で1〜2週間比較してください。あわせて Xserver のアクセスログでリクエスト数の減少を確認するのが最も確実です(オリジン負荷が実際に下がったかが分かります)。

既定のキャッシュ挙動:Cloudflare は MIMEタイプではなく拡張子ベースで判定します。HTML と JSON は既定でキャッシュされません。

7.3 ⑧ Security Center

syncsync.jp では synon.co.jp より重要度が上がります。理由はワイルドカードの存在です。

機能syncsync.jp での使いどころ
Security Insights🔵 ダングリングDNS検出が本命。ワイルドカードを廃止する判断材料になります(4.8節)。「プロキシされていないDNSレコード」の検出も、mail / api / ftp が意図的にグレー雲であることを再確認する用途に使えます
Infrastructure2ゾーン分のアセット一覧が見られます。2ドメイン運用の棚卸しにそのまま使えます
Investigateドメイン・IP のカテゴライズ確認
Security Reports(beta)ブロック/チャレンジされたリクエストの可視化。WAF を Block に切り替える判断材料
Brand Protection(beta)🔵 プロダクトドメインなので価値が高い。syncsync-jp.com sync-sync.jp のようなタイポスクワッティング・ホモグリフ狙いの新規ドメイン登録を監視できます
Free での決定的な制約 手動スキャン(「今すぐスキャン」)が実行できるのは、Business/Enterprise ゾーンを1つ以上持つアカウントのみです。Free では週1回の自動スキャン結果を待つしかありません。設定変更の効果確認に最大1週間かかります。
⚠️ Administrator Read Only ロールのユーザーは Security Center にアクセスできません。
検出項目syncsync.jp での想定
ダングリングDNSレコード⚠️ ワイルドカードがある間は検出精度が落ちます。廃止後に本領を発揮
プロキシされていないDNSレコードmail / api / ftp が該当。意図的なので「対処済み」として扱う
TLS暗号化や HSTS ヘッダの欠落HSTS は安定後に検討(4.6.5)
MFA が有効化されていない管理者ユーザー🔴 必ず潰すこと。Cloudflare アカウントは2ゾーンの生殺与奪を握っています
未割り当ての Zero Trust シート50シートの管理(synon.co.jp 版 運用計画書 3.5節)
頻度作業所要
週次Security Insights を synon.co.jp / syncsync.jp の両方で確認15分
月次Brand Protection の新規検出を確認10分
月次Infrastructure でアセット一覧を棚卸し10分

82ドメイン共通の運用に足すこと

運用計画書の本体は synon.co.jp 版文書 第2部です 本章は、syncsync.jp を追加したことで新たに発生する運用項目だけを扱います。既存の運用計画書に「差分として追記する」形で使ってください。

8.1 Zero Trust は追加作業ゼロ

項目syncsync.jp を追加した影響
Zero Trust シート(50席)影響なし。シートはユーザー単位で消費されます。ドメインを追加しても消費しません
Cloudflare One Client(WARP)の配布影響なし。端末50台の構成は変わりません
Cloudflare Tunnel(社内システム接続)影響なし。プライベートネットワークのルーティングはドメインに紐づきません
Gateway DNS フィルタ影響なし。ポリシーは端末側に適用されます
Google Workspace SSO(IdP)影響なし。認証は synon.co.jp の Google Workspace テナントで行い、ドメインとは独立です
DEX 合成テスト⚠️ 1つ追加を推奨。https://syncsync.jp/ の到達性監視(4.5.4 の 526 検知に使えます)
Cloudflare ゾーン無料。1アカウントに複数ゾーンを追加しても課金は発生しません
つまり、2ドメイン運用のコストはほぼゼロです 増えるのは「設定を2箇所で管理する手間」だけです。

8.2 🔵 どちらのゾーンを Pro(約$20/月)にするか

Webhook 通知は「アカウント全体」で解禁される ── だから1ゾーンだけ Pro にする Cloudflare アカウント(1つ) synon.co.jp Free syncsync.jp Pro($20/月) Webhook 通知(Slack / Teams)が両ゾーンで使えるようになる Free だけのアカウントではメール通知しか使えない これが「2ドメイン持つことで、はじめて Pro 化が費用対効果に見合う」理由 加えて Pro では Custom Rules 5→20本、OWASP コアルールセット、Rate Limiting の期間可変が解禁される
図15: Pro 化の判断。Webhook がアカウント単位で解禁されるため、片方だけ Pro にすれば両ゾーンで恩恵を受けられる

8.2.1 どちらを Pro にすべきか

判断軸synon.co.jpsyncsync.jp
停止時の損失会社案内が見られない🔴 顧客が製品サイトに到達できない。商談機会と信用の損失
WAF 強化の必要性🔴 大(フォーム・API・課金)
Pro で解禁される WAF Managed Rules🔴 OWASP コアルールセットが使える。プロダクトサイトで価値が大きい
Custom Rules 本数5 → 205 → 20(4.6.2 で5本を使い切っているので効く)
Rate Limiting1本・10秒固定 → 複数本・期間可変🔴 API のレート制限を実用的に組める
526 リスクの監視🔴 4.5.3 の SSL 自動更新リスクがある。Origin Error Rate Alert を Webhook で受けたい
Image Optimization(Polish)大(製品画像が多い)
推奨:syncsync.jp を Pro にする 理由は3つ:①顧客影響が大きい4.5.3 の SSL 自動更新という固有リスクを抱えており、Origin Error Rate の Webhook 通知が実質的な保険になる4.6.2 で Custom Rules 5本を使い切っている

8.2.2 Pro 化しない場合の代替

失うもの代替
Webhook(Slack)通知メール通知を使う。alerts@synon.co.jp のような共有アドレスに送り、Google Workspace 側で Slack 連携する
手動 Security Center スキャン週次の自動スキャンを待つ(最大1週間の遅延を許容する)
Custom Rules 5本超1本目を Skip ルールに使う設計(4.6.2 #1)で節約する。同じ条件を or でまとめる
Rate Limiting 1本最も重要な /wp-login.php に絞る
OWASP コアルールセットCloudflare Free Managed Ruleset で代替(Free でも使えます)
ただし、SLA とテクニカルサポートは Pro でも大きくは変わりません 「サポートに頼れない」という前提は Pro 化しても続きます。だから 4.5.4 の自前監視スクリプトが重要なのです。

8.3 恒久タスクへの追加項目

頻度タスク所要理由
毎日(期限30日前〜18日前のみ)🔴 Xserver オリジン証明書の notAfter を確認自動526 でサイト全停止するリスクの唯一の防波堤
月次🔴 DKIM 公開鍵の突合(サーバーパネル[表示]⇔ dig5分鍵再生成による無言の DKIM 失敗を防ぐ(5.2.3)
月次DMARC 集約レポートで dkim=fail / spf=fail の急増がないか確認15分上記の実質的な検知手段
週次Security Insights を2ゾーン分確認15分ダングリングDNS・MFA未設定の検出
四半期🔴 Cloudflare IP レンジの更新確認.htaccess 使用時)15分レンジ変更で正常アクセスが遮断される
四半期Xserver サーバーパネルの設定変更履歴を確認15分「国外アクセス制限」等が意図せず ON に戻っていないか
随時(Xserver 側で操作した直後)🔴 DKIM 突合+SPF 確認10分サーバー移転・DKIM トグル・プラン変更の直後
年次CAA レコードと証明書発行元の整合確認15分CAA が原因で更新失敗しないように
【社内ルール】Xserver で以下を操作したら、必ず Cloudflare 側も確認する
  □ 新サーバー簡単移行 / プラン変更          → DKIM 突合・mail A レコードのIP・SPF
  □ DKIM設定の ON/OFF                        → DKIM 突合
  □ ドメイン設定 / サブドメイン設定の追加削除 → Cloudflare に明示レコードを作る/消す
  □ SSL設定の操作                            → 証明書の notAfter を再記録
  □ WordPressセキュリティ設定の変更           → Cloudflare WAF との整合を確認

8.4 WAF ルールの二重管理をどうするか

対応内容
社内テンプレートを作る4.6.2 の5本を「社内標準ルールセット」としてドキュメント化し、両ゾーンで同じ番号・同じ命名(00- 10- 20-…)を使う
命名規則を統一する<優先度2桁>-<動詞>-<対象>(例:00-skip-acme-and-api)。どちらのゾーンを見ても同じ構造になるようにする
差分を明記する「syncsync.jp だけ #4 がフォーム保護」のように、意図的な差分を一覧化しておく
API / Terraform で管理(将来)手作業が辛くなったら Cloudflare API か Terraform Provider でコード化。ただし50名規模では時期尚早。まずはドキュメントで十分

8.5 Turnstile ウィジェットの枠管理

用途想定数(Free は 20 / アカウント)
syncsync.jp(本番/ステージング/dev)3
synon.co.jp(本番/ステージング/dev)3
社内ツール2〜3
予備11〜12
原則:受託案件の Turnstile は、必ず顧客の Cloudflare アカウントで発行してください 理由は枠の問題だけではありません。自社アカウントで発行すると、顧客サイトのボット検知データが自社アカウントに残り、契約終了時の引き渡しも面倒になります。「顧客の資産は顧客のアカウントに」を原則にしてください。

8.6 DMARC ランプアップは2系統で別スケジュール

synon.co.jpsyncsync.jp
送信元Google Workspace(+HubSpot 等の外部SaaS)Xserver 自前(+将来トランザクショナルメール)
送信元の棚卸し🔴 難しい。マーケ系SaaSが独自に送っている可能性がある容易。Xserver 経由がほぼ全部
DKIMGoogle 用 DKIM の新規設定が必要(反映まで最大48時間)既に稼働中(移すだけ)
SPF8/10 ルックアップ・Google が抜けている6/10 → 4/10 に削減
p=reject 到達見込み+6ヶ月(送信元の洗い出しに時間がかかる)+4ヶ月
np=rejectワイルドカードあり → 廃止が前提ワイルドカードあり → 4.8節の廃止手順が前提
「syncsync.jp が p=reject にできたから synon.co.jp も上げよう」は危険です synon.co.jp のほうが送信元が多く、取りこぼしのリスクが高い構成です。ランプアップは必ず別スケジュールで管理してください。

8.7 障害時の切り分けフロー(2ドメイン共通)

エラー番号から原因を一意に絞り込む サイトが見られない 520〜523 オリジンに到達できない ・Xserver の稼働状況 ・.htaccess の IP 制限  (4.5.6)を疑う 525 / 526 SSL の問題 526: 証明書期限切れ   → 4.5.4(c) を実行 525: api をプロキシ? 403(CF のページ) WAF がブロック ・Security > Events で  該当ルールを特定 ・該当ルールを無効化 403(Xserver のページ) CF Events に記録なし ・国外アクセス制限  (4.1.6)を疑う ・Xserver WAF を疑う メールが届かない/送れない場合の確認順序 ① dig +short MX syncsync.jp → 意図した先か ② dig +short A mail.syncsync.jp → 198.51.100.10 か(Cloudflare IP なら事故) ③ dig +short TXT default._domainkey.syncsync.jp → DKIM が引けるか ④ Gmail のソース表示で spf / dkim / dmarc のどれが fail か dkim=fail → 5.2.3 の鍵ドリフト spf=fail → apex プロキシで +a: が壊れた(5.3.2) dmarc=fail → 上記のどちらか
図16: 障害切り分けフロー。「Cloudflare が返した 403 か、Xserver が返した 403 か」の判別が最も間違えやすい

最速の切り戻し手段(覚えておくこと)

症状切り戻し所要
プロキシ起因のあらゆる問題該当レコードをグレー雲に戻す数分(TTL 300秒)
SSL 526SSL/TLS モードを Full (strict)Full に落とす即時
WAF 誤検知該当 Custom Rule を無効化即時
Cache 起因Caching > Configuration > Purge Everything数分
DNS そのものの問題⚠️ NS を Xserver に戻す最大24時間 ← これを避けるためにフェーズを分ける

9未確定事項(着手前に潰すこと)

本書は公式ドキュメントと実測に基づいて書いていますが、以下は確定できていません。着手前に、この表を1つずつ埋めてください。

9.1 🔴 最優先(これが崩れると設計が変わる)

#未確定事項確認方法影響
1🔴 Xserver の無料独自SSL(Let's Encrypt)は、Cloudflare プロキシ下で自動更新されるか①Xserver サポートに直接問い合わせる ②notAfter を監視し、実際に1サイクル(90日)通るか観察通らなければ 90日後にサイト全停止(526)。4.5.3
2🔴 Xserver のメールサーバが提示する証明書の SAN に syncsync.jp が含まれるかopenssl s_client -starttls smtp -connect syncsync.jp:25MTA-STS の可否が決まる。含まれないなら導入不可
3🔴 mail.syncsync.jp を MX に指定しても、Xserver が syncsync.jp 宛メールを正常受信するかswaks --server 198.51.100.10 --to postmaster@syncsync.jp案A / 案B の選択が決まる。4.3節
4🔴 Xserver が実際どのIPから送信するか(3経路すべて)Gmail のソース表示で Received: を確認SPF の推奨値が決まる。5.3.4

9.2 ⚠️ 重要(作業手順に影響する)

#未確定事項確認方法影響
5Xserver「指定したIPアドレスからの接続を許可」の登録可能件数と CIDR 表記の可否サーバーパネルで実際に Cloudflare の15レンジを登録してみる収まらなければ「国外アクセス制限 OFF」に方針変更(4.1.6)
6サーバーパネル > SSL設定 の「他社ネームサーバーでのDNS認証」が更新時にも使えるかXserver サポートに問い合わせ使えるなら #1 のリスクが消える
7実在サブドメインの完全な一覧ドメイン設定/サブドメイン設定の一覧 + アクセスログ + CT ログワイルドカード廃止の可否(4.8節)
8ftp.syncsync.jp は実在するか、ワイルドカード由来かサーバーパネルの一覧で確認明示レコードを作るべきか
9Cloudflare DMARC Management の SPF 自動編集機能が、外部CNAME(api)があっても動くか有効化して挙動を確認レポート受信自体には影響しないはず(5.4.4)
10Xserver WAF に除外設定(ホワイトリスト)機能があるかサーバーパネルで確認誤検知時の対処方法が変わる(4.6.4)
11サイトが WordPress か否か、キャッシュプラグインの有無実機確認4.1.7・7.2 の適用可否
12問い合わせフォームの実装(Contact Form 7 / 自前 PHP / 外部SaaS)実機確認6.3節の実装方法が変わる
13syncsync.jpレジストラはどこか(Xserverドメインか他社か)Whois / 契約書NS 変更の操作場所が変わる(4.4.1)

9.3 📋 Free プラン制約の実機確認(2ゾーン分)

#確認項目期待値
14Custom Rules の上限5本/ゾーン
15Custom Rules に Log アクションがないことない(Managed Challenge で代替)
16Rate Limiting の上限と期間1本/10秒固定
17Managed Ruleset の選択肢Cloudflare Free Managed Ruleset のみ
18Security Events の保持期間24時間
19Notifications で Webhook が選べないこと選べない(Pro ゾーンが必要)
20Security Center の手動スキャン可否不可(週次自動のみ)
21Cache Rules の上限10本
22Edge Cache TTL の最小値2時間
23Tiered Cache が Free で有効化できることできる
24ワイルドカードレコードがプロキシできることできる(全プラン)
25Turnstile ウィジェット数20/アカウント
26Zero Trust シートがドメイン追加で消費されないこと消費されない

9.4 synon.co.jp 版文書への訂正

#訂正内容確認方法
A「DKIM 未設定」→ 正しくは「Google Workspace 用 DKIM(google セレクタ)が未設定」。default._domainkey(Xserver 用)は稼働中dig +short TXT default._domainkey.synon.co.jp
B「オリジンは AWS EC2」→ apex は STUDIO(Google Cloud, 203.0.113.10)。EC2 は社内システム用。STUDIO はノーコードSaaSのため Origin CA を設置できない可能性が高く、syncsync.jp と同じ制約が当てはまる可能性があるSTUDIO のドキュメント/サポートに確認
Cwww.synon.co.jp が Xserver(198.51.100.10)を指しているが HTTP 応答を確認できなかったブラウザで直接アクセス。ダングリングの可能性
訂正 B の重大性 これは synon.co.jp 版の SSL 章(Full strict + Origin CA + AOP)が成立しない可能性を意味します。STUDIO が Origin CA を受け付けないなら、synon.co.jp の apex も本書 4.5節と同じ設計(Full strict + SaaS 側の公的証明書に依存)になります。次回改訂の最優先事項です。

10付録:作業前後に流すコマンド集

10.1 移管前の記録(フェーズ0)

#!/bin/bash
# snapshot-before.sh ── 移管前の状態を丸ごと記録する
OUT="syncsync-before-$(date +%Y%m%d).txt"
NS=ns1.xserver.jp

{
  echo "=== apex records ==="
  for t in A AAAA MX TXT NS CAA SOA; do dig @$NS $t syncsync.jp +noall +answer; done

  echo "=== subdomains ==="
  for h in www api mail ftp smtp pop imap autodiscover autoconfig webmail; do
    dig @$NS A     $h.syncsync.jp +noall +answer
    dig @$NS CNAME $h.syncsync.jp +noall +answer
  done

  echo "=== special ==="
  dig @$NS TXT default._domainkey.syncsync.jp +noall +answer
  dig @$NS TXT _dmarc.syncsync.jp +noall +answer

  echo "=== wildcard test ==="
  dig @$NS A zzq7x9-nonexistent.syncsync.jp +noall +answer

  echo "=== origin certificate ==="
  echo | openssl s_client -connect 198.51.100.10:443 -servername syncsync.jp 2>/dev/null \
    | openssl x509 -noout -dates -issuer -subject

  echo "=== mail server certificate ==="
  echo | openssl s_client -starttls smtp -connect syncsync.jp:25 -servername syncsync.jp 2>/dev/null \
    | openssl x509 -noout -subject -ext subjectAltName
} | tee "$OUT"

echo "saved to $OUT"

10.2 切替前の突合(フェーズ1)

#!/bin/bash
# compare-ns.sh <CloudflareのNS>
CFNS="$1"
OLDNS=ns1.xserver.jp
[ -z "$CFNS" ] && { echo "usage: $0 <cloudflare-ns>"; exit 1; }

diff_check() {
  local desc="$1"; shift
  local a b
  a=$(dig @$OLDNS "$@" +short | sort)
  b=$(dig @$CFNS  "$@" +short | sort)
  if [ "$a" == "$b" ]; then
    echo "  OK   $desc"
  else
    echo "  DIFF $desc"
    echo "    old: $a"
    echo "    new: $b"
  fi
}

echo "=== record comparison ==="
diff_check "apex A"    A     syncsync.jp
diff_check "MX"        MX    syncsync.jp
diff_check "TXT"       TXT   syncsync.jp
diff_check "www"       A     www.syncsync.jp
diff_check "api CNAME" CNAME api.syncsync.jp
diff_check "mail"      A     mail.syncsync.jp
diff_check "DKIM"      TXT   default._domainkey.syncsync.jp
diff_check "DMARC"     TXT   _dmarc.syncsync.jp
diff_check "wildcard"  A     zzq7x9-nonexistent.syncsync.jp
MX を案A に変更する場合 MX の行は意図的に DIFF になります。それ以外がすべて OK であることを確認してください。

10.3 切替直後の確認(フェーズ2)

#!/bin/bash
# verify-after.sh
echo "=== NS ===";  dig +short NS syncsync.jp
echo "=== MX ===";  dig +short MX syncsync.jp
echo "=== mail A (must be 198.51.100.10) ==="; dig +short A mail.syncsync.jp
echo "=== apex A ==="; dig +short A syncsync.jp

echo "=== DKIM (must not be empty) ==="
dig +short TXT default._domainkey.syncsync.jp | head -c 80; echo "..."

echo "=== SPF ==="; dig +short TXT syncsync.jp | grep spf1
echo "=== google-site-verification ==="; dig +short TXT syncsync.jp | grep google-site-verification

echo "=== api must be CNAME (not flattened to A) ==="
dig CNAME api.syncsync.jp +short

echo "=== HTTP ==="
for u in https://syncsync.jp/ https://www.syncsync.jp/ https://api.syncsync.jp/; do
  printf "%-32s %s\n" "$u" "$(curl -sI -o /dev/null -w '%{http_code}' "$u")"
done

そして必ず手作業で:

10.4 恒久監視(cron)

#!/bin/bash
# daily-guard.sh ── 毎日1回実行し、異常があれば非ゼロで終了する
FAIL=0

# --- 1. オリジン証明書の期限(526 リスク) ---
EXP=$(echo | openssl s_client -connect 198.51.100.10:443 -servername syncsync.jp 2>/dev/null \
      | openssl x509 -noout -enddate | cut -d= -f2)
DAYS=$(( ($(date -d "$EXP" +%s) - $(date +%s)) / 86400 ))
echo "[cert] expires in $DAYS days ($EXP)"
if [ "$DAYS" -lt 18 ]; then
  echo "  ALERT: origin certificate not renewed. 526 risk imminent." >&2
  FAIL=1
fi

# --- 2. mail が Cloudflare IP に化けていないか ---
MAILIP=$(dig +short A mail.syncsync.jp | head -1)
echo "[mail] $MAILIP"
if [ "$MAILIP" != "198.51.100.10" ]; then
  echo "  ALERT: mail.syncsync.jp is not pointing to the origin. Mail may be broken." >&2
  FAIL=1
fi

# --- 3. DKIM レコードのドリフト ---
CUR=$(dig +short TXT default._domainkey.syncsync.jp | tr -d '" ')
KNOWN=$(cat /etc/syncsync/dkim-known-good.txt 2>/dev/null | tr -d '" ')
if [ -n "$KNOWN" ] && [ "$CUR" != "$KNOWN" ]; then
  echo "  ALERT: DKIM record changed." >&2
  FAIL=1
else
  echo "[dkim] OK"
fi

# --- 4. api が CNAME のまま返っているか ---
APICN=$(dig CNAME api.syncsync.jp +short)
echo "[api] $APICN"
if [ -z "$APICN" ]; then
  echo "  ALERT: api.syncsync.jp is no longer a CNAME. Check CNAME Flattening setting." >&2
  FAIL=1
fi

exit $FAIL

11まとめ

この文書の要点

syncsync.jp は synon.co.jp と別の手順書が必要ホスティング(Xserver 共有サーバ)とメール(Xserver 自前)が根本的に違います。
最優先の作業は DNS 移管ではなく DKIM の退避既に稼働している DKIM を、移管の瞬間に失わないこと。
apex をオレンジ雲にする前に MX を付け替えるMX 0 syncsync.jp は Xserver のデフォルトで、受信メール全滅の地雷です。
Origin CA も mTLS も使えないSSL は「Xserver の Let's Encrypt が回り続けること」に依存します。これが本件最大の未確定リスク(9.1 #1)です。
Bot Fight Mode は OFF代わりに Turnstile + 絞った WAF ルールで守ります。プロダクトサイトの正しいやり方です。
NS切替とプロキシ有効化を2〜3日離すこれで、フェーズ3以降のあらゆる障害が「トグル1つで数分で切り戻せる」状態になります。
Zero Trust は2ドメイン共通で、追加作業ゼロシートも消費しません。
1ゾーンだけ Pro にするなら syncsync.jpWebhook 通知はアカウント全体で解禁されます。

着手順序(最短経路)

【今すぐ・DNS移管を待たずにできること】
  synon.co.jp: Google Workspace DKIM の有効化 + SPF に include:_spf.google.com を追加
               → Gmail の配信に直接影響するため、これだけは最優先
  syncsync.jp: 9.1 の #1〜#4 を潰す(サポート問い合わせ・openssl・swaks・送信テスト)

【W0〜W1】 syncsync.jp フェーズ0〜2(DKIM退避 → ゾーン作成 → NS切替)
【W2〜W3】 syncsync.jp フェーズ3(www → apex の順にプロキシ)
【W4〜W8】 syncsync.jp フェーズ4(SPF・DMARC・Turnstile・キャッシュ・⑥⑦⑧)
【W6〜】   synon.co.jp の移管に着手(syncsync.jp で運用に慣れてから)

関連文書

文書内容
cloudflare-secure-cloud-buildout-operations.md / .htmlsynon.co.jp 版・構築手順書+運用計画書。Zero Trust(Cloudflare One Client + Tunnel + Google Workspace SSO)、Gateway DNS フィルタ、DEX、Turnstile の実装コード、運用計画の本体
cloudflare-syncsync-jp-buildout.md / .html(本書)syncsync.jp 版。Xserver 固有の構築手順と、2ドメイン比較
Zero Trust に関する記述は本書にはありません ドメインに紐づかない構成のため、synon.co.jp 版をそのまま参照してください。