DKIM(DomainKeys Identified Mail)- メール改ざんを防ぐデジタル署名
これは何?
DKIM(DomainKeys Identified Mail)は、公開鍵暗号を使ってメールの送信元とメール内容の正当性を保証する技術です。送信側がメールにデジタル署名を付与し、受信側がDNSに公開された公開鍵で署名を検証することで、メールが改ざんされていないことを確認できます。
DKIMの仕組みは以下の通りです:
- 送信側: メールサーバーが秘密鍵でメールヘッダーと本文の一部にデジタル署名を作成
- 署名の付与:
DKIM-Signatureヘッダーにセレクタ名、ドメイン、署名値などを記載 - 受信側: DNSから公開鍵を取得し、署名を検証
- 判定: 署名が有効なら正当なメールと判断
DKIMの公開鍵は、DNSのTXTレコードに以下の形式で公開されます:
default._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4G..."
なぜ重要なのか
DKIMがないと、以下のようなリスクが生じます:
- メール改ざんの検出不可: 送信後にメール内容が書き換えられても気づけない
- なりすまし防止の弱体化: SPFだけでは送信元IPしか検証できないが、DKIMはドメイン自体を保証
- メール到達率の低下: DKIM署名がないメールは、迷惑メールフィルタに引っかかりやすい
- DMARCが機能しない: DMARC認証にはSPFまたはDKIMが必須。両方あるのが理想
特に、ビジネスメールや重要な通知メールを送信する場合、DKIMは受信側からの信頼を得るために不可欠です。Gmail、Outlook、Yahoo!などは、DKIM署名のないメールを厳しくフィルタリングします。
攻撃の仕組み
DKIMがない、または適切に検証されていない場合、以下のような攻撃が可能になります:
メール改ざん攻撃
-
中間者攻撃: 攻撃者がメール配送経路に侵入し、メール内容を書き換える
元のメール: 「送金先: 正規の銀行口座」 改ざん後: 「送金先: 攻撃者の口座」 -
DKIMなしの場合: 受信側は改ざんを検出できず、そのまま受信者に配送
-
DKIMありの場合: 署名検証が失敗し、改ざんが検出される
リプレイ攻撃
攻撃者が正規のメールを傍受し、別の受信者に転送する攻撃もあります。DKIMには通常、タイムスタンプ(t=)と有効期限(x=)が含まれるため、古い署名を使った攻撃を防げます。
実際の被害事例
ビジネスメール詐欺(BEC)での悪用
2018年、欧州の製造業で、取引先を装ったメールにより約2億円の被害が発生しました。攻撃者は正規のメールを傍受し、一部を改ざんして転送しました。DKIM署名があれば、このような改ざんを検出できた可能性があります。
日本企業のメール改ざん事例
国内でも、請求書メールの振込先を書き換える攻撃が報告されています。特にメールサーバーのセキュリティが脆弱な中小企業が標的になりやすく、DKIM未設定が攻撃を容易にしています。
フィッシングメールでの悪用
2020年、COVID-19ワクチン関連を装ったフィッシングメールが大量送信されました。多くは政府機関を騙るものでしたが、DKIM署名がないため、受信者は正規メールと区別できませんでした。
Nyambushでの検出内容
Nyambushは、以下の項目をチェックします:
- DKIMレコードの存在: 一般的なセレクタ名(
default、google、selector1など)でDNS TXTレコードを確認 - 公開鍵の形式:
v=DKIM1、k=rsa、p=<公開鍵>が正しく設定されているか - 鍵の長さ: 2048ビット以上のRSA鍵が推奨(1024ビット以下は脆弱)
- 複数セレクタ: 鍵のローテーションが可能な複数セレクタの設定を推奨
スキャン結果では、DKIMが未設定の場合、使用中のメールサービスに応じた設定方法を提案します。
対策方法
1. メールサービスプロバイダの設定を確認
多くのクラウドメールサービスは、DKIM設定を自動または半自動で行えます。
Google Workspaceの場合
- Google Admin Consoleにログイン
- 「アプリ」→「Google Workspace」→「Gmail」→「メール認証」
- 「DKIMで受信メールを認証する」を有効化
- 「新しいレコードを生成」をクリック
- 表示されたDNS TXTレコードをDNSプロバイダに追加:
ホスト名: google._domainkey
タイプ: TXT
値: v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
TTL: 3600
- 数時間後、Googleのコンソールで「認証を開始」をクリック
Microsoft 365の場合
- Microsoft 365 Defender管理センターにアクセス
- 「メールと共同作業」→「ポリシーとルール」→「脅威ポリシー」→「DKIM」
- ドメインを選択し、「DKIMキーを作成」
- 2つのCNAMEレコードをDNSに追加:
ホスト名: selector1._domainkey
タイプ: CNAME
値: selector1-example-com._domainkey.example.onmicrosoft.com
ホスト名: selector2._domainkey
タイプ: CNAME
値: selector2-example-com._domainkey.example.onmicrosoft.com
- 数時間後、「DKIMで署名を有効化」をクリック
2. 自社メールサーバーの場合
OpenDKIMやPostfixでDKIMを設定します:
# OpenDKIMをインストール
sudo apt-get install opendkim opendkim-tools
# 鍵ペアを生成(2048ビット推奨)
sudo opendkim-genkey -b 2048 -d example.com -D /etc/opendkim/keys/ -s default -v
# 公開鍵を確認
sudo cat /etc/opendkim/keys/default.txt
# 以下のような出力が得られる
# default._domainkey IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBg..."
この公開鍵をDNSに追加します。
3. セレクタの概念
セレクタは、複数のDKIM鍵を管理するための識別子です。例えば、鍵のローテーションや異なるメールサーバーで別の鍵を使う場合に便利です:
# メインサーバー用
default._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=..."
# マーケティングツール用
marketing._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=..."
メール送信時のDKIM-Signatureヘッダーにs=defaultまたはs=marketingと指定することで、どの鍵で署名したか識別できます。
4. テストと検証
設定後は必ずテストします:
# 公開鍵を確認
dig default._domainkey.example.com TXT
# テストメールを送信し、ヘッダーを確認
# 受信メールに以下のようなヘッダーがあればOK
# DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=default; ...
# Authentication-Results: dkim=pass header.d=example.com
オンラインツール(mail-tester.comなど)でDKIM検証を確認するのもおすすめです。
5. 鍵のローテーション
セキュリティ向上のため、定期的(年1回など)にDKIM鍵をローテーションします:
- 新しいセレクタで新しい鍵ペアを生成
- DNSに新しい公開鍵を追加
- メールサーバーの設定を新しいセレクタに変更
- 旧鍵は数週間残しておき、移行期間中の検証に使う
- 移行完了後、旧鍵を削除
まとめ
DKIMは、SPFと並んでメール認証の重要な柱です。公開鍵暗号という強力な技術により、メールの改ざんやなりすましを高精度で検出できます。
設定はメールプロバイダに依存する部分が多いですが、Google WorkspaceやMicrosoft 365では比較的簡単に有効化できます。自社メールサーバーを運用している場合でも、OpenDKIMなどのツールを使えば実装可能です。
SPF、DKIM、そしてDMARCの三点セットを揃えることで、メールセキュリティは格段に向上します。Nyambushの無料スキャンで、今すぐあなたのドメインのDKIM設定を確認してみてください。