スパムメール対策(迷惑メール対策、送信メールのなりすまし対策)として有効な DKIM(DomainKeys Identified Mail)について解説します。
目次
スパムメールとは
スパムメール(Spam Mail)とは受信者の都合を一切考えずに、無差別かつ大量に送信されるメールのことを言います。
スパムメールの内容は有益な内容は一切なく、詐欺的な内容(ワンクリック詐欺)やメールに添付されているファイルを開くとウィルスに感染するなど被害が発生する恐れがあります。
また、スパムメールの性質上、大体がメールアドレスを詐称して送信されます。
メールはなりすまししやすい
メールはもともと、かなり古い仕組みです。極端に言うと、技術的には悪意のある人が以下のようななりすましメールを作れてしまいます。
From: support@example.com
To: customer@gmail.com
Subject: 重要なお知らせ
でも、この From: support@example.com は、単なるメールヘッダー上の表示です。
つまり、本当に example.com の正規メールサーバーから送られたのかは、Fromだけでは分かりません。
主なドメイン認証技術
現在、主なドメイン認証技術は以下の 2 つに集約されてきています。
- 送信元の IP アドレスを利用してドメインが正しいか確認する方法 ← SPF
- 電子署名(デジタル署名)を利用してドメインが正しいか確認する方法 ← DKIM
DMARC は SPF/DKIM を使った判定ルールと処理方針
DMARC は SPF と DKIM の結果を見て、「SPF または DKIM が正しく、かつ From ドメインと整合していればOK」「ダメならどう扱うかは、このポリシーに従ってください」と受信側に伝えます。
つまり DMARC は、SPF/DKIM そのものではなく、SPF/DKIM を使った判定ルールと処理方針 です。
DKIM(DomainKeys Identified Mail)とは
DKIM は「ディーキム」と読みます。一言でいうと、「このメールは、このドメインのメール送信システムが責任を持って署名したメールです」と受信側に証明する仕組みです。
DKIM は「DomainKeys」と「IIM」が統一化されたものです。
- DomainKeys ← 米 Yahoo! が提唱
- IIM(Identified Internet Mail) ← Cisco Systems が提唱
DKIMの登場人物
DKIMには主に3つ出てきます。
1. 秘密鍵
2. 公開鍵
3. セレクタ
【例】
ドメイン:example.com
<mark style="background-color:rgba(0, 0, 0, 0);color:#ffff00" class="has-inline-color">セレクタ</mark>:example-selector-smtp
<mark style="background-color:rgba(0, 0, 0, 0);color:#ffff00" class="has-inline-color">秘密鍵</mark>:OpenDKIM サーバーに置く
/etc/opendkim/keys/example.com/example-selector-smtp.private
<mark style="background-color:rgba(0, 0, 0, 0);color:#ffff00" class="has-inline-color">公開鍵</mark>:
example 側 DNS に TXT レコードとして登録する
example-selector-smtp._domainkey.example.com
DKIM は電子署名(デジタル署名)を利用してドメイン認証を行なう
メールの何が問題なのかと言えば、SMTP プロトコルの仕様上、「メールアドレスのドメイン部分が信用できない」ということに尽きます。なので、ドメインが正しいことを証明できればいいわけです。
その正しさを「電子署名(でんししょめい)(デジタル署名)」を利用して証明します。
電子署名(デジタル署名)とは
電子署名(デジタル署名)とは、電子文書に負荷する署名であり、現実世界のハンコ(判子)やサイン(署名)に相当します。
【図解】デジタル署名(Digital Signature)(電子署名)の仕組み
■電子署名(デジタル署名)を作成する手順
- 鍵(公開鍵と秘密鍵の鍵ペア)を生成する
- 署名を生成する
- 署名を検証する
DKIM で電子署名(デジタル署名)はどのように使われているのか
【例】tama-chan.com ドメインのメールを送信する場合
- メール送信サーバー(SMTP サーバー) ← 秘密鍵を保持する
- tama-chan.com ドメインを管理している DNS サーバー ← 公開鍵を保持する
秘密鍵と公開鍵をメールサーバーと DNS サーバーに登録する
秘密鍵と公開鍵はペアです。
- 秘密鍵 ← メール送信サーバーが保持し、メール送信時に電子署名を付加します。絶対に外部公開しません。
- 公開鍵 ← DNS サーバーに TXT レコードとして登録します。Gmail などの受信側が見に来ます。
受信者は電子メールを受信後、受信したメールの署名者に関する情報からドメインを特定し、ドメインを管理している権威 DNS より公開鍵を取得します。
秘密鍵で署名したものは、対応する公開鍵で検証できます。ただし、公開鍵から秘密鍵を逆算することは現実的にできません。
秘密鍵と公開鍵の関係は以下のようになります。
【例】
OpenDKIM:
秘密鍵でメールに署名する
Gmail:
DNSの公開鍵で署名を検証する
電子署名の例
下図の赤い線で囲まれている部分が電子署名です。
FROM ドメインと DKIM 署名ドメインが異なる場合
結論から言うと、以下になります。
DKIM pass
= DKIM-Signature の d= ドメインの公開鍵で署名検証に成功した
DMARC pass
= Fromドメインと、SPFまたはDKIMで認証されたドメインが整合している
OpenDKIM とは
OpenDKIM は、Postfix などのメールサーバーに「DKIM署名機能」を追加するための常駐プログラムです。
DKIM そのものは「メールにドメインの電子署名を付ける仕組み」ですが、OpenDKIM はその DKIM 署名を実際に付けるソフトウェアです。OpenDKIM は DKIM 対応アプリケーション用のCライブラリと、DKIM サービスを提供するオープンソースのmilter です。
自前で SMTP サーバーを運用して DKIM を導入する場合は、OpenDKIM を使うケースは一般的です。DKIM = OpenDKIM ではありませんが、OpenDKIM は DKIM を実現するための代表的なライブラリの1つです。
以下のような関係になります。
DKIM
= メールに電子署名を付ける仕組み・規格
OpenDKIM
= DKIM署名を付けるためのソフトウェア実装の1つ
Postfix / Sendmail
= メールを送信するMTA・SMTPサーバー本体
OpenDKIM の仕事は、メールを外部に送る直前に、
DKIM-Signature: ...
というヘッダーをメールに追加することです。
具体的には、OpenDKIM が秘密鍵を使ってメールに署名します。
OpenDKIMがやること:
・Fromドメインを見て、どの鍵で署名するか判断する
・秘密鍵を読み込む
・メール本文やヘッダーのハッシュを作る
・DKIM-Signatureヘッダーを付与する
受信側の Gmail は、その DKIM-Signature を見て、DNS に登録された公開鍵で検証します。
OpenDKIM は、Postfix などの MTA と milter という仕組みで連携します。
milter は、メールサーバーがメールを処理する途中で外部フィルターを呼び出す仕組みです。OpenDKIM はその milter として動作します。OpenDKIM はドメイン単位でメールの署名・検証を行う DKIM 実装で、設定ファイルはopendkim.conf です。
OpenDKIM インストールおよび設定手順
OpenDKIM のインストールや設定手順については以下のページに詳細を記載しています。
OpenDKIM 用鍵生成
opendkim-genkey は、メッセージ署名に使う秘密鍵と DNS 用 TXT レコード(公開鍵)を生成するコマンドです。
コマンド例
SELECTOR="example-selector-smtp"
DOMAIN="example.com"
sudo mkdir -p /etc/opendkim/keys/${DOMAIN}
sudo opendkim-genkey -b 2048 -d ${DOMAIN} -s ${SELECTOR} \
-D /etc/opendkim/keys/${DOMAIN}
生成されるファイル
/etc/opendkim/keys/example.com/example-selector-smtp.private (秘密鍵)
/etc/opendkim/keys/example.com/example-selector-smtp.txt (公開鍵)
生成されるファイル名はセレクタに基づき、秘密鍵は.private、TXTレコードは.txt の suffix になります。
example-selector-smtp.private
→ 秘密鍵
→ OpenDKIM が署名に使う
→ 絶対に外部公開しない
example-selector-smtp.txt
→ DNS 登録用の公開鍵TXT
→ example.com の DNS に登録する
→ 外部公開される情報
DNS に登録する内容
example-selector-smtp.txt には、以下のような内容が入ります。
Name:
example-selector-smtp._domainkey.example.com
Type:
TXT
Value:
v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBg...
Route 53で example.com の Hosted Zone に登録する場合、Name は一般的に以下で大丈夫です。
example-selector-smtp._domainkey
DNS登録後、受信側のGmailは以下のレコードを見に行きます。
example-selector-smtp._domainkey.example.com
OpenDKIM が署名するまでの処理フロー
全体の流れを具体的に書くと以下のようになります。
1. アプリがメールを作る
From: xxx@example.com
2. アプリが Postfix へメールを渡す
3. Postfix が OpenDKIM へメールを渡す
4. OpenDKIM が SigningTable を見る
*@example.com に一致するか確認
5. 一致したら KeyTable を見る
example-selector-smtp._domainkey.example.com の秘密鍵パスを確認
6. 秘密鍵を読む
/etc/opendkim/keys/example.com/example-selector-smtp.private
7. メールに DKIM-Signature を付ける
d=example.com
s=example-selector-smtp
8. Postfix が外部へ配送する
9. Gmail が受信する
10. Gmail が DNS を見る
example-selector-smtp._domainkey.example.com
11. 公開鍵で署名検証する
12. 成功すれば dkim=pass



