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を起動するのがらくちんなようです。