DKIM鍵のローテーションとは、メールの署名に使う鍵ペアを、スケジュールに沿って新しいものに交換することです。新しいセレクター名で新しい公開鍵をDNSに公開し、署名に使う鍵を新しい秘密鍵に切り替え、古い鍵ペアを廃止します。
Messaging, Malware and Mobile Anti-Abuse Working Group(M3AAWG)は、メールの運用に携わる事業者向けにベストプラクティスを公表している業界団体です。M3AAWGは、鍵が盗まれた場合に備えて、DKIM鍵を少なくとも6か月ごとにローテーションすることを推奨しています。
このガイドは、自社またはクライアントのドメインを管理していて、そのドメインのメールがすでにDKIMの検証に合格しているチームを対象としています。DKIM鍵をローテーションする方法と、ローテーションしなかった場合に起こりうる問題について、知っておくべきことをすべて説明します。
お使いのドメインのメールがどの鍵で署名されているかをまだ調べている段階であれば、まずDKIMセレクターの確認方法を解説したガイドをお読みください。この記事では、そのガイドの続きとなる内容を扱います。
鍵が漏えいすると、攻撃者はお使いのドメインからのメールとして認証に合格するメッセージを送信できるようになります。秘密鍵はDNSで公開されることがなく、お使いのドメインのメッセージに署名するメールサーバーやメール送信サービスに保管されています。そのいずれかに侵入した攻撃者は、秘密鍵をコピーできます。
攻撃者は次に、自分で作成したメッセージに、お使いのドメインの秘密鍵で署名します。受信メールサーバーはDNSからお使いのドメインの公開鍵を取得し、その署名を検証します。
DMARCは、認証されたドメインとFromアドレスのドメインを照合するチェックです。このメッセージの署名に記載されたドメインはFromアドレスのドメインと一致するため、メッセージはDMARCにも合格します。受信サーバーはDMARCに失敗したメールにしかDMARCポリシーを適用しないので、ポリシーがp=rejectであっても、お使いのドメイン自身の鍵で署名されたこのメッセージを配信します。
M3AAWGは、漏えいした鍵が悪用されるこのリスクを、定期的なローテーションを推奨する理由として挙げています。鍵ペアを使用する期間が短いほど、漏えいした鍵を悪用できる期間も短くなるからです。
ローテーションを誰が担当するかは、セレクターごとに公開されているDNSレコードの種類と、そのセレクターを使って署名しているメール送信サービスが独自のスケジュールで鍵をローテーションしているかどうかの2点で判断できます。レコードの種類を確認するには、お使いのドメインのDNS設定(Cloudflare、GoDaddy、ドメインのレジストラなど、DNSを管理している事業者の画面)を開き、名前の先頭がセレクター名で、その直後に._domainkeyが続くレコードを探します。見つかった各レコードの種類(Type)の列に、TXTまたはCNAMEと表示されています。
DNSを別の担当者が管理している場合は、代わりに各メール送信サービスのDKIM設定ページを確認します。このページには、追加するよう求められたレコードとして、CNAMEレコードか、長い鍵の値を含む1つのTXTレコードのどちらかが記載されています。
TXTレコードには公開鍵そのものが格納されるため、鍵を新しくするたびに、お使いのドメインのDNSに新しいTXTレコードを公開する必要があります。したがって、Google Workspaceのように鍵ペアをメール送信サービスが生成する場合でも、ローテーションはご自身で行う作業になります。
セレクター名に設定されたCNAMEレコードは、メール送信サービスが管理するレコードを指すエイリアス(別名)です。メール送信サービスは秘密鍵を保管しており、お使いのドメインのDNSを変更しなくても、新しい公開鍵をそのつど参照先のレコードに公開できます。
レコードの種類からわかるのは、誰が鍵を交換できるかです。鍵の交換がいつ行われるかはレコードの種類からはわからず、独自のスケジュールでローテーションするサービスもあれば、ご自身がローテーションを開始するまで待つサービスもあります。4つのメール送信サービスでローテーションがどのように行われるかを、次の表にまとめます。
| メール送信サービス | 秘密鍵を保管する側 | ローテーションの方法 |
|---|---|---|
| Microsoft 365 | Microsoftが保管します。お使いのドメインのDNSに一度だけ公開する2つのCNAMEレコード(selector1、selector2)が、Microsoftの管理する鍵のレコードを指しています。 | ご自身で開始します。Defender portalの「Rotate DKIM keys」か、Exchange Online PowerShellのRotate-DkimSigningConfigコマンドレットを使います。Microsoftのドキュメントによると、ローテーションを開始してから4日(96時間)後に、Microsoftが署名を新しい鍵に切り替えます。 |
| Google Workspace | Googleが保管します。公開鍵はご自身でTXTレコードとして公開します。 | 手動で行います。Admin console(管理コンソール)で新しいセレクターのプレフィックスを指定して新しいレコードを生成し、DNSを管理している事業者で新しいTXTレコードとして追加してから、認証を開始します。 |
| Salesforce(Sales Cloud) | Salesforceが保管します。お使いのドメインのCNAMEレコードが、Salesforceの管理する鍵のレコードを指しています。 | 自動で行われます。Salesforceが30日ごとに鍵をローテーションします。 |
| Amazon SES(Easy DKIM) | AWSが保管します。AWSはEasy DKIMで鍵ペアを生成し、その鍵でお使いのドメインのメールに署名します(鍵長はデフォルトで2048ビット)。 | ご自身でスケジュールを組む作業はありません。鍵はAWSが保管しており、Easy DKIMのドキュメントには、ドメインの所有者が行うローテーションの手順は記載されていません。 |
TXTレコードとして公開されている鍵と、Microsoft 365のようにご自身がローテーションを開始するまで待つサービスの鍵は、すべてご自身でローテーションする鍵です。この表にないメール送信サービスについても、同じように、セレクターに設定されたレコードの種類と、ローテーションを誰が開始するかについてのサービスのドキュメントの2点を確認してください。Salesforceについては、Salesforceの製品ごとの設定も含めて、Salesforceから送信するメールとDMARCについてのガイドで解説しています。
クライアントのドメインのDKIMを管理している場合、M3AAWGのガイダンスでは、ローテーションの依頼はドメインの所有者から出すものとされています。ローテーションの日付はその都度クライアントと合意し、その日にDNSと署名の変更を行ってください。
ご自身でローテーションする鍵について、M3AAWGは少なくとも6か月ごとのローテーションを推奨しています。M3AAWGのメンバーはDKIM Key Rotation Best Common Practicesの中で複数のローテーション頻度を比較し、鍵が漏えいするリスクと鍵を交換する作業の手間とのバランスが取れる頻度として、6か月という頻度を選びました。この文書は販売の繁忙期を避けて固定の日程を決めることを勧めており、たとえばオンラインストアであれば4月と10月といった日程になります。
次の2つの場合は、予定日より前にローテーションします。
ローテーションのたびに鍵長を確認します。RFC 8301は、署名する側に1024ビット以上のRSA鍵の使用を求め、2048ビットを推奨しています。そのため、セレクターのDNSレコードにまだ1024ビットの鍵が入っている場合は、交換用の鍵を2048ビットで生成してください。
2つのセレクターで重複期間を設ける方法なら、署名の検証失敗を1件も起こさずに鍵を交換できます。どのメッセージに含まれるセレクターも、DNSに公開されたままの公開鍵を指しているからです。重複期間中は、新旧2つの公開鍵をそれぞれ別のセレクター名で公開したまま、署名に使う鍵を古い秘密鍵から新しい秘密鍵に切り替えます。
以下の手順は、ご自身で運用するメールサーバーがメールに署名している場合を想定しています。Google Workspaceのように鍵ペアをサービス側で生成するメール送信サービスでは、新しい鍵の作成と署名の切り替えはそのサービスの管理コンソールで行いますが、DNSレコードの公開とその後の失効はご自身で行います。
mail-202604のように日付を含む名前にすると、各鍵を使い始めた時期の順にセレクターを並べ替えられます。mail-202604._domainkey.yourdomain.com)をDNSで検索して新しい公開鍵が返ってくれば、参照できる状態です。メールサーバーがまだ新しい鍵で署名していないので、待っている間に検証に失敗する署名はありません。s=タグに新しいセレクターが記載され、受信サーバーは新しい公開鍵で署名を検証します。v=DKIM1; p=(p=の値が空)に変更して、古い鍵を失効させます。RFC 6376では、空の値は失効した鍵を表すと定められています。M3AAWGはこのレコードを削除せずにDNSに残しておくことを推奨しており、そうすれば古いセレクターを検索した受信サーバーは、存在しないレコードではなく、意図的に廃止された鍵を見つけることになります。Microsoft 365では、Microsoftが自社側で同じ重複期間を設けています。2つのセレクターはどちらも公開されたままで、ローテーションを開始してから4日(96時間)後に、Microsoftが署名を新しい鍵に切り替えます。
お使いのドメインのDMARCレコードにrua=タグ(レポートを受け取るアドレスを指定するタグ)がある場合、受信サーバーは指定されたアドレスにDMARC集約レポートを送信します。このレポートにはローテーションの経過が記録され、新しいセレクターで署名されたメッセージは認証に合格し始め、古いセレクターで署名されたメッセージはレポートに記載されなくなります。M3AAWGは、各ローテーションの約1週間後に監査を行い、受信サーバーが確認したセレクターと、有効になる予定だったセレクターを照合することを推奨しています。
廃止したセレクターがレポートに記載され続けている場合は、何らかの問題が起きています。最初に確認すべき原因は2つあり、1つは誰もローテーションしておらず、まだ古い鍵で署名しているサービス、もう1つは署名側とDNS側の一方でしかローテーションされていない鍵です。後者の場合、メールサーバーがある鍵で署名しているのに、DNSレコードには別の鍵が入っているため、受信サーバーはそのメッセージをDKIMの検証で不合格と判定します。
DMARCeyeはDMARC集約レポートを代わりに読み解き、ドメインごとに、メールの署名に使われているセレクターを一覧表示します。そのため、本来はもう記載されないはずのセレクターが残っていても確認できます。無料プランは1つのドメインに対応しています。
Microsoft 365のselector1とselector2のように、よく使われるセレクター名を使っているサービスであれば、下の無料DKIMチェッカーで、各セレクターに公開されている鍵とその鍵の強度を確認できます。チェッカーを使えば、2048ビットの鍵に交換すべき1024ビットの鍵を見つけられます。このチェッカーは、mail-202604のような独自のセレクター名は検索しません。
はい、M3AAWGはセレクター名の再利用を避けるよう強く勧めています。再利用した名前のレコードに新しい鍵が入った時点で、受信サーバーは、まだ配信途中のメールも含め、古い鍵で署名されたすべてのメッセージをDKIMの検証で不合格と判定するためです。billing-202604のようにローテーションの日付を含む名前にしておけば、各鍵をいつ使い始めたかもわかります。
いいえ、重複期間中に古い鍵を公開したままにしておけば、認証に失敗することはありません。受信サーバーがメッセージの到着時に署名を検証するため、古い鍵は7日から30日間公開したままにしておき、その鍵で署名された配信の遅れたメールが、失効の前に届いて検証に合格するようにします。失効させた後も、すでに配信されたメールは配信済みのまま変わらず、失敗するのは古いメッセージを後から再検証した場合だけです。
現在のDKIM2のドラフトでは、鍵のローテーションの方法は変わりません。IETFはDKIMの見直しとして計画されているDKIM2の策定を進めており、DKIM2のDNSに関するドラフトにも同じ鍵の仕組みが定められています。この仕組みでは、送信者がセレクター名で公開鍵をDNSに公開し、p=の値を空にして鍵を失効させます。
DKIM鍵のローテーションはスケジュールを決めて行う作業で、そのスケジュールに含める必要があるのは、ご自身でローテーションする鍵だけです。そうすれば、鍵が漏えいしても、その鍵を悪用できるのは、誰かがインシデントに気づくまでではなく、次に予定されているローテーションまでに限られます。
利用しているメール送信サービスを、各セレクターのレコードの種類と、各サービスが独自のスケジュールで鍵をローテーションしているかどうかで分類します。ご自身でローテーションする鍵はすべて年2回のスケジュールに組み込み、漏えいが疑われるときや、署名鍵にアクセスできる人が組織を離れるときは、予定より早くローテーションします。鍵の交換は毎回、2つのセレクターで重複期間を設けて行い、どのメッセージのセレクターも存在しない鍵を指すことがないようにします。
DMARC集約レポートを受け取っていれば、各ローテーションの完了をレポートで確認できます。予定した日に、新しいセレクターで署名されたメッセージが認証に合格し、古いセレクターがレポートに記載されなくなれば、ローテーションは完了です。DMARCeyeがお使いの各ドメインでメールの署名に使われているセレクターを表示するので、毎日のレポートが届くたびに、すべてのローテーションを確認できます。