DKIMについての話はしません。設定の話だけをします。また、「何をしようとしているか」の詳細は説明しませんのでコマンドを実行する意味は自分で考えるか調べてください。
まず、環境は次の通りです。
- CentOS Linux release 7.1.1503 (Core)
- Postfix 2.10.1
- OpenDKIM 2.10.3
CentOS 6でもほぼ同じであることは確認していますが、それ以外のディストロは確認していません。大体同じだとは思います。
ほとんどのCentOSユーザはEPELをすでに設定しているものと確信していますが、もしEPELの設定を行っていなければ次のようにEPELを設定します。
# yum install 'http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm'
OpenDKIMのインストール
OpenDKIMのパッケージがEPELにありますのでいつも通りyum
でインストールします。
# yum install opendkim
鍵ペアの生成
ここでセットアップするのはドメイン example.com
とします。当該箇所を適当に読み替えてください。
# cd /etc/opendkim/keys
# mkdir example.com
# cd example.com
# opendkim-genkey -d example.com -s hoge -b 2048
# chown opendkim:opendkim hoge.*
opendkim-genkey
の引数について:
-D /path/to/directory
で出力ディレクトリが設定できます。これを指定しない場合はカレントディレクトリになります。(上の例では指定していません)-b 2048
は2048ビット長の鍵の生成を指示しています。デフォルトは1024で、1024より短い鍵は検証時に受け入れられない可能性が高く、DNSクエリのパケット長の関係で2048が最長と考えて良いようです。-s hoge
はセレクタといい複数の鍵の運用時に別々のものを指定します。デフォルトはdefault
です。メールヘッダやDNSクエリ、DNSレコード上に現れるため見られては困る名前をつけるのはやめましょう。この名前はDNSクエリに現れるため、DNS名に適合するものにするのが良いでしょう。参考までにGmailは生成日に見える数字の羅列20120113
です。
生成が完了すると(通常一瞬で完了すると思います)、hoge.private
と hoge.txt
が生成されます。(hoge
部分は指定したセレクタ)
DNSへの登録
DNSレコードが引けるようになるまで時間のかかるDNSサーバ(サービス)が多いと思いますので、実際の設定より前にDNSへの登録を行ってしまうのが良いと思います。
生成した /etc/opendkim/keys/example.com/hoge.txt
をエディタで開くか cat
あたりで適当に表示します。
すると、こんなデータがあります。
hoge._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2Y+czSLadxoUpvsh7gwdpubfsCHtSfs2VwrNa0H/+5blZJlg658zSGgY2UsqYHWvHA4JfotIvJ8h4wcP6/L31xZPA0E0Mr3WYXQnOycPAI4rwb//ALMAv6E1/SxYi3vr86uO7SPvplgR+v/dygFZnVWOgDbDFfNjtcfcqnVO9hqzVOBAwxAmwaPnnWv2V7r1gP+7Z9uqM0Phr"
"SGtrkZmMQCqxBJFPY6Hu9kMYzQRIkHtUh3Msb2yN8VLpYaLypjAS8MMujfqt+AbemkGOx50txC8KNdVjL0ND8V9chIZh5zr/ZWH8ipZ9K3RoJYKqu8F6zQhnBf9GoOMUs63wmzfwIDAQAB" ) ; ----- DKIM key default for example.com
DNSサーバがBINDあたりであればこれをそのままhoge._domainkey.example.com
として引けるように、他のものであればそれなりに適当に登録します。
重要なのは "v=DKIM1
から QAB"
の部分で、; ---
はコメント、 (
~)
は複数行を1行とみなすための記述です。
DNS提供サービスの場合大体1行で指定する必要があると思いますので、txt hoge._domainkey v=DKIM1; k=rsa; p=MIIB...AQAB
のように一つにつなげて登録したりします。
反映された頃合いを見計らって $ dig txt hoge._domainkey.example.com
とかやってちゃんと返ってくることを確認してください。$ dig txt 20120113._domainkey.google.com
あたりと見比べるのも良いと思います(Googleのものは v=
がありません)
設定ファイルの編集
/etc/sysconfig/opendkim
に次の記述を追加します。追加しなくても動くはずですが起動時に警告が出たりしてアレです。
AUTOCREATE_DKIM_KEYS=NO
/etc/opendkim.conf
を大体こんな感じに編集します。
# s=sign, v=verify
Mode sv
# KeyFile (コメントアウト)
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
/etc/opendkim/KeyTable
に次のようなものを書きます。
hoge._domainkey.example.com example.com:hoge:/etc/opendkim/keys/example.com/hoge.private
全てのhoge
とexample.com
は鍵生成時に指定したもので、ファイルは実際にこのパスにあるはずです。
/etc/opendkim/SigningTable
に次のようなものを書きます。
*@example.com hoge._domainkey.example.com
foo@example.com
をhoge._domainkey.example.com
の鍵で署名するという意味になります。KeyTableも参照してください。
/etc/opendkim/TrustedHosts
に次のようなものを書きます。必要であれば信頼できるホストの情報を書き足します。CIDR使えます。
127.0.0.1
::1
このIPアドレスにマッチしたもののみ署名処理が行われます。たとえばアプリケーションサーバでメールを生成して、メールサーバを中継して送信するような構成の時、ここにアプリケーションサーバのIPアドレスを書いておけばメールサーバで署名が行えます。
最後にPostfixの/etc/postfix/main.cf
を変更します。
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
Daemon類の再読込
DNS反映より前に実行すると悲しい目に遭うかもしれないのでご注意を。
# systemctl enable opendkim
# systemctl start opendkim
# systemctl restart postfix
適当にGmailあたりにメールを送ってみて、「署名元」や「送信元」に設定したドメインの情報が書かれるのを確認するのがたぶん一番楽な確認方法だと思います。