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...
主なフィールド:
- d=: 署名に使うドメイン
- s=: DNSレコードを探すためのセレクター
- h=: 署名に含めるヘッダー
- b=: 実際の署名
- bh=: 本文のハッシュ
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で指定します。