Ubuntu 26.04 で Postfix から送信するメールに DKIM 署名を付ける場合、OpenDKIM を milter として Postfix に接続します。DKIM はメール本文と主要ヘッダーに署名し、受信側は DNS に公開された公開鍵を使って検証します。
この記事では OpenDKIM の基本設定を整理します。実環境では構成管理で秘密鍵、KeyTable、SigningTable、/etc/opendkim.conf、runtime directory を管理していますが、ここでは手動で設定する場合の流れに落とし込みます。
- DKIM と OpenDKIM の役割を整理する
opendkimを導入する- DKIM selector と鍵を作成する
KeyTable,SigningTable,opendkim.confを設定する- Postfix から OpenDKIM の socket を参照する
- DNS TXT レコードと署名結果を確認する
| 対象 OS | Ubuntu 26.04 |
|---|---|
| 対象サービス | opendkim.service |
| 主要設定 | /etc/opendkim.conf |
| 鍵ディレクトリ | /etc/dkimkeys/example.com |
| KeyTable | /etc/dkimkeys/KeyTable |
| SigningTable | /etc/dkimkeys/SigningTable |
| Postfix 連携 | smtpd_milters, non_smtpd_milters |
-
1
OpenDKIM を導入するOpenDKIM 本体をインストールします。
-
2
selector と鍵を用意する秘密鍵をサーバーに置き、公開鍵を DNS TXT レコードとして公開します。
-
3
OpenDKIM を設定するKeyTable、SigningTable、InternalHosts、socket を設定します。
-
4
Postfix と接続するPostfix 側の milter 設定で OpenDKIM socket を参照します。
-
5
署名を確認するDNS とメールヘッダーで DKIM 署名を確認します。
書籍
Postfix 実用ガイド
Postfix の設計、設定、運用を詳しく確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
DKIM と OpenDKIM の役割
DKIM は、送信ドメインがそのメールに署名したことを受信側が検証できるようにする仕組みです。OpenDKIM は Postfix と milter で連携し、送信時にメールへ DKIM-Signature ヘッダーを付与します。
- 秘密鍵はメールサーバー側で保持する
- 公開鍵は DNS TXT レコードとして公開する
- selector によって鍵を切り替えられる
- Postfix は milter socket 経由で OpenDKIM に署名処理を渡す
OpenDKIM をインストールする
まず OpenDKIM をインストールします。
sudo apt update
sudo apt install -y opendkim opendkim-toolsruntime directory を用意する
OpenDKIM の socket や pid を配置する runtime directory を用意します。systemd-tmpfiles で再起動後にも作成されるようにしておくと安定します。
sudo tee /etc/tmpfiles.d/opendkim.conf >/dev/null <<'EOF'
d /run/opendkim 0755 opendkim opendkim -
EOF
sudo systemd-tmpfiles --create /etc/tmpfiles.d/opendkim.confDKIM selector と鍵を作成する
DKIM では selector を使って鍵を識別します。ここでは mail-20260613 を例にします。実運用では日付や用途が分かる selector にしておくと、鍵ローテーションしやすくなります。
sudo install -d -o opendkim -g opendkim -m 0700 /etc/dkimkeys/example.com
cd /etc/dkimkeys/example.com
sudo opendkim-genkey -b 2048 -d example.com -s mail-20260613
sudo chown opendkim:opendkim mail-20260613.private mail-20260613.txt
sudo chmod 0600 mail-20260613.privatemail-20260613.private は秘密鍵です。バックアップ、権限、配布範囲を厳しく管理します。DNS に登録するのは mail-20260613.txt 側に出力される公開鍵です。DNS TXT レコードを確認する
opendkim-genkey が出力した TXT レコードを DNS に登録します。PowerDNS などで管理している場合は、ゾーン管理側に登録します。
cat /etc/dkimkeys/example.com/mail-20260613.txtmail-20260613._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=PUBLIC_KEY_EXAMPLE" )PowerDNS で登録する例
PowerDNS を使っている場合は、次のように TXT レコードを登録できます。公開鍵の実値は mail-20260613.txt の内容に置き換えます。
sudo pdnsutil add-record example.com mail-20260613._domainkey TXT 3600 'v=DKIM1; h=sha256; k=rsa; p=PUBLIC_KEY_EXAMPLE'KeyTable と SigningTable を作成する
KeyTable は selector と秘密鍵の対応を定義します。SigningTable は、どの送信者にどの selector を使うかを定義します。
sudo tee /etc/dkimkeys/KeyTable >/dev/null <<'EOF'
mail-20260613._domainkey.example.com example.com:mail-20260613:/etc/dkimkeys/example.com/mail-20260613.private
EOF
sudo tee /etc/dkimkeys/SigningTable >/dev/null <<'EOF'
*@example.com mail-20260613._domainkey.example.com
EOF
sudo chown opendkim:opendkim /etc/dkimkeys/KeyTable /etc/dkimkeys/SigningTable
sudo chmod 0600 /etc/dkimkeys/KeyTable /etc/dkimkeys/SigningTableopendkim.conf を作成する
/etc/opendkim.conf で署名モード、canonicalization、socket、内部ホスト、DNS resolver、KeyTable、SigningTable を指定します。
sudo tee /etc/opendkim.conf >/dev/null <<'EOF'
Syslog yes
SyslogSuccess yes
LogWhy yes
Mode sv
Canonicalization relaxed/simple
SubDomains no
OversignHeaders From
UserID opendkim
UMask 007
Socket local:/run/opendkim/opendkim.sock
PidFile /run/opendkim/opendkim.pid
InternalHosts 127.0.0.1,::1,10.0.10.10,fd00::10
Nameservers 127.0.0.1,::1
TrustAnchorFile /usr/share/dns/root.key
KeyTable refile:/etc/dkimkeys/KeyTable
SigningTable refile:/etc/dkimkeys/SigningTable
EOFInternalHosts は署名対象として信頼する送信元です。広げすぎると意図しない送信元にも署名するため、Postfix 構成と合わせて最小限にします。Postfix から OpenDKIM を参照する
Postfix 側では smtpd_milters と non_smtpd_milters に OpenDKIM の socket を指定します。OpenDMARC も使う場合は、同じ行に並べて指定します。
smtpd_milters = unix:/run/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
milter_protocol = 6Postfix が OpenDKIM の socket を参照できるように、必要に応じて postfix ユーザーを opendkim グループへ追加します。
sudo usermod -aG opendkim postfix設定を検証して起動する
OpenDKIM の設定は opendkim -n -x で検証できます。問題がなければサービスを有効化します。
sudo opendkim -n -x /etc/opendkim.conf
sudo systemctl enable --now opendkim.service
sudo systemctl restart opendkim.service
sudo systemctl reload postfix.serviceDNS と署名を確認する
まず DNS TXT レコードが引けることを確認します。
dig TXT mail-20260613._domainkey.example.com +short実際にメールを送信したら、受信側のメールヘッダーに DKIM-Signature が付いていること、認証結果が dkim=pass になることを確認します。
journalctl -u opendkim.service --no-pager -n 100
journalctl -u postfix.service --no-pager -n 100よくある確認ポイント
- DNS TXT レコードの selector と
SigningTableの selector が一致しているか - 秘密鍵ファイルを
opendkimユーザーが読めるか - Postfix が OpenDKIM の socket に接続できるか
InternalHostsに署名対象の送信元が含まれているか- 公開鍵 TXT レコードの改行やクォートが DNS 側で壊れていないか
- DKIM 署名後に本文やヘッダーを変更する中継が入っていないか
まとめ
Ubuntu 26.04 で OpenDKIM を使う場合、Postfix の milter として OpenDKIM を接続し、秘密鍵をサーバー側に配置し、公開鍵を DNS TXT レコードとして公開します。重要なのは、selector、秘密鍵、KeyTable、SigningTable、DNS TXT、Postfix の milter 設定をすべて同じ対応関係に揃えることです。
DKIM 署名が安定したら、次に OpenDMARC を組み合わせて、SPF / DKIM の結果をドメインポリシーとして評価できるようにします。


