プロジェクト

全般

プロフィール

ヘッダまたは本文に正規表現でスコアを課す

Rspamdで本文またはヘッダに正規表現フィルタ(postfixでいうheader_checksやbody_checks)を使うには、regexpモジュールの
テーブル記法またはregexpオブジェクトを使ったluaスクリプトを使用することで実現が可能。ここでは簡単なregexpモジュールを使った
設定とします。

ただし本定義では1項目ごとにシンボルを作る必要があるため、通常postfixで行うような「特定のFrom等からの拒否を列挙する」ような
定義方法については「許可リスト・拒否リスト」を「multimap」モジュールで定義することをお勧めします。
あくまでリストアップするべきではない、一般的なRspamdの判定を抜けてしまう特定のヘッダや本文パターンに対して行うといいでしょう。

逆にメリットとしては本モジュールではpostfix単体では通常行えないような、「base64エンコード済みの本文」などをデコードして
日本語文字列としてフィルタする ことが可能です。この点はRspamd本体やベイジアンフィルタが2バイト文字をエンコード状態で
しか認識出来ないという弱さを補えるかもしれません。

設定ファイルの作成

  • オリジナルのモジュール設定ファイルを確認します。
    # less /etc/rspamd/modules.d/regexp.conf 
    ----------------------------------------
    regexp {
      max_size = 1M;
    
      .include(try=true,priority=5) "${DBDIR}/dynamic/regexp.conf" 
      .include(try=true,priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/regexp.conf" 
      .include(try=true,priority=10) "$LOCAL_CONFDIR/override.d/regexp.conf" 
    }
    
  • 上記で言うと「"$LOCAL_CONFDIR/local.d/regexp.conf"」で追加定義、「"$LOCAL_CONFDIR/override.d/regexp.conf"」で
    オーバーライドが可能なことが分かります。
  • これに従い追加定義用のテーブル定義設定ファイルを作成します。
    サンプルの記法については公式のリファレンス(https://docs.rspamd.com/modules/regexp)の例および、デフォルトの
    ヘッダチェック設定(/usr/share/rspamd/rules/regexp/headers.lua )をもとにlua.local.dへ.luaファイルを作成します。
    (luaファイルの場合、元のファイル名に合わせなくても良いようなので、regexp.luaとします)
    # vi /etc/rspamd/lua.local.d/regexp.conf 
    ----------------------------------------
    config['regexp']['RE_TEST'] = {
        re = '/test/i{mime}',
        score = 10.0,
        group = 'body',
        description = 'BODY_CHECKS WORD'
    }
    
    • 上記を自然言語風に説明すると以下のようになります。
      regexpモジュール用いた「RE_TEST」(regular expression つまり正規表現テスト)という任意のシンボル名
       re(正規表現指定)= ’/test(という文字列)/i{mime}(大文字小文字を区別しない、本文テキストMIMEパートを対象。base64であればデコードする)’)
       該当した場合のスコアは+10.0します
       web画面の「Symbols」のスコア調整設定における「group」の何処に所属するか定義します。ここでは本文をチェックするので「body」とします。
       同項目の説明欄(description)を記載します。
      
    • つまりデコードする系統の設定であれば 日本語文字列を直接指定 することが出来ます。(ここでいう文字列「test」を「テスト」とも出来ます
    • 1シンボルに対し「re」は1つしか定義出来ないので。場合によっては「OR」条件の正規表現を駆使するといいかもしれません。
      「test」「テスト」「てすと」いずれでもマッチするようにする。
      re = '/(test|テスト|てすと)/i{mime}',
      
  • 間違っていると起動に失敗するので、設定ファイルのシンタックスチェックを行います。
    # rspamadm configtest
    syntax OK
    
  • サービスを再起動して適用します
    # systemctl restart rspamd
    

定義やオプションなど

  • これらは他にもありますが一般的に使いそうなものをピックアップしました。
    詳細はリファレンスを参照してください。
    https://docs.rspamd.com/modules/regexp/
  • よく使いそうなオプション
    • i
      大文字小文字を区別しない
    • u
      UTF-8正規表現を用いる
    • m
      複数行正規表現とする。「^」「$」は当該ヘッダの最初と最後ではなく、各行ごとの最初と最後とします。
      例えばRecievedなど元々複数行あるものや、Subjectが長いものをエンコードした場合に2行に分割されることがあります。
    • x
      拡張正規表現を使用します。エスケープなどの仕様が若干変わります(リファレンス参照)
    • s
      「.」は任意の文字ですが、このオプションを使うと改行コードも「.」に含まれるようになります。
  • よく使いそうな検索対象のマッチタイプ定義
    • {header}
      ヘッダ値。エンコードされている場合はデコードされる。
    • {raw_header}
      ヘッダ値。エンコードされていてもデコードせずそのまま使用する。
    • {all_headers}
      ヘッダ全体。(おそらくデコードしない?)
    • {body}
      ヘッダを含むメッセージファイル内容全体。(おそらくデコードしない?)
    • {mime}
      本文のみ。エンコードされている場合はデコードされる。
    • {raw_mime}
      本文のみ。エンコードされていてもデコードせずそのまま使用する。
    • {url}
      本文に含まれるURL。
    • {email}
      本文に含まれるメールアドレス。

設定反映の確認

  • 最上部メニューの「Symbols」を開きます。(既に開いているなら一度ページ遷移した方がいいかも
  • シンボル名を検索します(必要があればグループで絞り込んでも良いです
  • 次の表示内容が定義通りに記載されているかを確認します
    Group    Symbol    Description    Score
    
  • 上記が正しいようであれば問題ありません

動作の確認

  • 実際にルールに引っかかるようなメールを送ってみます。今回は本文に「test」と書いたメールを送信すればOKです。(件名ではヒットしません
  • 「History」で当該メールを選択し、詳細を開きます。
  • 適用されたシンボルから次の内容があることを確認します
    RE_TEST 
    
    カーソルをフォーカスすると、descriptionとスコアが表示されます。
    REGEXP WORD TEST (7.5)
    
  • 上記が確認出来れば、正規表現ルールが適用されています。