手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 Postfix OpenDKIM の設定

Ubuntu 26.04 メール関連の記事

Ubuntu 26.04 で Postfix から送信するメールに DKIM 署名を付ける場合、OpenDKIM を milter として Postfix に接続します。DKIM はメール本文と主要ヘッダーに署名し、受信側は DNS に公開された公開鍵を使って検証します。

この記事では OpenDKIM の基本設定を整理します。実環境では構成管理で秘密鍵、KeyTableSigningTable/etc/opendkim.conf、runtime directory を管理していますが、ここでは手動で設定する場合の流れに落とし込みます。

この記事で整理すること
  • DKIM と OpenDKIM の役割を整理する
  • opendkim を導入する
  • DKIM selector と鍵を作成する
  • KeyTable, SigningTable, opendkim.conf を設定する
  • Postfix から OpenDKIM の socket を参照する
  • DNS TXT レコードと署名結果を確認する
対象 OSUbuntu 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. 1
    OpenDKIM を導入する
    OpenDKIM 本体をインストールします。
  2. 2
    selector と鍵を用意する
    秘密鍵をサーバーに置き、公開鍵を DNS TXT レコードとして公開します。
  3. 3
    OpenDKIM を設定する
    KeyTable、SigningTable、InternalHosts、socket を設定します。
  4. 4
    Postfix と接続する
    Postfix 側の milter 設定で OpenDKIM socket を参照します。
  5. 5
    署名を確認する
    DNS とメールヘッダーで DKIM 署名を確認します。
参考
書籍
参考書籍

Postfix 実用ガイド

Postfix の設計、設定、運用を詳しく確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

DKIM と OpenDKIM の役割

DKIM は、送信ドメインがそのメールに署名したことを受信側が検証できるようにする仕組みです。OpenDKIM は Postfix と milter で連携し、送信時にメールへ DKIM-Signature ヘッダーを付与します。

  • 秘密鍵はメールサーバー側で保持する
  • 公開鍵は DNS TXT レコードとして公開する
  • selector によって鍵を切り替えられる
  • Postfix は milter socket 経由で OpenDKIM に署名処理を渡す
DKIM は単体で迷惑メール対策を完結させるものではありません。SPF、DMARC、逆引き、SMTP の基本設計と組み合わせて評価されます。

OpenDKIM をインストールする

まず OpenDKIM をインストールします。

コマンド
sudo apt update
sudo apt install -y opendkim opendkim-tools

runtime 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.conf

DKIM 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.private
mail-20260613.private は秘密鍵です。バックアップ、権限、配布範囲を厳しく管理します。DNS に登録するのは mail-20260613.txt 側に出力される公開鍵です。

DNS TXT レコードを確認する

opendkim-genkey が出力した TXT レコードを DNS に登録します。PowerDNS などで管理している場合は、ゾーン管理側に登録します。

コマンド
cat /etc/dkimkeys/example.com/mail-20260613.txt
出力
mail-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/SigningTable

opendkim.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
EOF
InternalHosts は署名対象として信頼する送信元です。広げすぎると意図しない送信元にも署名するため、Postfix 構成と合わせて最小限にします。

Postfix から OpenDKIM を参照する

Postfix 側では smtpd_miltersnon_smtpd_milters に OpenDKIM の socket を指定します。OpenDMARC も使う場合は、同じ行に並べて指定します。

設定ファイル例
smtpd_milters = unix:/run/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
milter_protocol = 6

Postfix が OpenDKIM の socket を参照できるように、必要に応じて postfix ユーザーを opendkim グループへ追加します。

コマンド
sudo usermod -aG opendkim postfix
グループ追加後、既存プロセスには即時反映されないことがあります。OpenDKIM と Postfix の再起動・reload を合わせて確認します。

設定を検証して起動する

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.service

DNS と署名を確認する

まず 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 の結果をドメインポリシーとして評価できるようにします。

Ubuntu 26.04 メール関連の記事
Ubuntu 26.04 Postfix OpenDKIM の設定

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る