FreeBSD14 + PostfixにOpenARCをインストール

メール送信するときにレピュテーション(評価)が良くなるようにARC対応したときの覚書。
Gemini 2.5 Proと対話。

環境: FreeBSD 14.3-RELEASE-p2


ARC (Authenticated Received Chain)とは?

ARCは、メール転送によって破壊されるSPFとDKIMの認証結果を、転送経路上で維持・伝達するための仕組み。
ARCは、SPFとDKIMが正しく設定され機能していることが大前提

  • SPF (Sender Policy Framework) の問題: 転送サーバーを介するとSPF認証が失敗する。
  • DKIM (DomainKeys Identified Mail) の問題: メーリングリストなどでメールの内容をサーバーが改変すると署名検証は失敗する。

メール送信サーバーが最初のARCを付与する重要性

  • ARCの価値は、「認証の連鎖」にあるため、最初に認証されないと連鎖にならない。
  • 経路で改変されても、最初の送信サーバーの署名が残っていることで、その改変の信頼が担保される。
  • 受信サーバーはARCのチェーンを全て遡ってDNS問い合わせと暗号学的検証を行い、チェーン全体の完全性を確認する。
  • 経路途中の転送サーバーが、何も改変せずただ転送するだけであれば、ARC著名をしなくてもARC認証の連鎖は崩れない。
    (ARCは件名、本文、Fromヘッダなどを元に署名するため、次の受信サーバーでARC検証は成功する)


OpenARCをインストール

pkg経由でインストール。
# pkg install openarc

バージョンの確認。
# openarc -V

openarc: OpenARC Filter v1.0.0
        Compiled with OpenSSL 3.0.16 11 Feb 2025
        SMFI_VERSION 0x1000001
        libmilter version 1.0.1
        libopenarc 1.0.0:

何も表示されないのでrc.dを確認する。
# less /usr/local/etc/rc.d/openarc

  • サービス名: openarc (ファイル名) または milteropenarc (rc.conf変数名)
  • 実行ユーザー: デフォルトで mailnull を使用。(openarc ユーザーは使いません)
  • 設定ファイルパス: デフォルトで /usr/local/etc/mail/openarc.conf を参照。
  • PID/Socketディレクトリ: デフォルトで /var/run/milteropenarc を使用。

PIDとソケットを格納するディレクトリを作成。
# mkdir -p /var/run/milteropenarc
# chown mailnull:mailnull /var/run/milteropenarc


秘密鍵の生成

FreeBSD(Unix系)は管理規約から機密データは/var/db/に置くことが推奨されている。
前の記事でDKIMは/var/db/dkim/を作った。
参考: FreeBSD 14 + Nginx + PHP + MariaDB + Postfixの環境を構築(2024年版)

置き場所を作る。
# mkdir -p /var/db/openarc

鍵の置き場所の権限変更。
# chown mailnull:mailnull /var/db/openarc
# chmod 750 /var/db/openarc

移動して秘密鍵を生成。
セレクタ名は[サービス]-[ホスト名]-[年月]にする。例)arc-server01-202509
# cd /var/db/openarc
# mkdir -p keys/hoge.jp
# cd keys/hoge.jp
# opendkim-genkey -b 2048 -s arc-server01-202509 -d hoge.jp

公開鍵をDNSのTXTレコードへ登録する。
参考: CentOS Steam 9 + PostfixのOpenARC設定
# cat arc-server01-202509.txt

digコマンドで確認。インストールから。
# pkg install bind-tools
# dig +short TXT arc-server01-202509._domainkey.hoge.jp 8.8.8.8



openarc.conf の作成

結局、TCPソケットを使うようにしたのでSocketは最後の章を参照。

起動ファイルに記載されているパスに設定ファイルを作成。
# vim /usr/local/etc/mail/openarc.conf

#
# OpenARC 設定ファイル (FreeBSD 14 / rc.d/openarc 向け)
#
# プロセスIDを保存するファイルのパス。変更の必要はありません。
PidFile /var/run/milteropenarc/pid

# ログをsyslog経由で出力します。'yes' を推奨します。
Syslog  yes

# ログの出力先を指定します。'mail'が一般的です。
SyslogFacility      mail

# OpenARCプロセスを実行するユーザーとグループ。
# rc.dスクリプトのデフォルトである 'mailnull' を指定。
UserID  mailnull:mailnull

# Postfix (MTA) と通信するためのソケット設定。
# Postfixのmain.cfにある 'smtpd_milters' の設定と一致させる必要があります。
# rc.dが管理するディレクトリ内に配置。
Socket  local:/var/run/milteropenarc/socket

# ARC署名に含めるメールヘッダのリスト。
# このリストはRFCで推奨されているもので、通常は変更不要です。
SignHeaders to,subject,message-id,date,from,mime-version,dkim-signature

# 動作モードを設定します。
#   s  - Signing (署名のみ): 送信メールにARC署名を付与します。
#   sv - Sign and Verify (署名と検証): 送信時の署名に加え、受信メールのARC検証も行います。
# 通常は 'sv' を設定することが推奨されます。
Mode                    sv

# 電子署名を生成する際の正規化方式を「ヘッダ/ボディ」の順で指定します。
# 'relaxed/relaxed' が最も一般的で、互換性の問題が起きにくい推奨設定です。
Canonicalization        relaxed/relaxed

# 署名に使用するドメイン名。
Domain                  hoge.jp

# 署名に使用するセレクタ名。DNSのTXTレコードと対応させます。
# [サービス]-[ホスト名]-[年月] の形式を推奨します。
Selector                arc-server01-202509

# 署名に使用する秘密鍵のフルパス。
# ファイル名はセレクタ名と合わせるのが一般的です (例: selector.private)。
KeyFile                 /var/db/openarc/keys/hoge.jp/arc-server01-202509.private

# 署名の暗号化アルゴリズム。
# コメントアウトされている場合、デフォルトの 'rsa-sha256' が使用されます。
# 通常はこのままで問題ありません。
#SignatureAlgorithm      rsa-sha256

# --- 以下はデバッグ用の設定です ---
# 本番環境では通常コメントアウトまたは無効化します。
MilterDebug 6        # 詳細なデバッグログを有効化
# EnableCoredumps yes  # クラッシュ時にコアダンプを生成

# 信頼するMTAからの接続をリストするファイル。通常は使用しません。
# PeerList /etc/openarc/PeerList

テストして起動。
# openarc -n
# sysrc milteropenarc_enable="YES"
# service openarc start
# service openarc status

プロセス、maillog、ソケットの確認。
# ps aux | grep openarc
# less /var/log/maillog
# sockstat -l | grep openarc

Postfixのmain.cfを編集。
# less /usr/local/etc/postfix/main.cf

#
# OPENDKIM, OpenARC
#
smtpd_milters = unix:/var/run/milteropendkim/socket, unix:/var/run/milteropenarc/socket
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

テストしてPostfixの再起動。
# postfix check
# service postfix restart

別コンソールでログを監視してメール送信する。
# tail -f /var/log/maillog
# mail user@gmail.com

下記エラー

Sep 14 14:56:04 conoha01 postfix/cleanup[4145]: warning: connect to Milter service unix:/var/run/milteropenarc/socket: Permission denied


milterグループを作る

結局、TCPソケットを使うようにしたのでこの章は読み飛ばしてOK。

milterグループを作成。
# pw groupadd milter

milte グループに、postfix ユーザーとmailnull ユーザーの両方を追加。
# pw groupmod milter -m postfix,mailnull

確認。
# getent group milter

OpenARCが使用するグループを milter に変更してパーミッション変更。
# sysrc milteropenarc_gid="milter"
# sysrc milteropenarc_socket_perms="0770"

/usr/local/etc/mail/openarc.conf を編集。
# less /usr/local/etc/mail/openarc.conf

UserID  mailnull:milter

テストして再起動。
# openarc -n
# service openarc restart
# service postfix restart

ソケットの権限確認。
# ls -l /var/run/milteropenarc/

パーミッションが770になってない。

UMaskも試してみたが、このバージョンのOpenARCでは未対応らしい。


TCPソケット方式への切り替え

設定ファイルの変更。
# cd /usr/local/etc/mail/
# less openarc.conf

#Socket  local:/var/run/milteropenarc/socket
Socket  inet:8893@localhost

テストして再起動。
# openarc -n
# service openarc restart

待ち受けポート確認。
# netstat -an -p tcp

Postfixの設定ファイル変更。
# less /usr/local/etc/postfix/main.cf

#
# OPENDKIM, OpenARC
# Milter settings (DKIM first, then ARC via TCP sockets)
smtpd_milters = unix:/var/run/milteropendkim/socket, inet:localhost:8893

確認して再起動。
# postfix check
# service postfix restart

メール送信して確認。
# mail user@gmail.com

メールヘッダーに無事
ARC-Seal: i=1;
ARC-Message-Signature: i=1;
ARC-Authentication-Results: i=1;
が追加され、「arc=pass (i=1);」になっている。


ただCentOS Stream 9と同じように「MilterDebug 6 」にしているけど、maillogにOpenARCの動作ログは何も出力されない。
OpenARCのバージョンが上がれば修正されていると思う。


▼ 関連記事