*

OpenDKIMを利用したメール認証

公開日: : 投稿者:raru CentOS7, Linux, サーバ, メール

今回は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

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

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

動作確認

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

あとがき

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

関連記事

no image

SSL脆弱性/セキュリティ設定

昨今POODLEやらFREAKやらと大きめなOpenSSLの脆弱性が多発していました。 最近では安

記事を読む

no image

CentOS7 初期設定

しばらく振りになりますが、ひっそりとWordpressの移設を行っていました。 お仕事が多忙を極め

記事を読む

no image

RedmineからsSMTPでメールを送信

Redmineの管理画面にアクセスしたところメール通知設定は所定のファイルを編集しないとできないよう

記事を読む

no image

RaspbianのZabbix ServerにZabbix Agentをインストール

前回の記事でRaspbianにZabbixサーバをインストールしてみました。 今回はzabbi

記事を読む

no image

RaspberryPI3にCentOS7をインストール (mac利用)

いつの間にやらRaspberryPI 3が発売し、さらにはCentOSまでもがraspberry p

記事を読む

no image

Raspberry Pi2/ラズベリーパイ2にFedoraをインストール

Raspberry pi2にFedoraがインストールできるという情報を入手したので2台目を購入して

記事を読む

no image

Raspberry Pi/ラズベリーパイ にFedora(Pidora)をインストール

Raspberry PI2にFedoraをインストール 注文していたRaspberry P

記事を読む

no image

ZabbixからsSMTPを利用してエラー通知メール送信

今回はsSMTPを利用してRaspbian上のZabbix Serverからアラートメールの送信を行

記事を読む

no image

Pidoraの時刻設定(ntp)

現在Pidoraを監視サーバ化しようとしているところです。 なかなか苦労しますね。普通のサーバで設

記事を読む

no image

Raspberry Pi 2(Raspbian) 初期設定

性懲りもせずにRaspberry pi2を購入しました。 初代に比べて相当スペックが向上しており、

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

PAGE TOP ↑