第 18 章 メール転送と防御 Admin: #pMtaFilters

Milter (Sendmail milter プロトコル) と MTA フック (SMTP ステージごとの HTTP)

既存のフィルターを SMTP ダイアログに直接組み込めます: Milter は Sendmail Milter プロトコル バージョン 6 を使用します (Milter プロキシ経由の Rspamd、ClamAV-milter、OpenDKIM、DLP 製品)。MTA フックは、ステージ (CONNECT、EHLO、MAIL FROM、RCPT TO、DATA) ごとに JSON ドキュメントを受け取って判定を返すシンプルな HTTP サービスです。どちらも受信メール (ポート 25) に対して動作し、任意で送信 (465/587) にも適用できます。Milter と MTA フック (#pMtaFilters) で構成し、各エントリにはテスト ボタンがあります。

運用のヒントとアーキテクチャに関する注記

既定のアクションは慎重に選択してください: "accept" (フェイル オープン) はフィルターが停止していてもメールの流れを維持し、"tempfail" (Postfix の milter_default_action = tempfail と同様) はフィルターが復旧するまで送信者に後で再試行させます。ウイルス スキャナーには tempfail のほうが安全で、スコアリング サービスには accept が適しています。検疫では受信メールが迷惑メール フォルダーに入ります。送信 (submission) 時には、メッセージは 550 で拒否されます。

MTA フック応答 (Stalwart 互換)

リクエスト: コンテキスト (stage、client、sasl、tls、server、queue、protocol)、エンベロープ (from、to)、DATA 時にはメッセージ (headers、contents、size)。X-Nextxch-Signature ヘッダーの署名: sha256=本文に対する HMAC。

リファレンス / 構成
POST https://dlp.internal/hook   (X-Nextxch-Hook-Stage: data)

{
  "action": "accept",
  "modifications": [
    { "type": "addHeader", "name": "X-DLP-Status", "value": "clean" },
    { "type": "changeHeader", "index": 1, "name": "Subject", "value": "[external] Offer" },
    { "type": "deleteHeader", "index": 1, "name": "X-Internal-Route" }
  ]
}

{ "action": "reject", "response": { "status": 550, "enhancedStatus": "5.7.1", "message": "Confidential data detected" } }
{ "action": "tempfail", "response": { "status": 451, "message": "Please try again later" } }
{ "action": "quarantine" }      { "action": "discard" }

設定、既定値 & ベスト プラクティス

設定 / 場所 説明 既定値 本番環境のベスト プラクティス
Milter-Adresse milter の TCP または Unix ソケット: inet:host:port、inet:port@host (Sendmail 表記)、host:port または unix:/path。 - Rspamd: inet:127.0.0.1:11332 (milter = yes のプロキシ ワーカー)。ClamAV-milter: unix:/run/clamav/clamav-milter.ctl または inet:127.0.0.1:7357。
Phasen und Aktionen (Milter) オプション ネゴシエーション v6、マクロ (j、{client_addr}、i、{auth_authen}、{mail_addr}、{rcpt_addr})、connect、helo、mail、rcpt、data、header、eoh、body、eom。応答: accept、continue、reject、tempfail、discard、reply code、quarantine。変更: ヘッダーの追加・挿入・変更、本文の置換、受信者の追加/削除、送信者の変更。 alle angeboten Milter が無効にしたステージ (SMFIP_NO*) は送信されず、応答なしのステージ (SMFIP_NR_*) は応答を待ちません。
Zeitlimits 接続時、コマンドごと、コンテンツ / メッセージ終了時のそれぞれに個別に設定します。進行状況の応答によりコンテンツのタイムアウトが延長されます。 5 s / 10 s / 60 s 大きな添付ファイルを扱うウイルス スキャナーでは、コンテンツのタイムアウトを 120-300 秒に引き上げてください。
MTA-Hook Phasen und Sicherheit フックごと: connect、ehlo、mail、rcpt、data。任意の認証ヘッダー (例: Authorization: Bearer ...) と HMAC-SHA256 署名。いずれも暗号化して保存され、表示されることはありません。 data 必要なステージのみを有効にしてください: 呼び出しごとに、フックの応答時間が SMTP ダイアログに加算されます。フックは 1 秒未満で応答する必要があります。
Reihenfolge Milter とフックは order フィールドの順に実行され、最初の拒否でチェーンが終了します。DATA 時には、各フィルターは前のフィルターによる変更が反映されたメッセージを参照します。 Milter 100, Hooks 200 高速で安価なチェック (例: レピュテーション) を、高コストなチェック (ウイルス スキャン) の前に配置します。