CAAレコードとは
CAA(Certificate Authority Authorization)レコードは、ドメインのSSL/TLS証明書を発行できる認証局(CA)を指定するDNSレコードです。認証局が侵害された場合でも、許可していない証明書の発行を防ぐセキュリティ制御として機能します。
CAAレコードが重要な理由
CAAレコードがなければ、信頼された多数の認証局のいずれもドメインの証明書を発行できます。これには次のリスクがあります。
- CAの侵害: 信頼されたCAのいずれかが侵害されると、攻撃者がドメインの証明書を取得できる
- 誤発行: CAが証明書を誤って発行することがある
- ソーシャルエンジニアリング: 攻撃者がCAをだまして、許可されていない証明書を発行させる可能性がある
CAAレコードは発行できるCAを制限し、攻撃対象領域を減らします。
CAAの仕組み
1. ドメイン所有者が公開: 所有者がDNSにCAAレコードを登録する
2. 証明書申請者が依頼: 申請者がCAに証明書を求める
3. CAがCAAを確認: CAがドメインのCAAレコードを調べる
4. CAが発行: 許可されている場合(またはCAAレコードが存在しない場合)だけ発行する
5. 許可がない場合: CAは申請を拒否しなければならない
CAによる必須チェック
2017年9月以降、すべてのCAは証明書を発行する前にCAAレコードを確認することが義務付けられています。これはCA/Browser ForumのBaseline Requirementsに含まれる要件です。
CAAレコードの形式
example.com. IN CAA 0 issue "letsencrypt.org"
構成要素:
- 0: フラグ(0は非クリティカル、128はクリティカル)
- issue/issuewild/iodef: プロパティタグ
- "letsencrypt.org": プロパティ値(許可されたCA)
プロパティタグ
| タグ | 目的 | 例 |
|---|---|---|
| issue | すべての証明書についてCAを許可 | issue "letsencrypt.org" |
| issuewild | ワイルドカード証明書についてCAを許可 | issuewild "digicert.com" |
| iodef | 許可されていない試行を報告 | iodef "mailto:[email protected]" |
CAAレコードの例
単一CA(Let's Encryptのみ)
example.com. CAA 0 issue "letsencrypt.org"
複数のCA
example.com. CAA 0 issue "letsencrypt.org"
example.com. CAA 0 issue "digicert.com"
example.com. CAA 0 issue "sectigo.com"
ワイルドカードの制限
通常の証明書にはLet's Encrypt、ワイルドカード証明書にはDigiCertを許可します。
example.com. CAA 0 issue "letsencrypt.org"
example.com. CAA 0 issuewild "digicert.com"
すべて拒否(証明書を発行しない)
証明書を発行する予定がないドメインに役立ちます。
example.com. CAA 0 issue ";"
通知を設定する
example.com. CAA 0 issue "letsencrypt.org"
example.com. CAA 0 iodef "mailto:[email protected]"
主なCA識別子
| CA | 識別子 |
|---|---|
| Let's Encrypt | letsencrypt.org |
| DigiCert | digicert.com |
| Sectigo (Comodo) | sectigo.com |
| GlobalSign | globalsign.com |
| GoDaddy | godaddy.com |
| Amazon | amazon.com |
| Google Trust Services | pki.goog |
使用する正確な識別子は、CAの公式ドキュメントで確認してください。
CAAレコードの実装
DNSプロバイダーから設定する
多くのDNSプロバイダーは、管理画面でCAAレコードを登録できます。
ゾーンファイルから設定する
; Allow Let's Encrypt and DigiCert
@ IN CAA 0 issue "letsencrypt.org"
@ IN CAA 0 issue "digicert.com"
@ IN CAA 0 iodef "mailto:[email protected]"
CAAの継承
CAAレコードはDNS階層に従います。
- example.comにCAAレコードがあると、サブドメインにも適用される
- サブドメインは独自のCAAレコードを持ち、親の設定を上書きできる
- CAAレコードがない場合は、どのCAでも発行できる
example.com. CAA 0 issue "letsencrypt.org" ; Applies to all
api.example.com. CAA 0 issue "digicert.com" ; Override for api
CAAレコードの確認
digを使う:dig example.com CAA
; ANSWER SECTION:
example.com. 300 IN CAA 0 issue "letsencrypt.org"
DomScanを使う:
curl "https://domscan.net/v1/health?domain=example.com"
# Reports hasCAA in security details
CAAのベストプラクティス
1. 常にCAAを設定する: 攻撃対象領域を減らす
2. 利用するすべてのCAを含める: CDNやクラウドプロバイダーのCAも忘れない
3. iodefを設定する: 許可されていない試行の通知を受け取る
4. 強制前にテストする: 利用するCAが発行できることを確認する
5. レコードを最新に保つ: 証明書を申請する前に新しいCAを追加する
CAAでよくある問題
証明書の更新に失敗する: CAAレコードにCAがないためです。証明書の有効期限前にCAを追加してください。 CDNの証明書発行に失敗する: CDNプロバイダーのCAが許可されていません。CDNが利用するCAを確認してください。 サブドメインのCAAがない: 子ドメインは親のCAAを継承します。必要なら個別のレコードを設定してください。CAAは、すべてのドメインで導入すべき、シンプルで強力なセキュリティ制御です。