OpenDKIMを利用したメール認証

今回はOpenDKIMを利用したメール認証設定を行います。
DKIMやらSPFやら、メールは何かと面倒だと感じてしまいますね。

今回行うのはDKIMによる送受信の設定です。

前座学

DKIMは公開鍵と秘密鍵を利用した、いわゆる電子証明書による認証を行う規格です。
SPFもメールの認証を行うものですが、SPFはIPベースの認証です。
DKIMドメインベースの認証という感じでしょうか。

じゃあ機能的に何が違うのかというと、SPFではメールの内容が改竄されても検知できませんが、DKIMではメールの内容が改竄された場合に検知ができるという点などがあります。
細かいところではDKIMではユーザ(メアド)ごとに認証が可能であったりもあるようですが、上記が大きいのかなと思います。

具体的な仕組みはこちらを参照してください。

証明書ということがわかれば、慣れている方は改竄検知可能とすぐわかるのでしょうが私はよくわかりませんでした。
改竄検知の流れは以下のようになっているようです。
1. メール送信時にヘッダや内容からrsaなどを利用しハッシュ値を作り、秘密鍵で電子署にする
2. 作成した電子署名をメールのヘッダに載せる
3. 受信したサーバでもヘッダと内容を利用しハッシュ値を作成する
4. 公開鍵でメールにある電子署名をハッシュに復号化する。
5. 3, 4で作成した値を比較

なるほどですね〜。

またSPFもそうですが、認証が失敗した場合にどうするかは結局受信側のさじ加減ですので、これを設定すれば絶対に迷惑メールにならないということを保証するものではありません。
あくまで送られているメールが正しい場所からきているということを担保するものです。

OpenDKIMの設定

それではOpenDKIMを利用して、設定を行っていきます。

公開鍵の作成

$ yum install opendkim  
$ opendkim-genkey -D /etc/opendkim/keys/ -s your_selector -d hogehoge.com  
$ chown opendkim:opendkim /etc/opendkim/keys/your_selector.private  
$ less /etc/opendkim/keys/your_selector.txt   

まずはopenDKIMのインストールと鍵の作成を行います。
/etc/opendkim/keysのディレクトリに、セレクタドメインを指定して鍵を作成という流れですね。
その後作成されたテキストを確認しています。
このファイルの中身はDNSのTXTレコード風なものになっていますので、ここで作成された公開鍵をDNSに登録します。
DNSには ._domainkey.に対してTXTレコードで、v=...; k=...; p=... みたいに登録すればよいです。
それぞれ、バージョン、ハッシュ化方式、公開鍵になります。

またDNSへの反映が完了したかどうかは以下のコマンドで確認することができます。

$ dig your_selector._domainkey.hogehoge.com txt  

設定ファイルの編集

鍵の作成が完了したら、設定ファイルの編集を行います。

$ cp /etc/opendkim.conf /etc/opendkim.conf.org  
$ vi /etc/opendkim.conf  
$ diff /etc/opendkim.conf.org /etc/opendkim.conf  
20c20  
< Mode v  
---  
> Mode sv   
65c65  
< KeyFile  /etc/opendkim/keys/default.private  
---  
> # KeyFile   /etc/opendkim/keys/default.private  
70c70  
< #KeyTable   /etc/opendkim/KeyTable  
---  
> KeyTable /etc/opendkim/KeyTable  
75c75  
< #SigningTable   refile:/etc/opendkim/SigningTable  
---  
> SigningTable refile:/etc/opendkim/SigningTable  
79c79  
< #ExternalIgnoreList refile:/etc/opendkim/TrustedHosts  
---  
> ExternalIgnoreList   refile:/etc/opendkim/TrustedHosts  
82c82  
< #InternalHosts  refile:/etc/opendkim/TrustedHosts  
---  
> InternalHosts    refile:/etc/opendkim/TrustedHosts  

Modeの設定は、s: 送信時の署名、v: 受信時の確認を行うということになります。

KeyFileではなくKeyTableを利用するので片方をコメントアウトし、片方を解放しています。
KeyTableには利用する秘密鍵を設定します。
SigningTableには鍵を付与するfromアドレスを指定します。
ExternalIgnoreListは認証を行わないサーバを設定していきます。
InternalHostsには送信時に必ず認証するものを設定します。

今回ExternalとInternalに同じものが指定されているのは自分自身を設定するため、自分から自分へはチェックしないし、自分からどこかへ送る時には認証を施すからです。

では、各々のファイルを編集します。

$ cp /etc/opendkim/KeyTable /etc/opendkim/KeyTable.org  
$ vi /etc/opendkim/KeyTable  
$ diff /etc/opendkim/KeyTable.org /etc/opendkim/KeyTable  
6a7  
> your_selector._domainkey.hogehoge.com hogehoge.com:your_selector:/etc/opendkim/keys/your_selector.private  

これでメールヘッダに付与するセレクタドメイン情報、電子署名に利用する秘密鍵を設定しているようですね。

$ cp /etc/opendkim/SigningTable /etc/opendkim/SigningTable.org  
$ vi /etc/opendkim/SigningTable  
$ diff /etc/opendkim/SigningTable.org /etc/opendkim/SigningTable  
15a16  
> *@hogehoge.com your_selector._domainkey.hogehoge.com  

hogehoge.comから送られるすべてのメールに対して、鍵を付与します。
そのときに付与する鍵が、セレクタドメインの組み合わせが設定値のものということですね。

$ cp /etc/opendkim/TrustedHosts /etc/opendkim/TrustedHosts.org  
$ vi /etc/opendkim/TrustedHosts  
$ diff /etc/opendkim/TrustedHosts.org /etc/opendkim/TrustedHosts  
9a10  
> xxx.xxx.xxx.xxx  

デフォルトでローカルIPは指定されていましたので、global ipもついでに指定しました。
あんまり意味はないです。

$ vi /etc/postfix/main.cf  
$ diff /etc/postfix/main.cf.org /etc/postfix/main.cf  
.....省略.....  
> # DKIM settings  
> smtpd_milters = inet:127.0.0.1:8891  
  
$ systemctl enable opendkim  
$ systemctl restart opendkim  
$ systemctl status opendkim  
opendkim.service - DomainKeys Identified Mail (DKIM) Milter  
   Loaded: loaded (/usr/lib/systemd/system/opendkim.service; enabled)  
   Active: active (running) since Thu 2015-09-17 02:12:30 JST; 7s ago  

最後にPostfixdkimの連携を行い、デーモンを起動します。
これで設定は完了です。

単純な設定であれば案外シンプルですね。
DKIMで、今回は特定のドメインからのメールを一括で設定しましたが、メアドごとや複数ドメイン設定などをする場合はセレクタを変えたり、セレクタの前にユーザ名を入れたものを作成したりしながら設定を切り分けていきます。

動作確認

gmailなどにメール送信して、メールのソースを確認すると動作検証が行えます。
メールのソースを開いたときに「dkim=pass」という記述があれば成功です。

あとがき

DKIMの設定を模倣して行っていたので、この記事を書くまで動きのイメージはできていましたが設定ファイルの中身や認証の仕組みがよくわかっていませんでした。
やはり誰かに伝えようとしたときに、「嘘できるだけつきたくない」という心理の元勉強が始まるので記事を書くのは自分のためになりますね。