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には
それぞれ、バージョン、ハッシュ化方式、公開鍵になります。
また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
最後にPostfixとdkimの連携を行い、デーモンを起動します。
これで設定は完了です。
単純な設定であれば案外シンプルですね。
DKIMで、今回は特定のドメインからのメールを一括で設定しましたが、メアドごとや複数ドメイン設定などをする場合はセレクタを変えたり、セレクタの前にユーザ名を入れたものを作成したりしながら設定を切り分けていきます。
動作確認
gmailなどにメール送信して、メールのソースを確認すると動作検証が行えます。
メールのソースを開いたときに「dkim=pass」という記述があれば成功です。
あとがき
DKIMの設定を模倣して行っていたので、この記事を書くまで動きのイメージはできていましたが設定ファイルの中身や認証の仕組みがよくわかっていませんでした。
やはり誰かに伝えようとしたときに、「嘘できるだけつきたくない」という心理の元勉強が始まるので記事を書くのは自分のためになりますね。