付与したヘッダをPostfixでチェックする¶
Rspamdのadd_headerで付与したメールをPostfixでそのまま判定する場合、
header_checksでは判定が出来ない。これは次のような判定順であるため。
smtpd(smtp_milter) → cleanup(header_checks→non_smtp_milter) → incoming
rspamdはnon_smtp_milterなので、rspamdで付与したヘッダを判定するためには
non_smtp_milterのあとにheader_checksを行う必要があるが、この順番は変更できない。
メールボックスがルのであればprocmailなどで読めば良いが、メーリングリストや
転送用エイリアスなどはメールボックスがないのでこの方法では対応が出来ない。
出来ればメールサーバのキュー内で対応したい。
設定¶
milterの結果のチェックを想定した「milter_header_checks」が別途存在するので、
これを設定することでrspamdが付与したヘッダを直後にチェックすることができる。
ここでは例としてスパム判定されたメールをrejectせず、かつ配送もせず、人の目で
検査するためのアドレスに転送する設定を行います。rspamdはデフォルトではスパム
判定された際に「X-Spam: Yes」というヘッダを付与するので、これを検査します。
- 下記の設定を追加します# vi /etc/postfix/main.cf ---------------------------------------- milter_header_checks = regexp:/etc/postfix/milter_checks 
- テーブルファイルを作成します# vi /etc/postfix/milter_checks ---------------------------------------- /^X-Spam:\sYes/ REDIRECT 転送先メールアドレス - そのほかにreject、discard、holdなどがありますが、それらはrspamd側でも設定可能です。
 あくまでrspamd側を変えずに動作を変更するか、rspamdでは簡単には対応出来ないredirectなど
 を設定する際に本設定を使うと良いかと思われます。
 
- そのほかにreject、discard、holdなどがありますが、それらはrspamd側でも設定可能です。
- サービスを再起動して適用します# systemctl restart postfix 
以降テーブルのみを変更する場合はpostfixは再起動しなくても良いですが、子プロセス
が再起動する際に新しいテーブルが読まれるので、即時反映したい際は再起動します。
以上でスパム判定されたヘッダが付与されたメールが別のアドレスに転送されます。
応用(もう少し柔軟に、一定のスパムレベルまではadd_headers状態でもメールを配送したい)¶
上記の例では「add_headers」されると即隔離動作となりますが、実際の運用上は「ある程度怪しい状態はヘッダ付きで一応配送する」
「かなり怪しい場合はヘッダをフラグとして隔離する」という柔軟さがほしくなるかもしれません。
例えば「ある一定のスコア以上の場合隔離」とする場合「X-Spam-Level」を付与するようにすると、スコアの整数分だけ「*」を値に
持つヘッダがつくので、次のように応用可能です。
・rspamd側でadd_headers時に「X-Spam-Level」を付与する。
・「X-Spam-Level: ***************」(スコア15.0以上)であれば、REDIRECTで隔離アドレスに移動する。
ただし「*」はエスケープが必要で面倒くさいので、milter_headers.confのroutinesで文字列の種類を変えてしまうのも良いと思います。
- 詳細は Rspamd-addheader 参照ですが、次のような定義を行うと良さそうです。
 ここでは上記エスケープが面倒なので、スパムレベルの文字列を「x」にします。# vi /etc/rspamd/local.d/milter_headers.conf ---------------------------------------- use = ["x-spam-level"]; routines { x-spam-level { header = "X-Spam-Level"; char = "x"; remove = 0; }
- postfix側は次のようなフィルタを行います。
 ここではスコアの回数分付与される文字列「x」が15個以上(スコア15以上)の場合に隔離するようにします。# vi /etc/postfix/milter_checks ---------------------------------------- /^X-Spam-Level:\sx{15,}/ REDIRECT 転送先メールアドレス
- rspamd、postfix両サービスを再起動します# systemctl restart rspamd postfix 
- 以上で「スパムスコアが14までならadd_headers状態で受信(迷惑メールフォルダ行き)」「スパムスコアが15以上ならリダイレクトで隔離」
 という2段階の動作で運用することが出来ます。