syncsync.jp セキュリティ構築手順書
+ synon.co.jp との2ドメイン比較
エックスサーバー上のプロダクトサイトを Cloudflare で守るための、画面操作・CLI・設定値レベルの実務文書。既存の synon.co.jp 版と「何が同じで何が違うか」を明示します。
作成日: 2026-08-17
対象ドメイン: syncsync.jp
ホスティング: エックスサーバー
メール: Xserver 自前(維持)
位置づけ: 並行運用する第2ドメイン
目次
エグゼクティブサマリ
実測した現状
synon.co.jp との比較 ★中核
実施順序
Step 1 — ①DNS移管 / WAF / SSL(Xserver 版)
Step 2 — ②メール認証(Xserver 版)
Step 3 — ⑤Turnstile
Step 4 — ⑥⑦⑧
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 が全滅します。
実測で判明した4つの重要事実
本書の作成にあたり、権威DNSに対して実測を行いました。事前の想定と食い違う点が4つあります。
# 発見 なぜ重大か
1 DKIM は既に設定済み (セレクタ default・RSA 2048bit)「DKIM 未設定」という前提は誤りでした。この TXT を Cloudflare にコピーし損ねると、NS 切替の瞬間に DKIM が全滅します。 Xserver は公開鍵を自社DNSにしか自動投入しません
2 MX が apex 自身を指している (MX 0 syncsync.jp.)apex A レコードをオレンジ雲にした瞬間、全世界からの受信メールが Cloudflare のエッジに配送を試み、SMTP が通らず受信が全滅します。 「MX をグレー雲に」という一般則だけでは防げません
3 ワイルドカード * A レコードが存在する zzq7x9-nonexistent.syncsync.jp すら解決します。フィッシングとサブドメイン棚卸し不能の温床。移管時に1:1で再現しないと既存サービスが壊れ、そのまま残すとリスクが残ります
4 DMARC の 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
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 なし
診断結果
項目 状態 評価
DKIM default セレクタ・RSA 2048bit で稼働中 ✅ 良好。ただし移管時の退避が必須
SPF 6ルックアップ。+a:svXXXXX +a:syncsync.jp +mx がすべて同一IPを指す完全な冗長 ⚠️ 機能はしているが整理が必要
DMARC p=none。rua は2件だが片方(外部ドメイン宛)は届いていない ⚠️ 可視化が半分しか効いていない
MX apex 自身を指す(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節 )。
2 synon.co.jp との比較 本書の中核
全体比較表
項目 synon.co.jp(コーポレート) syncsync.jp(プロダクト) 差の意味
サイトの性格 会社案内 SaaS製品サイト(SyncSync Form) 停止時の損失は syncsync.jp のほうが大きい
構築基盤 STUDIO (ノーコード / Google Cloud)Xserver (共有サーバ)オリジンの制御可能範囲が全く違う
NS Xserver Xserver 同じ(移管作業は同手順)
apex A 203.0.113.10(Google Cloud)198.51.100.10(Xserver)—
www A 198.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)🔴 手順が根本的に違う最大の要因
DKIM default(Xserver)のみ。Google Workspace 用は未設定 default(Xserver)で稼働中 synon.co.jp は Google 用 DKIM の新規設定が必要。syncsync.jp は既存レコードの退避 が必要
SPF ルックアップ 8 / 10(Google が抜けている) 6 / 10(冗長だが機能している) synon.co.jp のほうが深刻
DMARC p=none(rua なし =レポート皆無)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 の三者が絡み、送信元の棚卸しに時間がかかります
2 DKIM が既に動いている。 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 強化の恩恵も大きい)
2 WAF ルールの二重管理 Free の Custom Rules はゾーンごとに5本 。2ゾーンで計10本使えるが、共通ルールを2回書く手間 が発生。Rules テンプレートを社内で標準化すること
3 証明書・DNS の棚卸し対象が倍になる Security Center の週次レビューを2ゾーン分 行う。ダングリングDNS はワイルドカードのせいで両方に潜在
4 DMARC の運用が2系統 synon.co.jp は Google Workspace、syncsync.jp は Xserver。同じ p=reject を目指すが、途中の判定基準と送信元の顔ぶれが違う 。ランプアップは別スケジュールで管理
5 Turnstile ウィジェットの管理 Free は 20ウィジェット / アカウント 。2ドメイン分でも十分だが、受託案件用と混ぜると枯渇する。受託案件は顧客アカウントで発行 する原則を維持
6 DEX / 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 は共有サーバでオリジン側の制御余地がほとんどなく、両方を同時にやると障害の切り分けが不可能になります。
フェーズ 期間 内容 中止条件(ここで止めて戻す)
フェーズ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 版で特に強調したい設計判断です。
これが最大の利点です
フェーズ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〜W4 Cloudflare WAF を Log モードで観測 情シス 週2回15分
W5 WAF を Block へ・SPF短縮・DMARC修正 情シス 2h
W6 Turnstile 実装(問い合わせフォーム) 開発 4h
W7 ⑥⑦⑧・DNSSEC・CAA 情シス 2h
W8 ワイルドカード廃止判断(Log 観測結果をもとに) 情シス 1h
金曜夕方の切替は禁止です
問題が発覚するのは土日で、Free プランにはテクニカルサポートも SLA も存在しません。 火曜〜木曜の業務終了後に実施してください。
4 Step 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設定一覧」タブ →[表示]ボタンをクリック
表示された 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 を testing → enforce で導入可能(それでも段階導入すること)
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セキュリティ設定 > 国外アクセス制限 🔴 ON Cloudflare 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_ADDR を CF-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 site → syncsync.jp → Free プランを選択
Cloudflare が割り当てた 2つのネームサーバ(例 xxx.ns.cloudflare.com)を控える
自動スキャンは信用しないでください
特にワイルドカード(*)と DKIM(default._domainkey)は取りこぼされやすい レコードです。次の 4.2.2 で全件を手作業で検証します。
4.2.2 レコードの1:1再現(★このフェーズの本体)
原則:フェーズ1では全レコードを「DNS only(グレー雲)」で作成します。 切替時の変数を最小化するためです。
Type Name Content Proxy 備考
A @198.51.100.10DNS only フェーズ3で判断(4.4節)
A www198.51.100.10DNS only フェーズ3でオレンジ雲へ
A *198.51.100.10DNS only 🔴 自動スキャンで漏れやすい。必ず手動確認
A mail198.51.100.10DNS only ★ CNAME を A に変換 (理由は 4.3節)
A ftp198.51.100.10DNS only FTP はプロキシ非対応
CNAME apighs.googlehosted.comDNS only 🔴 絶対にオレンジ雲にしない (4.7節)
MX @案A: 10 mail.syncsync.jp / 案B: 0 syncsync.jp — 4.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 の所有権確認が外れる
TXT default._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.jp → ghs.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 を切り替えない)
apex A が 198.51.100.10
MX の内容が意図どおり(案A / 案B のどちらか)
SPF TXT が1文字も違わず 一致
google-site-verification= TXT が存在
DKIM TXT が旧NSと完全一致 (p= の base64 を先頭20文字/末尾20文字まで目視確認)
_dmarc TXT が存在
www / api / mail / ftp が旧NSと同じ先を指す
api が CNAME として 返る(A に化けていない)
ワイルドカードが機能している(存在しないホスト名が 198.51.100.10 を返す)
全レコードの Proxy status が DNS only
4.3 【最重要】MX が apex を指している問題 — 案A / 案B の判断
4.3.1 何が起きるのか
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 をメール専用ホストに付け替える(★推奨)
Type Name Content Proxy
A mail198.51.100.10DNS only(グレー)
MX @mail.syncsync.jp(優先度 10)—
A @198.51.100.10Proxied(オレンジ) ← apex を守れる
A www198.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 をグレー雲のままにする(安全だが機能を捨てる)
Type Name Content Proxy
A @198.51.100.10DNS only(グレー)
A www198.51.100.10Proxied(オレンジ)
MX @0 syncsync.jp(現状のまま)—
MX / SPF は現状のまま無変更で動きます
apex → www のリダイレクトは Xserver 側の .htaccess で実施
欠点: apex がプロキシされないため 198.51.100.10 が公開され続け、DDoS / WAF の保護外 になります
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
3 Web 表示 apex / www / api の3つを開く 従来どおり
4 メールクライアント IMAP 993 / SMTP 465 で送受信 正常
5 ワイルドカード dig +short A zzq7x9.syncsync.jp198.51.100.10
6 DKIM dig +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 syncsync.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 を返します。この条件に文字どおり反します。
見方 内容
通る可能性がある 公式が更新失敗の原因として「アクセス制限」「リダイレクト」を挙げていることから、検証方式は 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 ルール1 Rules > 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 Mode Security > Bots 🔴 OFF (ACME を誤ブロックする実例あり。プロダクトサイトとしても OFF が必須 — 4.6節)
Under Attack Mode Security 平常時 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秒なので数分)
この切り戻しが数分で済むのは、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>
# 導入にあたっての注意
1 Cloudflare の 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 Rules 5本 / ゾーン (Log アクションは使えない )
Rate Limiting Rules 1本 / ゾーン (期間は 10秒固定 )
Managed Ruleset Cloudflare Free Managed Ruleset のみ (OWASP コアルールセットは有料)
Logpush ❌
Security Events の保持 24時間
Free では Custom Rules に Log アクションがありません
「まず Log で観測してから Block」という定石が使えないため、代替として Managed Challenge を Block の手前段階として使います (誤検知しても人間なら通過できる)。
4.6.2 syncsync.jp 用の5本
# 名前 式 アクション 意図
1 00-skip-acme-and-api(http.request.uri.path contains "/.well-known/acme-challenge/") or (http.host eq "api.syncsync.jp")Skip 🔴 最上位固定。 SSL更新とAPIを絶対に守る
2 10-block-admin-from-outside(...wp-admin/ or wp-login.php or xmlrpc.php) and not ip.src in {<オフィス固定IP>}Managed Challenge Block でなく Challenge にするのは、リモート勤務者を締め出さないため
3 20-block-bad-methods-and-paths(http.request.method in {"TRACE" "TRACK" "DEBUG"}) or (...contains "/.git/" or "/.env" or "/wp-config")Block 設定ファイル・リポジトリの探索を遮断
4 30-protect-contact-form(...contains "/contact" or "/inquiry") and http.request.method eq "POST" and not cf.client.botManaged Challenge 🔵 プロダクトサイト固有。 ⑤Turnstile と二重で守る
5 40-geo-and-asn(ip.src.country in {...}) and not (http.request.uri.path contains "/.well-known/")Managed Challenge Xserver の「国外アクセス制限」を 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 との二重化 — 切り分けられるようにしておく
どちらが遮断したか 見分け方
Cloudflare Security > Events に記録が残る
Xserver Cloudflare Events に記録がないのに 403 が返る 、または Cloudflare 側で 5xx になる
防御の主戦場は Cloudflare WAF に一本化 (Free でも Cloudflare Free Managed Ruleset は使えます)
Xserver WAF は「オリジン直叩き」への最終防衛として残す 。誤検知が出たら該当ルールのみ OFF
Xserver WAF の検知ルールは6種:XSS / SQL / ファイル / メール / コマンド / PHP。シグネチャが素朴で、WordPress 管理画面(テーマ編集、記事本文に ls や mail を含む等)で誤検知が多い ことが知られています
移行直後の1〜2週間は、Cloudflare の Custom Rules を Block ではなく Managed Challenge で運用し、Security > Events を毎日確認してから Block へ
4.6.5 その他の推奨設定
設定 場所 推奨値 備考
Always Use HTTPS SSL/TLS > Edge Certificates ON /.well-known/acme-challenge/ は Configuration Rules で例外化
Minimum TLS Version 同上 TLS 1.2
Automatic HTTPS Rewrites 同上 ON 混在コンテンツ対策
HSTS 同上 後回し (安定後)一度入れると切り戻しが困難
Brotli Speed ON
Rocket Loader Speed 🔴 OFF JS を壊しやすい。プロダクトサイトでは特に危険
DDoS Protection Security > DDoS デフォルト Free でも L3/L4/L7 保護は無制限
Always Online Caching > Configuration ON オリジン障害時に Internet Archive のキャッシュを返す。Xserver 障害時の保険
DNSSEC DNS > Settings NS切替が Active になった後に ON 現在 DS なし。有効化後にレジストラへ DS 登録
4.7 api.syncsync.jp の扱い 🔴
必ず DNS only(グレー雲)にしてください
# 理由
1 SSL ハンドシェイク失敗(525エラー)が多発。 Google Sites / ghs.googlehosted.com をオリジンにした場合の実例が Cloudflare コミュニティに複数あり、解決策はいずれも「プロキシを外す」です
2 Cloudflare 公式が SaaS ホスティングをグレー雲対象として明記。 「SaaS-hosted websites(causes SSL errors, redirect loops, or broken assets)」および「Domain verification(CNAME/TXT records for third-party services)」
3 CNAME フラット化の影響 (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 サブドメインテイクオーバー / ダングリングDNS Xserver 側で「ドメイン設定」から外したサブドメインも DNS では解決し続けます。ワイルドカードの存在自体が「どのサブドメインが実在するか」の把握を不可能にし、棚卸しを妨げます
2 フィッシング login-microsoft-verify.syncsync.jp のような任意の詐称的サブドメインが自社ドメインで解決してしまいます。 攻撃者がサーバ側に何も置けなくても、「解決する」こと自体が組織的信用の材料に使われます。顧客を持つプロダクトドメインでは実害が大きい
3 CT ログによる無差別発行の助長 ワイルドカード+HTTP-01 の組み合わせは、意図しないホスト名で証明書が取れる余地を生みます
4 SPF / MX との干渉 ワイルドカードをオレンジ雲にすると、* にマッチする全ホストが Cloudflare IP を返します。mail smtp 等の明示レコードを作り忘れると、メール系ホスト名がプロキシに吸われます
5 Security 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.jp は a.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) にしてはいけない
レイヤ 状況
ブラウザ ⇔ Cloudflare Universal SSL が *.syncsync.jp の1階層まで カバー → OK
Cloudflare ⇔ Xserver(Full strict) 🔴 Xserver はワイルドカード証明書を扱っておらず 、「ドメイン設定/サブドメイン設定」に登録して無料独自SSLを個別発行したホスト名しか証明書を持たない → 未登録サブドメインは 526 エラー
Total TLS (深い階層をカバー)は Advanced Certificate Manager(有料アドオン)が必要 で、しかもオリジン側の問題は解決しません。
4.8.4 段階的な廃止手順(フェーズ4以降)
ワイルドカードを廃止したら、DMARC に np=reject を付けられます
存在しないサブドメインを騙るなりすましを即座に拒否できます(5.4節)。
これがワイルドカード廃止の直接的な見返りです。
恒久運用: 新規サブドメインは「Xserver のサブドメイン設定」と「Cloudflare の明示レコード」を必ずセットで作る 運用に。Security Center > Security Insights で Dangling レコード検出を月次チェック。
5 Step 2 — ②メール認証(Xserver 版)
この章は synon.co.jp 版と互換性がありません
synon.co.jp は Google Workspace が送信元ですが、syncsync.jp は Xserver 自前のメールサーバ が送信元です。設定場所も推奨値も別物です。
5.1 現状と到達目標
項目 現状 到達目標 難易度
DKIM ✅ default セレクタ・RSA 2048bit で稼働中 移管後も同じ値で稼働 (+鍵再生成時の突合運用)低(写すだけ)だが失敗の代償が最大
SPF ⚠️ 6ルックアップ・3メカニズムが同一IPを指す完全な冗長 v=spf1 mx include:spf.sender.xserver.jp ~all(4ルックアップ )中(実測が必要)
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 — 「設定する」のではなく「守る」
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に減らす
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 へ送信
2 Web フォーム(PHP mail()) サイトの問い合わせフォームから、宛先を Gmail に設定して送信
3 Xserver 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 ~all(3ルックアップ )
198.51.100.10 も含む v=spf1 mx include:spf.sender.xserver.jp ~all(4ルックアップ )← 保守的な既定値
補助ツール: 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 外部ドメイン宛のためレポートが届いていない 🔴
2 rua の宛先は DNS に記載される=全世界に公開される (宛先の選び方に注意が必要) 🔴 ガバナンス
3 noreply@syncsync.jp が受け皿として不適切⚠️
4 p=none のまま止まっている=なりすましを一切ブロックしていない ⚠️
5.4.2 なぜ届かないのか(RFC 9990 §4)
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 を個人のアカウント宛にすると、退職・異動・アカウント停止でメール認証の可視性が無言で失われます 。宛先は個人ではなく部門の共有メールボックス にしてください
2 DNS は公開情報。 Xserver の DMARC 設定マニュアル自身が警告しています ── 「レポート通知先のメールアドレスはDNSレコードに記載されるため、外部からの参照が可能となります」。rua に書いたアドレスは全世界に公開され 、スピアフィッシングとスパムの標的になります。個人名を含むアドレスや、他用途と兼用しているアドレスを rua に書かないでください
3 企業データの社外流出。 DMARC 集約レポートには、自社ドメインを名乗る送信元IP・送信量・認証結果が含まれます。これは社内のメール送信インフラの構成情報 であり、自社が管理しないドメインのメールボックス に送るべきものではありません
4 noreply@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
🔴 外部ドメイン宛の rua を削除 (届いていないうえに宛先として不適切)
dmarc-reports@syncsync.jp を Xserver でメールアドレス/転送先として新規作成
🔴 pct= は書かないこと。 RFC 9989 Appendix A.6「Removal of the 'pct' Tag」で削除されました
(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 Walk Public 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 判断の根拠
MX = syncsync.jp(apex)/案A採用後は mail.syncsync.jp
Xserver 公式FAQ:独自ドメイン名をメールサーバ名に指定した場合、「SMTP/POP3/IMAP over SSLには対応しておりません」
→ メールサーバの証明書は sv***.xserver.jp 系であり、syncsync.jp とは一致しない可能性が極めて高い
→ この状態で MTA-STS を enforce で公開すると、準拠する送信者からのメールが配送不能になります
DANE は原理的に不可能です
DANE には DNSSEC が必須ですが、加えて Xserver 側で TLSA レコードに対応する証明書運用の制御ができません。
5.5.2 TLS-RPT の導入(低リスク・単独で有効)
Name : _smtp._tls
Type : TXT
Content: v=TLSRPTv1; rua=mailto:tlsrpt@syncsync.jp
tlsrpt@syncsync.jp を Xserver で作成(dmarc-reports@ と同じ受け皿に転送してもOK)
レポートは JSON 形式で、1日1回程度 しか届きません(DMARC ほど多くない)
これで「誰かがうちにメールを送る際に TLS が失敗している」ことが分かります
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認証セキュリティ設定 ON ON のまま。 除外ホストは google.com, outlook.com, hotmail.com, ap-northeast-1(.compute).amazonaws.com 等。海外出張・海外リモートがあると送信できなくなる ので、その場合は Zero Trust(WARP)経由で国内 IP から送る
受信側DMARC設定 サーバーパネル > 迷惑メールフィルタ設定 OFF ON 推奨。 「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回まで削減済み)が効いてきます。
6 Step 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.jp syncsync.jp
フォームの種類 会社への一般問い合わせ 製品の問い合わせ・資料請求・トライアル申込
スパムの実害 迷惑メールが増える 営業リードの汚染。 本物の見込み客が埋もれる
入力される情報 氏名・会社名 氏名・会社名・電話番号・導入検討状況 (=個人情報)
送信経路 メール メール+おそらく業務システム/CRM
4.6.2 の WAF ルール #4 — Managed 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)" と明記されており、回数上限の記載はありません。
# ウィジェット名 ホスト名 用途
1 syncsync-prodsyncsync.jp, www.syncsync.jp本番の問い合わせフォーム
2 syncsync-stagingステージングのホスト名 検証環境
3 syncsync-devlocalhost, 127.0.0.1ローカル開発
本番・ステージング・localhost を1つのウィジェットにまとめないでください
シークレットキーが漏洩した際の影響範囲を切り分けられなくなります。Free で20個作れるので十分です。
受託案件用のウィジェットは顧客の Cloudflare アカウントで発行してください (8.5節 )。
ウィジェット設定(社内標準値)
項目 値
Widget Mode Managed
Appearance interaction-only
Size flexible
Language ja
Theme auto
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 の共有サーバでは環境変数の設定方法が限られます。
方法 可否 備考
.htaccess の SetEnv✅ 可 ただし .htaccess は Web公開ディレクトリに置かれる。 設定ミスで中身が見えるリスク
公開ディレクトリ外の PHP ファイルから require ✅ 推奨 public_html の外に置く
wp-config.php に define()⚠️ 可 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)
siteverify の remoteip パラメータには、$_SERVER['REMOTE_ADDR'] ではなく CF-Connecting-IP を渡してください。 4.1.7 の実IP復元を入れていれば REMOTE_ADDR が置換されているので、そのままで正しく動きます。入れていない場合は全リクエストが Cloudflare のIPになり、remoteip が無意味になります。
6.4 Pre-clearance — syncsync.jp では有効
レベル 値 スキップされるチャレンジ
Interactive interactiveInteractive のみ
Managed(推奨) managedManaged と Non-Interactive
Non-Interactive non-interactiveNon-Interactive のみ
6.5 検証チェックリスト
# 確認 方法
1 ウィジェットが表示される フォームページを開く。interaction-only なので通常は何も見えないのが正常
2 トークンがフォームに入る DevTools > Elements で <input type="hidden" name="cf-turnstile-response"> に値が入っていること
3 サーバ側検証が効いている JS を無効にしてフォームを送信 → 400 で拒否されること
4 hostname 検証が効いている 別ホストから同じ sitekey で取得したトークンを送る → hostname-mismatch
5 リプレイが拒否される 同じトークンを2回送る → timeout-or-duplicate
6 テストキーで自動テスト 1x00...AA(常に成功)/ 2x00...AA(常に失敗)/ 3x00...AA(timeout-or-duplicate)の3種を単体テストに組み込む
7 Pre-clearance Turnstile 通過後に cf_clearance Cookie が発行され、POST 時に Challenge が出ないこと
7 Step 4 — ⑥Web Analytics / ⑦Tiered Cache / ⑧Security Center
基本手順は synon.co.jp 版 Step 6 と同じです
本章では syncsync.jp で判断・設定値が変わる点 だけを扱います。
7.1 ⑥ Web Analytics
手順は同じ: アカウントレベルのダッシュボード > Web Analytics > Add a site → プロキシ済みゾーンならホスト名を選んで Done 。JSビーコンは 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 → トグルを On 。Smart 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箇所にする
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 / UNKNOWN Cloudflare が生成したレスポンス(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 が意図的にグレー雲であることを再確認する用途に使えます
Infrastructure 2ゾーン分のアセット一覧 が見られます。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分
8 2ドメイン共通の運用に足すこと
運用計画書の本体は 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/月)にするか
8.2.1 どちらを Pro にすべきか
判断軸 synon.co.jp syncsync.jp
停止時の損失 会社案内が見られない 🔴 顧客が製品サイトに到達できない。商談機会と信用の損失
WAF 強化の必要性 中 🔴 大(フォーム・API・課金)
Pro で解禁される WAF Managed Rules 中 🔴 OWASP コアルールセットが使える。プロダクトサイトで価値が大きい
Custom Rules 本数 5 → 20 5 → 20 (4.6.2 で5本を使い切っているので効く)
Rate Limiting 1本・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 公開鍵の突合 (サーバーパネル[表示]⇔ dig) 5分 鍵再生成による無言の 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.jp syncsync.jp
送信元 Google Workspace (+HubSpot 等の外部SaaS)Xserver 自前 (+将来トランザクショナルメール)
送信元の棚卸し 🔴 難しい。 マーケ系SaaSが独自に送っている可能性がある ✅ 容易。 Xserver 経由がほぼ全部
DKIM Google 用 DKIM の新規設定が必要 (反映まで最大48時間)✅ 既に稼働中 (移すだけ)
SPF 8/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ドメイン共通)
最速の切り戻し手段(覚えておくこと)
症状 切り戻し 所要
プロキシ起因のあらゆる問題 該当レコードをグレー雲に戻す 数分 (TTL 300秒)
SSL 526 SSL/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 ⚠️ 重要(作業手順に影響する)
# 未確定事項 確認方法 影響
5 Xserver「指定したIPアドレスからの接続を許可」の登録可能件数と CIDR 表記の可否 サーバーパネルで実際に Cloudflare の15レンジを登録してみる 収まらなければ「国外アクセス制限 OFF」に方針変更(4.1.6)
6 サーバーパネル > SSL設定 の「他社ネームサーバーでのDNS認証」が更新時にも使えるか Xserver サポートに問い合わせ 使えるなら #1 のリスクが消える
7 実在サブドメインの完全な一覧 ドメイン設定/サブドメイン設定の一覧 + アクセスログ + CT ログ ワイルドカード廃止の可否(4.8節)
8 ftp.syncsync.jp は実在するか、ワイルドカード由来かサーバーパネルの一覧で確認 明示レコードを作るべきか
9 Cloudflare DMARC Management の SPF 自動編集機能 が、外部CNAME(api)があっても動くか 有効化して挙動を確認 レポート受信自体には影響しないはず(5.4.4)
10 Xserver WAF に除外設定(ホワイトリスト)機能があるか サーバーパネルで確認 誤検知時の対処方法が変わる(4.6.4)
11 サイトが WordPress か否か、キャッシュプラグインの有無 実機確認 4.1.7・7.2 の適用可否
12 問い合わせフォームの実装(Contact Form 7 / 自前 PHP / 外部SaaS) 実機確認 6.3節の実装方法が変わる
13 syncsync.jp のレジストラはどこか (Xserverドメインか他社か)Whois / 契約書 NS 変更の操作場所が変わる(4.4.1)
9.3 📋 Free プラン制約の実機確認(2ゾーン分)
# 確認項目 期待値
14 Custom Rules の上限 5本/ゾーン
15 Custom Rules に Log アクションがないこと ない(Managed Challenge で代替)
16 Rate Limiting の上限と期間 1本/10秒固定
17 Managed Ruleset の選択肢 Cloudflare Free Managed Ruleset のみ
18 Security Events の保持期間 24時間
19 Notifications で Webhook が選べないこと 選べない(Pro ゾーンが必要)
20 Security Center の手動スキャン可否 不可(週次自動のみ)
21 Cache Rules の上限 10本
22 Edge Cache TTL の最小値 2時間
23 Tiered Cache が Free で有効化できること できる
24 ワイルドカードレコードがプロキシできること できる(全プラン)
25 Turnstile ウィジェット数 20/アカウント
26 Zero 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 のドキュメント/サポートに確認
C www.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
そして必ず手作業で:
Gmail から info@syncsync.jp へ送信 → 着信
info@syncsync.jp から Gmail へ送信 → ソース表示で spf=PASS dkim=PASS dmarc=PASS
メールクライアント(IMAP 993 / SMTP 465)の送受信
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.jp Webhook 通知はアカウント全体で解禁されます。
着手順序(最短経路)
【今すぐ・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 版をそのまま参照してください。
syncsync.jp セキュリティ構築手順書 + synon.co.jp との2ドメイン比較
作成日 2026-08-17 / 本書の DNS 実測値は同日時点のものです
9章の未確定事項を潰してから着手してください