DKIMとsendmailを組み合わせる

dkim-filterをインストールしたので、早速使ってみる。

鍵ペアを作る

dkim-genkeyというスクリプトを動かします。スクリプト中ではopensslを叩いているので、opensslへのパスが切れていないといけません。スクリプトを実行するとdefault.privateとdefault.txtの2つのファイルが作成されます。

$ export PATH=$PATH:/usr/local/bin/ssl
$ /usr/bin/dkim-genkey
$ ls default*
default.private  default.txt

DNSサーバにTXTレコードを追加

上記手順で作成されたdefault.txtはこんな内容。

default._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNAD
CBiQKBgQDJRZCA2Wn2JfHVgE3zC74cdpX5bjB1h6BUK2d7j5MTK091GqOON4xdERFirXDim5FzJzyYXL
8J/Oe4iF35YypQV1k7cx5wCITw1IfakweuBY+F95AZ36waYKtrvRl2OzhxZqV6kpQ7bQznQO97cOcLAc
W64rVKRUHj4nOlqJ6K5QIDAQAB" ; ----- DKIM default for example.com

BINDの場合だと、この内容をセレクタ名._domainkeyのTXTレコードとしてDNSのゾーンファイルに追加します。

;
;Domain Keys
;
hoge._domainkey    IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJRZCA2Wn2JfHVgE3zC74cdpX5bjB1h6BUK2d7j5MTK091GqOON4xdERFirXDim5FzJzyYXL
8J/Oe4iF35YypQV1k7cx5wCITw1IfakweuBY+F95AZ36waYKtrvRl2OzhxZqV6kpQ7bQznQO97cOcLAcW64rVKRUHj4nOlqJ6K5QIDAQAB" ;

もう一行、管理するドメインのポリシーを._domainkeyのTXTレコードとして追加。

_domainkey              IN      TXT "t=y;o=~;r=postmaster@hoge.com;"

ポリシーに指定する修飾詞は以下の通り。

修飾詞 意味
t yを指定するとテストモードでの運用を意味する。たぶん動作には関係ない。
o どのメールにサインするか。~だと一部のメール。-だと全部のメール。
r なにかあったときの連絡先。
n メモ。n="http://www.hoge.com"とか。動作には関係ないと思う。

ゾーンファイルのシリアル番号をインクリメントしてnamedを再起動。

秘密鍵を適当なところへ保存

適当なところっていうのはパーミションがちゃんとしているところって言う意味。

# mkdir -p /var/db/dkim
# chmod 700 /var/db/dkim
# mv ~hoge/default.private /var/db/dkim/selector.key.pem
# chmod 600 /var/db/dkim/selector.key.pem

上記のselectorっていうのは、なにか特定の文字列。あとでまた使う。

sendmail.cfを作成

sendmailのソースディレクトリ以下のcf/cf/sendmail.mcにdkim-filterの情報を追加してsendmail.cfを作成。

INPUT_MAIL_FILTER(`dkim-filter', `S=inet:8891@localhost')dnl
(保存して)
$ make sendmail.cf
# cp ./sendmail.cf /etc/mail

dkim-filterを起動

INSTALLドキュメントが不親切だぞ。結構悩んだところ。結局こんな風に起動。rootで動作させるのはあまりよくないかも。

# /usr/lib/dkim-filter -A -l -i /etc/mail/inner.txt -p inet:8891@localhost \
 -d hoge.com -D -k /var/db/dkim/selector.key.pem -s selector

実際は一行です。それぞれのオプションの意味は以下のとおり。

オプション 意味
-A 子プロセスを生成して、そいつが死んだらすぐまたforkする。
-l syslogへログを出力する。
-i 内部ホストのリストを指定する。このサーバを経由してメールを送信するホストの一覧。
-p MTAとのソケットを指定。上記sendmail.cfで設定した値と同じものを書く。
-d 担当するドメイン。複数指定するときはコンマで列記する。
-D -dで指定したドメインサブドメインアドレス全てをサインする対象にする。
-k 秘密鍵へのパス
-s セレクタ

私が管理しているメール環境ではいまdkim-filterをインストールしたマシンがスマートサーバとして動作しています。実際には他の複数のメールサーバからこいつを経由して外部へ発信してます。このような構成の場合、-iで内部ホストのリストを指定しないとメールにサインしてくれません。-iオプションでリストを指定しないで運用しているとこんなログがsyslogに吐かれます。

Jun  9 17:45:21 smtp2 dkim-filter[7736]: [ID 681718 mail.notice] m598jLm7008271
external host fuga.hoge.com attempted to send as hoge.com

-iで指定したリストファイルの書式はこんなの。

.hoge.com

他にも可能な書式があるのでそのあたりはdkim-filterのmanを参照してください。実際の運用では設定ファイルを書いて、dkim-filterを起動するのがらくちんなようです。

sendmailを再起動

# /etc/init.d/sendmail restart

とりあえずこんな感じで動作しました。dkim-filterを別のユーザで動作させないとだな。