はじめに
前回の記事「送信メールが迷惑メール扱いされないための設定 ~SPF認証編~」では自ドメインからの送信メールが宛先SMTPサーバーによるSPF認証にpassするように対策しました。
今回は送信メールが宛先SMTPサーバーのDKIM認証にpassするように設定したいと思います。
DKIM認証というのは、以下のようなものです。
「送信ドメインのDNSに公開鍵を登録し、送信元SMTPサーバーは自身の秘密鍵で暗号化した電子署名を付加してメールを送信する。受信側SMTPサーバーは受信したメールヘッダから特定した送信元ドメインのDNSサーバから公開鍵を取得し、電子署名を検証する。」
前回の記事で触れたとおり、PostfixでOCNメールサーバーへのリレーを設定した場合はEnvelope-fromに基づくSPF認証については気にせずともpassすることから、大抵の場合は送信メールは宛先まで届きます。
とはいえ、メール送信先メールサーバーが将来的にDKIM認証/DMARC結果に対する処理ポリシーを変更してしまうかどうかについては分かりません。
送信先メールサーバーのポリシー変更に怯えることなく安心してメール送信できるように今のうちから対策をしておきたいと思います。
今回はまずDKIM認証への対策を行います。
前提とする環境は以下の通りです。
- CentOS7.8
- Postfix 2.10.1(一般的な Postfix の設定については完了している)
追記(2022年 3月): AlmaLinux8 に移行後も今回の設定で問題なく動作しています。
OpenDKIMのインストール
今回はOpenDKIMをインストールし、「s mode」(署名モード) のみを使います。
自サーバーが受信したメールを検証するための「v mode」(検証モード) は使用しません。
まだEPELリポジトリを追加していない場合は先に追加してから、OpenDKIMをインストールします。
# dnf install epel-release # dnf install opendkim
秘密鍵/公開鍵の作成
キーペアを保存するディレクトリを作成し、その中にキーペアを作成します。
# mkdir /etc/opendkim/keys/example.com # opendkim-genkey -D /etc/opendkim/keys/lsmodena.com -d lsmodena.com -s 20200516 # ls /etc/opendkim/keys/example.com 20200505.private 20200516.txt # chown -R opendkim:opendkim /etc/opendkim/keys/example.com/
“-s” で指定するセレクタ名は任意の名前ですが、ファイル作成日を利用することが多いようです。
「/etc/opendkim/keys/example.com」ディレクトリ内に秘密鍵20200516.privateと公開鍵20200516.txtが作成されました。
それらのアクセス権も変更しておきます。
DNSサーバーへの登録
公開鍵の登録
先ほど作成した公開鍵20200516.txt の中身を覗いてみると、DNSサーバーに登録すべき内容がそのまま記載されています。この内容にしたがって「お名前.com」のDNSレコード登録画面からTXTレコードを設定します。
ホスト名 :20200516._domainkey (.example.com)
TYPE :TXT
VALUE :v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3D ・・・
DKIM Record Checker のサイトでドメイン名とセレクタ名を入力すれば、ちゃんと登録できているか確認することができます。
ADSPレコードの登録
続いて ADSPレコードを登録します。これはDKIM認証にfailした場合の取り扱いを送信者側として宣言しておくためのTXTレコードです。やはり「お名前.com」のDNSレコード登録画面から設定します。
ホスト名 :_adsp._domainkey (.example.com)
TYPE :TXT
VALUE :dkim=unknown
「dkim=」の部分は「all」「unknown」「discardable」のいずれかを指定しますが、「unkown」だと署名に失敗してもメール送信できるようになります。
Opendkimの設定
「/etc/opendkim.conf」の編集
オリジナルのバックアップを取ったら、以下のように編集します。
</etc/opendkim.conf>
Mode s # "s"=送信時に署名 # KeyFile /etc/opendkim/keys/default.private # コメントアウト KeyTable /etc/opendkim/KeyTable # コメントアウト解除 SigningTable refile:/etc/opendkim/SigningTable # コメントアウト解除 ExternalIgnoreList refile:/etc/opendkim/TrustedHosts # コメントアウト解除 InternalHosts refile:/etc/opendkim/TrustedHosts # コメントアウト解除
この中に登場する「/etc/opendkim/KeyTable」「/etc/opendkim/SigningTable」「/etc/opendkim/TrustedHosts」はこの後で編集します。
KeyTableに秘密鍵を登録
「/etc/opendkim/KeyTable」のバックアップを取ってから以下を追記します。
20200516._domainkey.lsmodena.com lsmodena.com:20200516:/etc/opendkim/keys/lsmodena.com/20200516.private
信頼できるホストの指定
「/etc/opendkim/TrustedHosts」を確認します。
# cat /etc/opendkim/TrustedHosts 127.0.0.1
ここで指定したアドレスから送信するメールに対してのみ署名を追加します。
デフォルトでループバックアドレスが指定されているので、変更の必要はなさそうです。
ドメインの指定
「/etc/opendkim/SigningTable」のバックアップを取ってから、以下を追記します。
*@lsmodena.com 20200505._domainkey.lsmodena.com
OpenDKIM の起動
# systemctl start opendkim # systemctl enable opendkim # systemctl is-enabled opendkim enabled
Postfixの設定
「/etc/postfix/main.cf」に以下を追記します。
smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = $smtpd_milters milter_default_action = accept
最後に Postfixをreloadします。
# systemctl reload postfix
動作確認
試しにGmailアカウント宛てにメールを送信してみます。
メールヘッダーを見てみると、mx.google.com から「dkim=pass」の判定であったことが分かります。
コメント