プロジェクト

全般

プロフィール

付与したヘッダを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など
      を設定する際に本設定を使うと良いかと思われます。
  • サービスを再起動して適用します
    # 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段階の動作で運用することが出来ます。