2024-09-21

Postfix に DKIM の設定を行う方法

はじめに

DMARCでメールの検証を行うには、SPFとDKIM両方を設定しないといけない。 この記事では、DKIMの設定を取り上げる。

DKIMの概要

SPF が配送もとの IP アドレス (つまりヘッダーの `Received: from helo-host.example.org (resolved-host.example.org [192.0.2.27])` の部分) を検証するのに対して、 DKIM では、メールを配送する際に、主要なヘッダー情報 (`Date`, `From`, `Reply-To`, `To`, `Subject` など) に対して署名を付加する。 公開鍵を DNS の TXT レコードに設定することになっており、受信側のメールサーバーで署名を検証する。

SPF と同様に DNS レコードを使ってメールを検証するので、 DNS が改ざんされると第三者がなりすましメールを送ることができてしまう。また、メール本文の改ざんは DKIM では検知できない。

設定手順

このセクションでは、 EL9 (AlmaLinux 9 や Rocky Linux 9) 上の Postfix で DKIM 署名を付加するための設定を説明する。 EL8 でもほぼ同様の方法で設定できる。

OpenDKIM のインストール

前もって CRB と EPEL をインストールしておき、以下のコマンドで OpenDKIM をインストールする。
sudo dnf --enablerepo=epel,crb install opendkim opendkim-tools

キーの作成

cd $(mktemp -d)
opendkim-genkey --directory ./ --domain example.com --selector 20240921 --bit 2048 --append-domain
sudo cp 20240921.private /etc/opendkim/keys/ -i
sudo chown opendkim:opendkim /etc/opendkim/keys/20240921.private

DNSレコードの設定

公開鍵が記載されたファイル 20240921.txt が生成されるので、これを参照してDNSレコードを設定する。 上記の例の場合、 20240921._domainkey.example.com. の TXT レコードを設定する。 TXT以降はカッコでかこまれてダブルクオートがついているが、例えば Cloudflare の DNS 場合は、カッコ・ダブルクオート・改行を取って Content に登録する。

設定ファイルの編集

sudo cp /etc/opendkim.conf /etc/opendkim.conf-20240921
sudoedit /etc/opendkim.conf
以下のように編集して保存する。
@@ -36,7 +36,7 @@
 ##  Selects operating modes. Valid modes are s (sign) and v (verify). Default is v.
 ##  Must be changed to s (sign only) or sv (sign and verify) in order to sign outgoing
 ##  messages.
-Mode	v
+Mode	sv
 
 ##  Log activity to the system log.
 Syslog	yes
@@ -101,12 +101,12 @@
 ##  Gives the location of a file mapping key names to signing keys. In simple terms,
 ##  this tells OpenDKIM where to find your keys. If present, overrides any KeyFile
 ##  directive in the configuration file. Requires SigningTable be enabled.
-# KeyTable	/etc/opendkim/KeyTable
+KeyTable	/etc/opendkim/KeyTable
 
 ##  Defines a table used to select one or more signatures to apply to a message based
 ##  on the address found in the From: header field. In simple terms, this tells
 ##  OpenDKIM how to use your keys. Requires KeyTable be enabled.
-# SigningTable	refile:/etc/opendkim/SigningTable
+SigningTable	refile:/etc/opendkim/SigningTable
 
 ##  Identifies a set of "external" hosts that may send mail through the server as one
 ##  of the signing domains without credentials as such.

sudoedit /etc/opendkim/KeyTable
以下の1行を加える。
20240921._domainkey.example.com example.com:20240921:/etc/opendkim/keys/20240921.private

sudoedit /etc/opendkim/SigningTable 
以下の1行を加える。
*@example.com 20240921._domainkey.example.com

OpenDKIMを起動する

sudo systemctl enable --now opendkim.service
sudo systemctl status opendkim.service

Postfixの設定

cd /etc/postfix/
sudo cp main.cf main.cf-20240921
sudoedit main.cf
以下の3行を追加する。
smtpd_milters = local:/run/opendkim/opendkim.sock
non_smtpd_milters = local:/run/opendkim/opendkim.sock
milter_default_action = accept
もしローカルからしか配送しないなら、 smtpd_milters は設定しなくてよさそう。

Postfixを再起動する

グループも設定したので、再起動する。
sudo systemctl restart postfix
sudo systemctl status postfix

動作確認

TXTレコードが設定されているかどうか確認する。
dig txt 20240921._domainkey.example.com
他のメールサーバーへ送信してみる。 Gmailなどへ送付すれば、「メッセージのソースを表示」からDKIMの検証状況を確認できる。
date -R | mutt -s 'DKIM key should be added' user@example.org
もし問題があれば、 /etc/postfix/main.cf をもとに戻して確認しよう。

小言

SSLのように外部の機関に認証してもらう必要がなく、コストがかからないのがありがたい。

参考