PostfixとOpenDKIMでDKIM署名を設定する方法

メールサーバから送信するメールには、DKIM署名を設定しておくことをおすすめします。

DKIMを設定すると、送信メールが正しいドメインから送信され、途中で改ざんされていないことを受信側に確認してもらえるようになります。

本記事では、PostfixとOpenDKIMを連携して、送信メールにDKIM署名を付ける手順を説明します。

なお、この記事では dnf コマンドを使用しています。
そのため、AlmaLinux、Rocky Linux、CentOS Stream、RHEL系の環境を想定しています。

OpenDKIMをインストールする

まず、OpenDKIMをインストールします。OpenDKIM本体に加え、鍵生成や動作確認に使用する各種ツールを利用するため、opendkim-toolsもインストールします。

dnf install epel-release
dnf install opendkim
dnf install opendkim-tools

DKIM用の鍵を作成する

DKIM署名に使用する秘密鍵と、DNSに登録する公開鍵を作成します。

opendkim-genkey -D /etc/opendkim/keys/ -d example.com

example.com は自分のドメインに変更してください。
上記を実行すると、以下のファイルが作成されます。

/etc/opendkim/keys/default.private
/etc/opendkim/keys/default.txt

それぞれの意味は以下です。

default.private
DKIM署名に使用する秘密鍵です。
サーバ内で使用するため、外部に公開してはいけません。

default.txt
DNSに登録する公開鍵です。
この内容をドメインのDNSレコードに登録します。

OpenDKIMの設定ファイルを編集する

設定ファイルをバックアップします。

cp -arp /etc/opendkim.conf /etc/opendkim.conf.org

設定ファイルを編集します。

vi /etc/opendkim.conf

以下の内容を設定します。

Mode    sv
KeyTable  /etc/opendkim/KeyTable
SigningTable  refile:/etc/opendkim/SigningTable
Socket inet:8891@localhost
#Socket local:/run/opendkim/opendkim.sock

主な意味は以下です。

Mode sv
s は署名、v は検証を表します。
s を指定すると、送信メールにDKIM署名を付与します。
v を指定すると、受信メールのDKIM署名を検証します。
sv と指定すると、署名と検証の両方を行います。


KeyTable
どのドメインで、どの秘密鍵を使用するかを指定します。
複数のドメインを扱う場合は、ドメインごとに使用するDKIMキーをここで定義します。
OpenDKIMには KeyFile という設定もあります。
KeyFile は以下のように秘密鍵ファイルを直接指定する方法です。
KeyFile /etc/opendkim/keys/default.private
単一ドメインで運用する場合は KeyFile でも問題ありません。
しかし、複数ドメインを運用する場合は管理が難しくなるため、一般的には KeyTable と SigningTable を組み合わせて使用します。
そのため、本記事では拡張性の高い KeyTable を利用した設定方法を紹介しています。


SigningTable
どのメールアドレスに対して、どのDKIMキー設定を使うかを指定します。


Socket inet:8891@localhost
PostfixからOpenDKIMへ接続するための設定です。
この例ではTCPの8891番ポートを使用します。

SigningTableを設定する

vi /etc/opendkim/SigningTable

以下のように記載します。

*@example.com default._domainkey.example.com
*@example.net default._domainkey.example.net

これは、以下の意味です。

*@example.com
example.com の全メールアドレスを対象にします。

default._domainkey.example.com
example.com 用のDKIMキー設定を使用します。

KeyTableを設定する

vi /etc/opendkim/KeyTable

以下のように記載します。

default._domainkey.example.com example.com:default:/etc/opendkim/keys/default/default.private
default._domainkey.example.net example.net:default:/etc/opendkim/keys/default/default.private

意味は以下の通りです。

default._domainkey.example.com
SigningTableから参照される名前です。
DNSレコード名と同じ形にしておくと分かりやすいです。

example.com
DKIM署名する対象ドメインです。

default
selector名です。

/etc/opendkim/keys/default/default.private
DKIM署名に使用する秘密鍵ファイルです。

この例では、example.comexample.net で同じ秘密鍵を使用しています。

同じ秘密鍵を使用する場合は、両方のドメインのDNSに、同じ公開鍵を登録する必要があります。

公開鍵をDNSに登録する

公開鍵の内容を確認します。

cat /etc/opendkim/keys/default.txt

以下のような内容が表示されます。

default._domainkey IN TXT ( "v=DKIM1; k=rsa; "
          "p=公開鍵の文字列" )  ; ----- DKIM key default for example.com

DNSには、TXTレコードとして登録します。

example.com の場合は以下です。

ホスト名:
default._domainkey

種類:
TXT

値:
v=DKIM1; k=rsa; p=公開鍵の文字列

example.net でも同じ秘密鍵を使う場合は、example.net 側にも同じ公開鍵を登録します。

ホスト名:
default._domainkey

種類:
TXT

値:
v=DKIM1; k=rsa; p=公開鍵の文字列

DNS上では、それぞれ以下のレコードになります。

default._domainkey.example.com
default._domainkey.example.net

注意点として、default.txt に表示される括弧やダブルクォーテーションは、DNS管理画面では不要な場合があります。

多くの場合、登録する値は以下の1行です。

v=DKIM1; k=rsa; p=公開鍵の文字列

権限を設定する

OpenDKIMが秘密鍵を読めるように、所有者を変更します。

chown -R opendkim:opendkim /etc/opendkim/

秘密鍵の権限も設定します。

chmod 600 /etc/opendkim/keys/default.private

OpenDKIMを起動する

OpenDKIMを自動起動に設定し、起動します。

systemctl enable opendkim
systemctl start opendkim
systemctl status opendkim

PostfixとOpenDKIMを連携する

Postfixの設定ファイルを編集します。

vi /etc/postfix/main.cf

以下を追加します。

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

意味は以下の通りです

smtpd_milters
SMTP経由で処理されるメールをOpenDKIMへ渡す設定です。

non_smtpd_milters
SMTP経由ではないメールにも同じmilter設定を適用するための設定です。
サーバ内のmailコマンドやPHPのmail()関数から送信されるメールにもDKIM署名を付けたい場合に必要です。

milter_default_action = accept
OpenDKIMに接続できない場合でもメールの送信を許可する設定です。
OpenDKIMの一時的な停止や障害でメール送信全体が止まらないようにするために指定します。

UNIX socketを使う場合

この記事ではTCP接続を使用しています。

smtpd_milters = inet:127.0.0.1:8891

そのため、通常は以下のコマンドは不要です。

usermod -a -G opendkim postfix

このコマンドが必要になるのは、以下のようにUNIX socketを使う場合です。

smtpd_milters = unix:/run/opendkim/opendkim.sock

Postfixを再起動する

設定が完了したら、Postfixを再起動します。

systemctl restart postfix

OpenDKIMも再起動しておきます。

systemctl restart opendkim

DKIM署名を確認する

設定後、外部のメールアドレスにテスト送信します。

Gmailなどに送信した場合、メールの詳細からDKIMが成功しているか確認できます。

メールヘッダーに以下のような表示があれば、DKIM署名が成功しています。

dkim=pass

まとめ

PostfixでDKIM署名を行うには、OpenDKIMをインストールし、秘密鍵と公開鍵を作成します。

秘密鍵はサーバ内で使用し、公開鍵はDNSのTXTレコードに登録します。

複数ドメインで同じ秘密鍵を使用する場合は、それぞれのドメインのDNSに同じ公開鍵を登録する必要があります。

DKIMを設定することで、送信メールの信頼性が高まり、迷惑メール判定を受けにくくなります。

コメント