メールサーバから送信するメールには、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.com と example.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を設定することで、送信メールの信頼性が高まり、迷惑メール判定を受けにくくなります。

コメント