PostfixとOpenDKIMを連携してDKIM署名を設定する
PostfixとOpenDKIMを連携してDKIM署名を設定する完全ガイド(エラー対処含む)メールサーバーを構築する際、送信メールの到達率を高める(迷惑メール判定を回避する)ためには「SPF」「DKIM」「DMARC」の設定が欠かせません。この記事では、PostfixとOpenDKIMを連携させて、送信メールにDKIM署名を付与する手順を解説します。特につまずきやすい 「パーミッションエラー」 や 「PIDファイル作成エラー」 の根本的な解決策も網羅しています。
前提条件・環境この記事では以下の環境・設定値で進めます。ご自身の環境に合わせて適宜読み替えてください。
- OS: Debian
- MTA: Postfix
- ドメイン: example.com
- セレクタ名: mx
パッケージのインストール
まずはOpenDKIM本体と、鍵生成に必要なツールをインストールします。sudo apt update
sudo apt install opendkim opendkim-tools
DKIMキーペア(秘密鍵・公開鍵)の作成
ドメインごとの鍵を格納するディレクトリを作成し、キーペアを生成します。
# ディレクトリの作成
sudo mkdir -p /etc/opendkim/keys/example.com
# 鍵の生成 (-d: ドメイン, -s: セレクタ名)
sudo opendkim-genkey -D /etc/opendkim/keys/[example.com/](https://example.com/) -d example.com -s mx
これで mx.private (秘密鍵) と mx.txt (公開鍵/DNSレコード用) が生成されます。
OpenDKIMのテーブル設定
/etc/opendkim ディレクトリに、署名ルールを定義する3つのファイルを作成します。
TrustedHosts の作成
ローカルや自サーバーからのメール送信を「信頼できる送信元」として許可します。
sudo vi /etc/opendkim/TrustedHosts
cat /etc/opendkim/TrustedHosts
127.0.0.1
localhost
192.0.2.0/24
10.0.0.0/8
*.example.com
信用するpostfixアクセス元を記述してください。
*.exmaple.comのようにドメイン名を用いる場合は逆引き設定が出来ていることを確認してください。
KeyTable の作成
どのセレクタ・ドメインに対して、どの秘密鍵を使うかを定義します。
sudo vi /etc/opendkim/KeyTable
cat /etc/opendkim/KeyTable
mx._domainkey.example.com example.com:mx:/etc/opendkim/keys/example.com/mx.private
SigningTable の作成
送信元のメールアドレス(From)と、使用する鍵(KeyTableの定義)を紐付けます。
echo '*@example.com mx._domainkey.example.com' | sudo tee -a /etc/opendkim/SigningTable
OpenDKIMのメイン設定
/etc/opendkim.conf を編集します。既存の設定がある場合は適宜コメントアウトや修正を行ってください。
sudo vi /etc/opendkim.conf
cat /etc/opendkim.conf
Syslog yes
SyslogSuccess yes
LogWhy yes
Mode sv
# 作成したテーブルファイルを指定
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
# Postfixと通信するためのソケット(ローカルポートを使用)
Socket inet:8891@localhost
【重要】パーミッションの厳格な設定
OpenDKIMはセキュリティチェックが非常に厳しく、権限設定を間違えると key data is not secure というエラーで起動しません。
OpenDKIMは 「起動時はrootで読み込み、その後opendkimユーザーへ権限を落とす」 という動作をするため、ファイル群は root 所有にしておくのが最も安全で確実です。
# 1. 全体をいったん root 所有にする
sudo chown -R root:root /etc/opendkim
# 2. ディレクトリの権限を絞る
sudo chmod 755 /etc/opendkim
sudo chmod 700 /etc/opendkim/keys
sudo chmod 700 /etc/opendkim/keys/example.com
# 3. 秘密鍵を root のみ読み書き可能にする
sudo chmod 600 /etc/opendkim/keys/example.com/mx.private
# 4. テーブルファイルは誰でも読めるが書き込みは root のみにする
sudo chmod 644 /etc/opendkim/KeyTable /etc/opendkim/SigningTable /etc/opendkim/TrustedHosts
【重要】PIDディレクトリの永続化
起動時に can't open PID file /run/opendkim/opendkim.pid というエラーが出る場合があります。
これは /run ディレクトリが一時ファイルシステム(tmpfs)であり、再起動のたびにディレクトリごと消滅してしまうためです。
これを防ぐため、systemd-tmpfiles を使って起動時にディレクトリを自動生成させます。
# 自動生成ルールの作成
echo "d /run/opendkim 0755 opendkim opendkim -" | sudo tee /etc/tmpfiles.d/opendkim.conf
# ルールの即時適用(ディレクトリの作成)
sudo systemd-tmpfiles --create
7. Postfixとの連携設定
Postfixがメールを受け取った際、OpenDKIMのソケットに処理を渡すように設定します。
sudo nano /etc/postfix/main.cf# OpenDKIM Milter設定
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
# OpenDKIMがダウンしていてもメール送信を止めない
milter_default_action = accept
8. DNSへの公開鍵登録
生成した公開鍵の中身を確認し、ドメインのDNSにTXTレコードとして登録します。
cat /etc/opendkim/keys/[example.com/mx.txt](https://example.com/mx.txt)
出力された内容の v=DKIM1; ... から始まる文字列をコピーします。
DNSレコードの登録内容:
-
ホスト名 / エントリ名:
mx._domainkey -
タイプ:
TXT -
値:
v=DKIM1; h=sha256; k=rsa; p=(長い文字列)
(※途中の改行やダブルクォーテーション"は取り除き、1行の文字列にして登録してください)
Route53などお使いの場合は長さ制限に阻まれるケースがありますので、Amazon Route 53で長いTXTレコードを作成する際に気を付けたいことなど参考にしてみてください。
9. サービスの再起動と確認
すべての設定が完了したら、サービスを再起動します。
# OpenDKIMの自動起動有効化と起動
sudo systemctl enable opendkim
sudo systemctl restart opendkim
# Postfixの再起動
sudo systemctl restart postfix
エラーなく起動しているかステータスを確認します。
sudo systemctl status opendkim
動作テスト
Gmail等の外部アドレス宛てにテストメールを送信します。
受信したメールの「メッセージのソース(ヘッダー)」を表示し、以下のようになっていれば設定完了です!
Authentication-Results: mx.google.com;
dkim=pass header.i=@example.com header.s=mx header.b=******;
dkim=pass と表示されていれば、正しくDKIM署名が付与され、認証を通過しています。お疲れ様でした!
参考
GmailのFAQでは受信する側としてDKIMやSPF, DMARCを送信元がどのように設定してほしいかについて詳しいです。