DKIMメール認証運用

Postfix で OpenDKIM と ARC を自前構築

ドメイン番人8 分で読めます
目次

この記事でわかること

  • OpenDKIM で署名鍵を生成し、Postfix に milter 連携する手順
  • 転送(メーリングリスト等)で認証が壊れる問題と、OpenARC が果たす役割
  • ARC(RFC 8617)のヘッダ構成と、設定ミスが送信不可・認証失敗につながる注意点

「転送されたとたん、なりすまし扱いされる」問題

自社の Postfix から送ったメールが、取引先のメーリングリストを経由したとたん迷惑メール扱いされる——こうした相談は珍しくありません。

原因は、転送サーバーが件名や本文を書き換えたり、送信元 IP を自分のものに変えたりするためです。すると受信側での SPF(送信元 IP の正当性チェック)と DKIM(署名による改ざんチェック)が崩れ、DMARC の判定で「なりすまし」と見なされてしまいます。

この「転送で認証が壊れる」問題を緩和する仕組みが ARC(Authenticated Received Chain、認証結果の引き継ぎ連鎖)です。本記事では、Postfix に OpenDKIM で DKIM 署名を付け、OpenARC で ARC に対応するまでを、設定の順序と落とし穴に絞って解説します。

DMARC そのものの自前構築は Postfix で DMARC を自前構築する手順 を、ARC の概念は ARC とは|転送メールの認証を救う仕組み を併読すると理解が早まります。

全体像:milter で署名とシールを束ねる

Postfix は milter(Mail Filter、メール処理を外部プログラムに委譲する仕組み)で OpenDKIM・OpenARC と連携します。送信時の流れはこうなります。

  • メール送信 → Postfix → OpenDKIM が DKIM 署名を付与 → OpenARC が(転送時に)ARC シールを付与 → 外部へ送出

Postfix と OpenDKIM・OpenARC の milter 連携の流れ

ポイントは、milter は smtpd_milters に書いた順番で呼び出されることです。OpenDKIM を先、OpenARC を後に置きます。OpenARC は他の milter が付けた認証結果も参照するため、署名・検証系の milter の後段に置くのが基本です。順序を誤ると署名対象が変わり、署名そのものが無効になります。

構築手順:OpenDKIM から OpenARC まで

ステップ 1: OpenDKIM で鍵を生成する

OpenDKIM はメール送信時に DKIM 署名を付与する milter です。まず署名鍵を生成します。opendkim-genkey コマンドを使います。

opendkim-genkey -b 2048 -d example.com -s mail2026 -D /etc/opendkim/keys/example.com
  • -b 2048: 鍵長(2048 ビットを推奨)
  • -d example.com: 署名対象ドメイン
  • -s mail2026: セレクタ(同じドメインで複数の鍵を区別する名前)
  • -D: 出力先ディレクトリ

セレクタは鍵を識別する任意の名前です。命名や使い分けの考え方は DKIM セレクタとは|役割と命名の考え方 を参照してください。

生成されると、秘密鍵(mail2026.private)と DNS 公開用の TXT レコード(mail2026.txt)ができます。公開鍵は mail2026._domainkey.example.com の TXT レコードとして DNS に登録します。

複数ドメイン・複数セレクタを扱う場合は、KeyTable(鍵の一覧)と SigningTable(どのドメインにどの鍵を使うかの対応表)で署名指示を定義します。1 ドメイン 1 鍵で足りる場合は、opendkim.confDomain / Selector / KeyFile を直接指定する形でも構いません。

ステップ 2: Postfix に OpenDKIM を milter 連携する

OpenDKIM の待受ソケットを決め、Postfix から呼び出します。opendkim.conf で待受ソケットを指定し、Postfix の main.cf に次を追記します。

# main.cf
smtpd_milters = local:/run/opendkim/opendkim.sock
non_smtpd_milters = local:/run/opendkim/opendkim.sock
milter_default_action = accept
milter_protocol = 6
  • smtpd_milters: SMTP で受け取るメール(外部からの受信や、認証済みクライアントからの送信)に適用する milter
  • non_smtpd_milters: sendmail コマンドなど SMTP を経由しない経路のメールに適用する milter
  • milter_default_action = accept: milter が応答しないときの動作。accept にしておくと、OpenDKIM が落ちてもメール自体は止まりません

TCP ソケット(inet:localhost:8891 など)を使う構成もあります。具体的なソケット名や権限は配布パッケージで異なるため、各ディストリビューションの設定ファイルに合わせてください。

ここで一度、自分宛てや確認用アドレスにテスト送信し、ヘッダに DKIM-SignatureAuthentication-Results: ... dkim=pass が付くことを確認します。検証コマンドは DKIM をコマンドで確認する方法 が参考になります。

ステップ 3: OpenARC で転送時の認証結果を保持する

ここからが本題の ARC です。ARC は RFC 8617 で定義された仕組みで、転送のように途中のサーバーがメールを処理して SPF/DKIM が無効になっても、改変前の認証結果を引き継いで残すことを目的とします。

重要なのは、ARC は認証を自動的に「通す」ものではない点です。ARC は元の認証結果を封印して受信側に伝えるだけで、最終的にそれを信頼して受け入れるかどうかは受信側の判断です。

転送で認証が壊れる問題と ARC の役割

そのため、ARC シールを付ける主役は転送する側のサーバー(メーリングリストや中継サーバー)です。単純に外部へ送るだけの送信専用サーバーが、自分の出すメールに ARC を付ける必要は基本的にありません。自社が転送・中継の役割を担う場合に OpenARC を入れる、と整理してください。

OpenARC も milter として動きます。RFC 8617 では、転送ごとに次の 3 つのヘッダからなる「ARC セット」が 1 つ追加されます。

ARC ヘッダセットの構成(AAR・AMS・AS)

  • ARC-Authentication-Results(AAR): その時点の SPF/DKIM/DMARC 認証結果を記録する
  • ARC-Message-Signature(AMS): そのホップでのメッセージ内容に対する署名
  • ARC-Seal(AS): AAR・AMS と直前までの連鎖全体を封印する署名

各セットは i=(セット番号。1 から始まり転送ごとに増える)で順序を示し、ARC-Sealcv=(chain validation、連鎖の検証結果)で連鎖の状態を none / pass / fail のいずれかで表します。

OpenARC の設定(openarc.conf)では、主に次を指定します。

  • Mode: 動作モード。s を含めるとシール付与、v を含めると既存 ARC 連鎖の検証、sv で両方を行う
  • Domain / Selector / KeyFile: シール用の署名に使うドメイン・セレクタ・秘密鍵
  • Socket: milter の待受ソケット

シール用の鍵は OpenDKIM と同様に生成できますが、各ディレクティブの正確な書式やデフォルト値はバージョンで差があるため、openarc.conf の公式ドキュメント(man ページ)を必ず確認してください。

Postfix への連携は OpenDKIM と同じく smtpd_milters に追記します。OpenDKIM の後ろに OpenARC のソケットを並べます。

# main.cf(OpenDKIM が先、OpenARC が後)
smtpd_milters = local:/run/opendkim/opendkim.sock, local:/run/openarc/openarc.sock
non_smtpd_milters = $smtpd_milters

設定ミスは「送信不可・認証失敗」に直結する

このあたりの設定は、ミスがそのままメールの実害になります。よくある失敗を挙げます。

  • milter の順序ミス: OpenARC を OpenDKIM より前に置くと、署名前の状態を見てしまい連鎖が成立しません。順序は厳守します。
  • milter_default_action の設定漏れ: 既定が tempfail のままだと、milter が一時的に応答しないだけでメールが滞留・遅延します。可用性要件に応じて accept か否かを意図的に決めます。
  • DNS への公開鍵登録漏れ・反映待ち: 鍵を生成しても TXT レコードを登録し、反映されるまでは検証側で dkim=fail になります。
  • 権限・ソケットの不一致: ソケットのパスや権限が Postfix から見えないと、milter に接続できず送信全体が止まることがあります。

これらは一度に有効化せず、OpenDKIM → 動作確認 → OpenARC → 動作確認と段階的に進めるのが安全です。本番ドメインでいきなり全部を切り替えるのは避けてください。

よくある質問

ARC を入れれば転送メールは必ず届くようになりますか

いいえ。ARC は元の認証結果を引き継いで受信側に伝える仕組みであり、受信側がそのシールを信頼して受け入れるかは受信側の判断です。ARC が「認証を自動で通す」ものではない点に注意してください。

送信専用サーバーにも OpenARC は必要ですか

基本的には不要です。ARC シールを付けるのは転送・中継を行うサーバーの役割です。自社が単に外部へ送るだけなら、まず OpenDKIM による DKIM 署名と DMARC 対応を優先します。

OpenDKIM と OpenARC の milter はどちらを先に書きますか

OpenDKIM を先、OpenARC を後にします。OpenARC は他の milter が付けた認証結果を参照するため、署名系 milter の後段に置きます。

まとめ

  • OpenDKIM は opendkim-genkey で鍵を生成し、smtpd_milters / non_smtpd_milters で Postfix に連携する
  • OpenARC は転送時に認証結果を引き継ぐための仕組みで、シールを付ける主役は転送・中継サーバー
  • ARC(RFC 8617)は AAR・AMS・AS の 3 ヘッダで構成され、cv= で連鎖の状態を示す
  • 設定ミスは送信不可・認証失敗に直結するため、段階的に有効化し、その都度ヘッダを確認する

まずは現状を把握しましょう

自前構築に進む前に、自社ドメインの SPF・DKIM・DMARC の現状を 無料診断 で確認できます。設定状況がわからない方も、結果をもとにどこから着手すべきか専門家がわかりやすくサポートします。

次の一歩は無料診断から。