サーバ設定

PostfixにDKIMの設定をする

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.privatehoge.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

全てのhogeexample.comは鍵生成時に指定したもので、ファイルは実際にこのパスにあるはずです。

/etc/opendkim/SigningTable に次のようなものを書きます。

*@example.com hoge._domainkey.example.com

foo@example.comhoge._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あたりにメールを送ってみて、「署名元」や「送信元」に設定したドメインの情報が書かれるのを確認するのがたぶん一番楽な確認方法だと思います。