DKIM (DomainKeys Identified Mail)

メール & セキュリティ
送信メールにデジタル署名を追加するメール認証方法。受信者がメッセージが変更されなかったことを確認できます。
← 用語集に戻る

DKIMとは何か?

DKIM(DomainKeys Identified Mail)は、送信サーバーが送信メッセージに電子署名を付けられるメール認証方式です。受信サーバーはDNSに公開された公開鍵で署名を検証し、メールが転送中に改変されていないことと、申告されたドメインから実際に送信されたことを確認できます。

DKIMの仕組み

1. 鍵の生成: ドメイン所有者が公開鍵と秘密鍵のペアを生成します

2. DNSへの公開: 公開鍵をTXTレコードとして公開します

3. メッセージへの署名: 送信メールに秘密鍵で署名します

4. 署名の検証: 受信サーバーが公開鍵を取得し、署名を検証します

署名の手順

メールを送信すると、次の処理が行われます。

1. Mail server calculates a hash of message headers and body

2. Hash is encrypted with the private key (creating the signature)

3. Signature is added as a DKIM-Signature header

4. Email is transmitted

検証の手順

メールを受信すると、次の処理が行われます。

1. Server extracts the DKIM-Signature header

2. Finds selector and domain (s=selector; d=domain.com)

3. Queries DNS for selector._domainkey.domain.com TXT record

4. Uses public key to decrypt the signature

5. Calculates its own hash of the message

6. Compares: match = pass, mismatch = fail

DKIMレコードの形式

DKIMレコードは、特定のサブドメインに置かれるTXTレコードです。

selector._domainkey.example.com.    IN    TXT    "v=DKIM1; k=rsa; p=MIGfMA0..."

レコードの構成要素

タグ説明
vバージョンv=DKIM1
k鍵の種類k=rsa
p公開鍵(base64)p=MIGfMA0GCSqG...
tフラグ(任意)t=y (testing mode)
hハッシュアルゴリズムh=sha256

セレクター

セレクターを使うと、1つのドメインで複数のDKIM鍵を運用できます。

google._domainkey.example.com       # Google Workspace

s1._domainkey.example.com # Sendgrid

mailchimp._domainkey.example.com # Mailchimp

各メールサービスが独自のセレクターと鍵を提供します。

DKIM署名ヘッダー

DKIM署名は次のような形式です。

DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=google;

c=relaxed/relaxed; q=dns/txt;

h=from:to:subject:date:message-id;

bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;

b=AuUoFEfDxTDkHlLXSZEpZj79...

主なフィールド:

DKIMの設定

Google Workspaceの場合

1. 管理コンソールで Apps → Gmail → Authenticate email を開きます

2. DKIM鍵を生成します(2048ビットを推奨)

3. Googleが提供するTXTレコードを追加します

4. DKIM署名を有効にします

サードパーティサービスの場合

多くのメールサービス(SendGrid、Mailchimpなど)は、次のいずれかを提供します。

1. 管理対象の鍵に使うCNAMEレコード

2. 公開鍵を含むTXTレコード

例(SendGrid):

s1._domainkey.example.com    CNAME    s1.domainkey.sendgrid.net

DKIMを検証する

テストメールを送信する: ヘッダーを表示できるサービスにテストメールを送ります(Gmailでは認証結果を確認できます)。 コマンドラインを使う:
dig google._domainkey.example.com TXT
DomScanを使う:
curl "https://domscan.net/v1/health?domain=example.com"

# Reports DKIM status based on common selectors

DKIMのベストプラクティス

2048ビット鍵を使う

古い1024ビット鍵は次第に攻撃を受けやすくなっています。現在は多くのプロバイダーが2048ビットを標準にしています。

鍵を定期的にローテーションする

DKIM鍵は毎年、またはセキュリティインシデントの後に更新します。切り替える前に、新しいセレクターで新しい鍵を公開してください。

重要なヘッダーに署名する

From、To、Subject、Date、Message-IDが署名に含まれていることを確認します。

署名済みメッセージを変更しない

メーリングリストや転送サービスが内容を変更すると、DKIM検証が失敗します。転送メールにはARC(Authenticated Received Chain)を使用してください。

DKIMの制限

DKIMだけではなりすましを防げません。メッセージが改変されていないことを証明するだけなので、ドメインに有効なDKIMが設定されていても、攻撃者が署名なしのなりすましメールを送信する可能性があります。署名なしのメッセージへの対応方法はDMARCで指定します。

この知識を実践する

DomScan の API を使用してドメインの可用性、状態などを確認します。