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.0Compiled with OpenSSL 3.0.16 11 Feb 2025SMFI_VERSION 0x1000001libmilter version 1.0.1libopenarc 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/socketnon_smtpd_milters = $smtpd_miltersmilter_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/socketSocket 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のバージョンが上がれば修正されていると思う。