*

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

Raspberry Piのpidoraをセットアップ

以前私はRaspberry PiにPidoraを入れたのですが、初期設定をしたつもりになっていてして

記事を読む

no image

CentOS6にredmineを導入

CentOSにredmineを導入しました。 Gitとの連携を目論んでいたのですが、redmine

記事を読む

no image

Raspbianでメール送信 ssmtp編

Raspbianで監視などをおこなっているとメールが送信したくなります。 とりあえず何かと管理用に

記事を読む

no image

個人でのProxyサーバ利用用途

Proxyサーバを建てたいということで、利用用途を考えていました。 まずサイト高速化であったり冗長

記事を読む

no image

PidoraにZabbix2.2を入れてみた

※完璧な状態ではありません。 こちらの記事のzabbix設定周りを行うと解決する可能性がありま

記事を読む

no image

CentOSで不要カーネルの削除

サーバを利用して時間が経過すると溜まってくるLinuxのkernelの削除方法の備忘録。 忘れるた

記事を読む

no image

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

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

記事を読む

no image

apache2.4でBOTからのアクセスを排除

私は何か数字が動くものを見るのが好きでgoogle analyticsのリアルタイム情報をよく見てい

記事を読む

no image

Raspberry Pi/ラズベリーパイ を注文しました

Linuxの学習用途にお勧めされているRaspberry Piを注文しました。 ラズベリーパイ

記事を読む

no image

SPFの送受信設定

今回はSPFの設定を行います。 SPFとは何かということについてはここでは割愛しますが、メールの送

記事を読む

Message

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

PAGE TOP ↑