DKIM(DomainKeys Identified Mail)- メール改ざんを防ぐデジタル署名

これは何?

DKIM(DomainKeys Identified Mail)は、公開鍵暗号を使ってメールの送信元とメール内容の正当性を保証する技術です。送信側がメールにデジタル署名を付与し、受信側がDNSに公開された公開鍵で署名を検証することで、メールが改ざんされていないことを確認できます。

DKIMの仕組みは以下の通りです:

  1. 送信側: メールサーバーが秘密鍵でメールヘッダーと本文の一部にデジタル署名を作成
  2. 署名の付与: DKIM-Signatureヘッダーにセレクタ名、ドメイン、署名値などを記載
  3. 受信側: DNSから公開鍵を取得し、署名を検証
  4. 判定: 署名が有効なら正当なメールと判断

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がない、または適切に検証されていない場合、以下のような攻撃が可能になります:

メール改ざん攻撃

  1. 中間者攻撃: 攻撃者がメール配送経路に侵入し、メール内容を書き換える

    元のメール: 「送金先: 正規の銀行口座」
    改ざん後: 「送金先: 攻撃者の口座」
    
  2. DKIMなしの場合: 受信側は改ざんを検出できず、そのまま受信者に配送

  3. DKIMありの場合: 署名検証が失敗し、改ざんが検出される

リプレイ攻撃

攻撃者が正規のメールを傍受し、別の受信者に転送する攻撃もあります。DKIMには通常、タイムスタンプ(t=)と有効期限(x=)が含まれるため、古い署名を使った攻撃を防げます。

実際の被害事例

ビジネスメール詐欺(BEC)での悪用

2018年、欧州の製造業で、取引先を装ったメールにより約2億円の被害が発生しました。攻撃者は正規のメールを傍受し、一部を改ざんして転送しました。DKIM署名があれば、このような改ざんを検出できた可能性があります。

日本企業のメール改ざん事例

国内でも、請求書メールの振込先を書き換える攻撃が報告されています。特にメールサーバーのセキュリティが脆弱な中小企業が標的になりやすく、DKIM未設定が攻撃を容易にしています。

フィッシングメールでの悪用

2020年、COVID-19ワクチン関連を装ったフィッシングメールが大量送信されました。多くは政府機関を騙るものでしたが、DKIM署名がないため、受信者は正規メールと区別できませんでした。

Nyambushでの検出内容

Nyambushは、以下の項目をチェックします:

  1. DKIMレコードの存在: 一般的なセレクタ名(defaultgoogleselector1など)でDNS TXTレコードを確認
  2. 公開鍵の形式: v=DKIM1k=rsap=<公開鍵>が正しく設定されているか
  3. 鍵の長さ: 2048ビット以上のRSA鍵が推奨(1024ビット以下は脆弱)
  4. 複数セレクタ: 鍵のローテーションが可能な複数セレクタの設定を推奨

スキャン結果では、DKIMが未設定の場合、使用中のメールサービスに応じた設定方法を提案します。

対策方法

1. メールサービスプロバイダの設定を確認

多くのクラウドメールサービスは、DKIM設定を自動または半自動で行えます。

Google Workspaceの場合

  1. Google Admin Consoleにログイン
  2. 「アプリ」→「Google Workspace」→「Gmail」→「メール認証」
  3. 「DKIMで受信メールを認証する」を有効化
  4. 「新しいレコードを生成」をクリック
  5. 表示されたDNS TXTレコードをDNSプロバイダに追加:
ホスト名: google._domainkey
タイプ: TXT
値: v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
TTL: 3600
  1. 数時間後、Googleのコンソールで「認証を開始」をクリック

Microsoft 365の場合

  1. Microsoft 365 Defender管理センターにアクセス
  2. 「メールと共同作業」→「ポリシーとルール」→「脅威ポリシー」→「DKIM」
  3. ドメインを選択し、「DKIMキーを作成」
  4. 2つのCNAMEレコードをDNSに追加:
ホスト名: selector1._domainkey
タイプ: CNAME
値: selector1-example-com._domainkey.example.onmicrosoft.com

ホスト名: selector2._domainkey
タイプ: CNAME
値: selector2-example-com._domainkey.example.onmicrosoft.com
  1. 数時間後、「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鍵をローテーションします:

  1. 新しいセレクタで新しい鍵ペアを生成
  2. DNSに新しい公開鍵を追加
  3. メールサーバーの設定を新しいセレクタに変更
  4. 旧鍵は数週間残しておき、移行期間中の検証に使う
  5. 移行完了後、旧鍵を削除

まとめ

DKIMは、SPFと並んでメール認証の重要な柱です。公開鍵暗号という強力な技術により、メールの改ざんやなりすましを高精度で検出できます。

設定はメールプロバイダに依存する部分が多いですが、Google WorkspaceやMicrosoft 365では比較的簡単に有効化できます。自社メールサーバーを運用している場合でも、OpenDKIMなどのツールを使えば実装可能です。

SPF、DKIM、そしてDMARCの三点セットを揃えることで、メールセキュリティは格段に向上します。Nyambushの無料スキャンで、今すぐあなたのドメインのDKIM設定を確認してみてください。

この記事をシェア:Xでポスト

あなたのドメインは安全ですか?

Nyambushで今すぐ無料スキャンして、セキュリティリスクをチェックしましょう。