複数ドメイン管理の運用チェックリスト — 見落としゼロを目指す定期確認フロー
5個以上のドメインを管理するには、ドメイン台帳・定期チェックスクリプト・アラート通知の3点が最低限必要です。ドメインの数が増えると、SSL 証明書の期限切れや DNS レコードの設定漏れを見落とすリスクが高くなります。1つのドメインなら手動で確認できても、5個、10個と増えた段階で確認作業が属人化し、担当者の退職や異動で誰もチェックしなくなるケースは珍しくありません。
このチェックリストは、5〜20 個のドメインを管理する組織が月次で実施する定期確認フローです。dig や curl を使った手動確認から、シェルスクリプトによるバッチ処理まで段階的に進めます。example.com の部分は実際のドメイン名に置き換えてください。
flowchart TD
A[ドメイン台帳を作成] --> B[定期チェックスクリプトを設定]
B --> C[DNS レコード確認]
B --> D[SSL 証明書確認]
B --> E[メール認証確認]
C --> F[結果を評価]
D --> F
E --> F
F -->|問題あり| G[修正対応]
G --> H[再チェック]
H --> F
F -->|問題なし| I[次回チェックまで待機]
I --> B
B --> J[アラート設定]
J --> K[SSL 期限 30日前通知]
J --> L[メール認証異常通知]
チェックリスト一括コピー用
以下をコピーして手元のメモやIssueに貼り付ければ、そのまま確認リストとして使えます。
## 複数ドメイン管理チェックリスト
### ドメイン台帳の整備
- [ ] 管理対象のドメインを一覧にまとめている
- ドメイン名、用途、DNS プロバイダー、レジストラ、担当者、更新期限
- [ ] 台帳の最終更新日が 3ヶ月以内である
- [ ] 新規ドメイン追加・廃止のフローが決まっている
### DNS レコードの定期確認
- [ ] 各ドメインの A / AAAA レコードが意図した IP を指している
- `dig A example.com +short`
- [ ] NS レコードが正しいプロバイダーを指している
- [ ] 不要なレコード(テスト用サブドメイン等)が残っていない
### SSL 証明書の有効性確認
- [ ] 各ドメインに HTTPS で到達できる
- `curl -sI https://example.com | head -1`
- [ ] 証明書の有効期限が 30日以上残っている
- [ ] 自動更新の仕組みが動作している(マネージド SSL / ACME クライアント等)
### メール認証の確認
- [ ] 各送信ドメインで SPF レコードが存在する
- `dig TXT example.com +short`
- [ ] DKIM レコードが設定済みである
- [ ] DMARC レコードが設定済みで、rua= にレポート受信先が指定されている
- `dig TXT _dmarc.example.com +short`
### バッチ確認スクリプトの実行
- [ ] ドメインリストファイル(domains.txt)が最新の台帳と一致している
- [ ] スクリプトの出力に ERROR がないことを確認した
### 一括確認(API)
- `curl "https://labee.dev/api/dns?domain=example.com&type=A,NS"`
- `curl "https://labee.dev/api/ssl-cert?hostname=example.com"`
- `curl "https://labee.dev/api/mail-auth?domain=example.com"`
Step 1 ドメイン台帳を整備する
複数ドメインの管理で最初に必要なのは、管理対象の一覧表です。スプレッドシートでもテキストファイルでも構いませんが、以下の項目を含めてください。
- ドメイン名
- 用途(コーポレートサイト、サービス、メール送信専用など)
- DNS プロバイダー
- レジストラと更新期限
- SSL 証明書の管理方式(マネージド SSL / ACME クライアント自己管理)
- 担当者
DNS レコードを Terraform や Pulumi などの IaC で管理している場合は、コードリポジトリーの場所も記録しておくと、台帳との整合性を保ちやすくなります。
チェック項目
- 管理対象のドメインを一覧にまとめている
- 台帳の最終更新日が 3ヶ月以内 である
- 新規ドメイン追加・廃止のフローが決まっている
台帳のメンテナンスが止まると、退職した前任者しか知らないドメインが放置され、証明書の期限切れや DNS のハイジャックに気づかないまま数ヶ月が過ぎることがあります。四半期ごとの見直しを推奨します。
バッチ確認用に、台帳からドメイン名だけを抽出したテキストファイルを作成しておきます。
cat domains.txt
example.com
shop.example.com
mail.example.net
corporate.example.co.jp
以降の Step では、このファイルを使って各ドメインを順番に確認します。
Step 2 DNS レコードを定期確認する
DNS レコードは一度設定すれば変わらないと思われがちですが、サーバー移行や CDN の切り替え時に A レコードの更新を忘れたり、テスト用のサブドメインを削除し忘れたりするケースがあります。月次の確認で、各ドメインの A / AAAA レコードと NS レコードが意図した値を指しているかを確認します。
チェック項目
- 各ドメインの A / AAAA レコードが意図した IP アドレスを指している
- NS レコードが正しい DNS プロバイダーを指している
- 不要なレコード(テスト用サブドメイン等)が残っていない
確認コマンド
dig A example.com +short
203.0.113.1
NS レコードも確認します。
dig NS example.com +short
ns1.example-dns.com.
ns2.example-dns.com.
labee.dev の API でも同じ情報を取得できます。
curl "https://labee.dev/api/dns?domain=example.com&type=A,NS"
{
"success": true,
"data": {
"domain": "example.com",
"records": {
"A": [
{ "address": "203.0.113.1", "ttl": 300 }
],
"NS": ["ns1.example-dns.com", "ns2.example-dns.com"]
}
},
"error": null,
"meta": { "responseTime": 85 }
}
data.records.A の address が意図した IP と一致しているか、data.records.NS が正しい DNS プロバイダーのネームサーバーを指しているかを確認してください。
IP アドレスの逆引きも確認しておくと、サーバーの所属を把握しやすくなります。
curl "https://labee.dev/api/ip?ip=203.0.113.1"
{
"success": true,
"data": {
"ip": "203.0.113.1",
"type": "IPv4",
"isPrivate": false,
"ptr": "server1.example-hosting.com"
},
"error": null,
"meta": { "responseTime": 42 }
}
data.ptr が意図したホスティングサービスのホスト名であることを確認してください。
Step 3 SSL 証明書の有効性を確認する
AWS ACM や Vercel などのマネージド SSL を利用しているドメインでは、証明書の更新はプラットフォーム側で自動的に処理されます。一方、ACME クライアントで自己管理しているドメインでは、更新スクリプトの実行権限が変わっていたり、DNS-01 チャレンジ用の API キーが期限切れになっていたりすると、気づかないまま証明書が失効します。複数ドメインを管理している場合、1つだけ更新が止まっていても他のドメインが正常なため発見が遅れます。
チェック項目
- 各ドメインに HTTPS で到達できる
- 証明書の有効期限が 30日以上 残っている
- 自動更新の仕組みが動作している(マネージド SSL / ACME クライアント等)
確認コマンド
openssl コマンドで有効期限を直接確認できます。
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -dates
notBefore=Mar 1 00:00:00 2026 GMT
notAfter=May 30 23:59:59 2026 GMT
labee.dev の API では、HTTPS の到達性を確認できます。
curl "https://labee.dev/api/ssl-cert?hostname=example.com"
{
"success": true,
"data": {
"hostname": "example.com",
"port": 443,
"reachable": true,
"status": 200
},
"error": null,
"meta": { "responseTime": 156 }
}
data.reachable が true であれば、外部から HTTPS で正常に接続できています。false が返る場合は、証明書の期限切れ、DNS の設定ミス、ファイアウォールの遮断などを確認してください。
Step 4 メール認証を確認する
メールを送信するドメインでは、SPF・DKIM・DMARC の3つが正しく設定されている必要があります。2024年2月以降、Gmail は1日5,000通以上を送信するドメインに対してこれら3つすべてを必須としています。ドメインが増えると、あるドメインだけ DMARC を設定し忘れていた、という状況が起きやすくなります。
チェック項目
- 各送信ドメインで SPF レコードが存在する
- DKIM レコードが設定済みである
- DMARC レコードが設定済みで、
rua=にレポート受信先が指定されている
確認コマンド
SPF と DMARC は dig で確認します。
dig TXT example.com +short
"v=spf1 include:_spf.google.com ~all"
dig TXT _dmarc.example.com +short
"v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com"
labee.dev の API では、SPF・DKIM・DMARC・BIMI を一括で確認できます。
curl "https://labee.dev/api/mail-auth?domain=example.com"
{
"success": true,
"data": {
"spf": {
"record": "v=spf1 include:_spf.google.com ~all",
"exists": true
},
"dkim": {
"mode": "auto",
"record": "v=DKIM1; k=rsa; p=MIIBIjAN...",
"exists": true,
"selector": "google",
"matches": [
{ "selector": "google", "record": "v=DKIM1; k=rsa; p=MIIBIjAN...", "exists": true }
],
"checkedSelectors": ["google", "selector1", "selector2", "s1", "s2", "k1", "k2", "k3", "default", "dkim", "mail", "smtp", "mte1", "mte2", "pdk1", "pdk2", "mesmtp", "zoho"],
"exhaustive": false
},
"dmarc": {
"record": "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com",
"exists": true,
"source": "exact",
"domain": "example.com"
},
"bimi": { "record": null, "exists": false }
},
"error": null,
"meta": { "responseTime": 142 }
}
data.spf.exists、data.dkim.exists、data.dmarc.exists がすべて true であることを確認してください。data.dmarc.record に rua= が含まれていない場合は、DMARC レポートを受信できない状態です。
Step 5 バッチ確認スクリプトを作成する
Step 2〜4 の確認を手動で繰り返すのは、ドメインが5個を超えた時点で現実的ではありません。シェルスクリプトが書ける場合は、ドメインリストを読み込んで一括チェックするスクリプトを用意します。スクリプトが書けない場合は、Step 2〜4 のコマンドをドメインごとに手動実行し、結果をスプレッドシートに記録する運用でも十分です。
チェック項目
- ドメインリストファイル(domains.txt)が最新の台帳と一致している
- スクリプトの出力に ERROR がないことを確認した
スクリプト例
以下のスクリプトは、domains.txt の各行を読み込み、labee.dev の API で DNS・SSL・メール認証を確認します。jq がインストールされている必要があります。
#!/bin/bash
DOMAIN_LIST="domains.txt"
API_BASE="https://labee.dev/api"
echo "=== 複数ドメイン一括チェック ==="
echo "実行日時: $(date '+%Y-%m-%d %H:%M:%S')"
echo ""
while IFS= read -r domain; do
# 空行とコメント行をスキップ
[[ -z "$domain" || "$domain" =~ ^# ]] && continue
echo "--- $domain ---"
# DNS チェック(A レコード)
dns_result=$(curl -s "$API_BASE/dns?domain=$domain&type=A")
a_record=$(echo "$dns_result" | jq -r '.data.records.A[0].address // "NONE"')
if [ "$a_record" = "NONE" ]; then
echo " DNS: ERROR - A レコードが見つかりません"
else
echo " DNS: OK - $a_record"
fi
# SSL チェック
ssl_result=$(curl -s "$API_BASE/ssl-cert?hostname=$domain")
reachable=$(echo "$ssl_result" | jq -r '.data.reachable // false')
if [ "$reachable" = "true" ]; then
echo " SSL: OK - HTTPS 到達可能"
else
echo " SSL: ERROR - HTTPS 到達不可"
fi
# メール認証チェック
mail_result=$(curl -s "$API_BASE/mail-auth?domain=$domain")
spf_exists=$(echo "$mail_result" | jq -r '.data.spf.exists')
dkim_exists=$(echo "$mail_result" | jq -r '.data.dkim.exists')
dmarc_exists=$(echo "$mail_result" | jq -r '.data.dmarc.exists')
if [ "$spf_exists" = "true" ]; then
echo " SPF: OK"
else
echo " SPF: ERROR - レコードが見つかりません"
fi
if [ "$dkim_exists" = "true" ]; then
echo " DKIM: OK"
else
echo " DKIM: ERROR - レコードが見つかりません"
fi
if [ "$dmarc_exists" = "true" ]; then
dmarc_record=$(echo "$mail_result" | jq -r '.data.dmarc.record')
if echo "$dmarc_record" | grep -q "rua="; then
echo " DMARC: OK (rua 設定済み)"
else
echo " DMARC: WARN - rua= が未設定です"
fi
else
echo " DMARC: ERROR - レコードが見つかりません"
fi
echo ""
done < "$DOMAIN_LIST"
echo "=== チェック完了 ==="
実行方法
chmod +x check-domains.sh
./check-domains.sh
=== 複数ドメイン一括チェック ===
実行日時: 2026-04-22 10:00:00
--- example.com ---
DNS: OK - 203.0.113.1
SSL: OK - HTTPS 到達可能
SPF: OK
DKIM: OK
DMARC: OK (rua 設定済み)
--- shop.example.com ---
DNS: OK - 203.0.113.2
SSL: ERROR - HTTPS 到達不可
SPF: ERROR - レコードが見つかりません
DKIM: ERROR - レコードが見つかりません
DMARC: ERROR - レコードが見つかりません
=== チェック完了 ===
出力に ERROR が含まれているドメインは、個別に原因を調査してください。このスクリプトを cron や CI/CD パイプラインに組み込めば、月次チェックを自動化できます。
Step 6 アラート・通知を設定する
定期チェックの仕組みができたら、異常を検知したときに通知が届くようにします。
チェック項目
- スクリプトの実行結果を Slack やメールに通知する設定を追加した
- cron ジョブまたは CI/CD のスケジュール実行を設定した
通知の組み込み例
Step 5 のスクリプトに、ERROR を検知した場合だけ通知する仕組みを追加します。
#!/bin/bash
DOMAIN_LIST="domains.txt"
API_BASE="https://labee.dev/api"
ERRORS=""
while IFS= read -r domain; do
[[ -z "$domain" || "$domain" =~ ^# ]] && continue
# SSL チェック
ssl_result=$(curl -s "$API_BASE/ssl-cert?hostname=$domain")
reachable=$(echo "$ssl_result" | jq -r '.data.reachable // false')
if [ "$reachable" != "true" ]; then
ERRORS="${ERRORS}${domain}: SSL 到達不可\n"
fi
# メール認証チェック
mail_result=$(curl -s "$API_BASE/mail-auth?domain=$domain")
spf_exists=$(echo "$mail_result" | jq -r '.data.spf.exists')
dmarc_exists=$(echo "$mail_result" | jq -r '.data.dmarc.exists')
if [ "$spf_exists" != "true" ]; then
ERRORS="${ERRORS}${domain}: SPF 未設定\n"
fi
if [ "$dmarc_exists" != "true" ]; then
ERRORS="${ERRORS}${domain}: DMARC 未設定\n"
fi
done < "$DOMAIN_LIST"
# ERROR がある場合のみ通知
if [ -n "$ERRORS" ]; then
echo -e "=== ドメインチェック異常検知 ===\n$ERRORS"
# Slack Webhook に通知する例:
# curl -s -X POST "$SLACK_WEBHOOK_URL" \
# -H 'Content-Type: application/json' \
# -d "{\"text\": \"ドメインチェック異常検知:\n$ERRORS\"}"
fi
cron で月次実行する場合は以下のように設定します。
# 毎月1日の午前9時に実行
0 9 1 * * /path/to/check-domains.sh
よくある設定ミス
ドメインごとに DNS プロバイダーが異なり把握できていない
組織の成長に伴い、時期ごとに異なるプロバイダーでドメインを取得していると、どのドメインがどのプロバイダーにあるかが分からなくなります。台帳にプロバイダー情報を記録し、NS レコードの確認で実態と台帳が一致しているか定期的に照合してください。
メール送信しないドメインのメール認証を放置している
メールを送信しないドメインでも、SPF に v=spf1 -all を、DMARC に v=DMARC1; p=reject を設定しておくと、そのドメインを騙ったなりすましメールを防止できます。台帳で「メール送信なし」と記録されているドメインにも、拒否ポリシーの設定を推奨します。
SSL 証明書の自動更新が一部のドメインだけ止まっている
ACME クライアントで自己管理している場合、certbot は更新対象の証明書を /etc/letsencrypt/renewal/ 配下の設定ファイルで管理しています。サーバー移行時にこのディレクトリーをコピーし忘れると、移行先では自動更新が動作しません。マネージド SSL を利用しているドメインと自己管理のドメインが混在している場合は、どのドメインがどの方式で管理されているかを台帳に記録してください。Step 5 のバッチスクリプトで全ドメインの SSL 到達性を定期的に確認しておけば、管理方式に関わらず更新停止を早期に検知できます。
DNS レコードの変更後に伝播を確認していない
TTL を短く設定していても、DNS の変更はリゾルバーのキャッシュが消えるまで反映されません。変更直後に dig や API で確認しても古い値が返ることがあります。TTL に設定した秒数が経過してから再確認してください。
用語解説DNS 伝播(DNS Propagation)DNS レコードの変更が世界中のリゾルバーに反映される過程。実態はキャッシュの期限切れであり、TTL の事前短縮で待ち時間を短縮できる。 用語解説TTL(Time To Live)DNS レコードがキャッシュされる有効期間を秒数で指定する値。DNS 切り替え時の反映速度を左右する。