Rspamd の設定を細かくやってみる - 力技で正規表現フィルタリング

正規表現でのフィルタリング、「一応」出来るようになったので、メモとして残しておく。

modules.d ディレクトリの中を見ると、 SpamAssassin と連携するための spammassassin.conf や メールヘッダや本文中の文字列を正規表現で引っ掛けるための regexp.conf といったものがあるので、このあたりを使いこなせれば更に検知精度が上げられそうです。正規表現での検知は、実際には Rspamd デフォルトのものが有効化されているので、使われていないわけではないんですけど。

[From Rspamd の設定を細かくやってみる - Soukaku's HENA-CHOKO Blog]

但し、「正しい」方法ではないので、参考にしたいという方は、その点自己責任でお願いします。

本来の「正しい」設定方法

/etc/rspamd/local.d/regexp.conf というファイルを作って、そこにブロックしたいメールのヘッダ情報から、フィルタしたい条件を正規表現で記述します。

nexus01:/etc/rspamd# more local.d/regexp.conf
--
config['regexp']['RECEIVED_worldstream'] = {
re = 'Received=/ customer\\.worldstream\\.nl/i',
score = 2.5,
group = 'header'
}

--
config['regexp']['RECEIVED_93034net'] = {
re = 'Reveived=/\\.93034\\.net/i',
score = 2.5,
group ='header'
}

それが終わったら、rspamadm コマンド使って、フィルタしたい内容が認識されているところ確認して〜、と書きたいところなんですが、これが上手くいかない。
ドキュメント通りに設定書いてるのに、local.d/regexp.conf の記述内容が反映されない…。反映されなので、正しく記述できているのかもわからないという困った状況に陥ってしまいました。


仕方がないので、力技で解決する

ということで、ここからは力技での解決を図ってみたのだけど、以下の内容については自己責任ということで…。

さて、前に書いたとおりで、 Rspamd のパッケージには Rspamd として正式に提供している正規表現フィルタがあり、それについては特段の設定をせずとも機能しているわけなので、

正規表現での検知は、実際には Rspamd デフォルトのものが有効化されているので、使われていないわけではないんですけど。

[From Rspamd の設定を細かくやってみる - Soukaku's HENA-CHOKO Blog]

その正規表現の設定ファイルを直接弄っちゃえば「出来るんじゃないか?」と思いついたわけですが…。
もちろん、本来想定されている設定方法じゃないのはわかっていますし、パッケージのアップデートしたら上書きされちゃう可能性が高いわけだし、それを再設定する手間も発生するので…。(そういう事が起きないようにするために、 local.d ディレクトリや override.d ディレクトリに個別設定を置く形式を採っているとも言える。)

ということで、まずはパッケージで配布されている正規表現ファイルの位置を確認。

nexus01:~# dpkg -L rspamd | grep regexp
/etc/rspamd/modules.d/regexp.conf
/usr/share/rspamd/rules/regexp
/usr/share/rspamd/rules/regexp/compromised_hosts.lua
/usr/share/rspamd/rules/regexp/headers.lua
/usr/share/rspamd/rules/regexp/misc.lua
/usr/share/rspamd/rules/regexp/upstream_spam_filters.lua

と、コレで位置がわかったので、直接編集するファイル(今回は、ヘッダにある情報でフィルタしたいので regexp/headers.lua )のバックアップを取って、

nexus01:/etc/rspamd# cd /usr/share/rspamd/rules/
nexus01:/usr/share/rspamd/rules# cp -p regexp/headers.lua regexp/headers.lua.orig
nexus01:/usr/share/rspamd/rules# ls -l regexp/
合計 96
-rw-r--r-- 1 root root 5994 9月 17 2015 compromised_hosts.lua
-rw-r--r-- 1 root root 38214 9月 17 2015 headers.lua
-rw-r--r-- 1 root root 38214 9月 17 2015 headers.lua.orig
-rw-r--r-- 1 root root 1601 9月 17 2015 misc.lua
-rw-r--r-- 1 root root 1479 9月 17 2015 upstream_spam_filters.lua

個別に設定したい正規表現フィルタを追記…。
今回は、以下のようなフィルタを記述してみる。

nexus01:/usr/share/rspamd/rules# diff -u regexp/headers.lua.orig regexp/headers.lua
--- regexp/headers.lua.orig 2015-09-17 23:17:32.000000000 +0900
+++ regexp/headers.lua 2017-12-01 21:57:38.073529966 +0900
@@ -909,3 +909,25 @@
score = 0.0,
group = 'headers'
}
+
+--- original regexp
+--
+config['regexp']['RECEIVED_worldstream'] = {
+ re = 'Received=/ customer\\.worldstream\\.nl/i',
+ score = 2.75,
+ group = 'headers'
+}
+
+--
+config['regexp']['RECEIVED_93034net'] = {
+ re = 'Reveived=/\\.93034\\.net/i',
+ score = 2.75,
+ group ='headers'
+}
+
+--
+config['regexp']['MESSAGE-ID_in_QMAIL_YAHOO'] = {
+ re = 'Message-ID=/\\.qmail\\@mta[0-9]{3}\\.bbt\\.yahoo\\.co\\.jp/i',
+ score = 1.25,
+ group ='headers'
+}

config['regexp']['シンボル名'] = { 〜 } を一つのブロックとして、そのブロック内に "re = '/正規表現/'" もしくは特定ヘッダを対象にする場合は "re ='ヘッダ=/正規表現/'"という形式でフィルタしたい条件を記述、 "score = 数値" で、そのシンボル名で定義した正規表現に合致するメールだった場合に付与するスコアを定義します。
あとは、"group =" でシンボルを所属させたいグループ名を定義したり、"description =" で簡単な説明を記述しておくと、Web GUI の Symbol メニューで、その内容を確認することが出来ます。また、ブロック内の各項目の区切りとしてのカンマを忘れないように。

正規表現フィルタとして追加したシンボルを確認

正規表現の書き方に関しては、Rspamd のサイトにある regexp モジュールの説明か、 regexp/headers.lua 自体をサンプルにしてください。
フィルタしたい内容に関しては、ブロックしたいスパムメールのヘッダをよく見て共通しているものを見つけるのがポイントですね。あと、いきなりスコアを上げてしまうと、誤判定した時に本来ブロックすべきでないメールもブロックしてしまうことになるので、低めのスコアで始めて、徐々に調整していくようにした方が良いでしょう。

編集が終わったら rspamadm コマンドを使って、追記したフィルタが認識されているのを確認してから

nexus01:/usr/share/rspamd/rules# rspamadm configdump regexp | grep -A 5 QMAIL
MESSAGE-ID_in_QMAIL_YAHOO {
re = "Message-ID=/\\.qmail\\@mta[0-9]{3}\\.bbt\\.yahoo\\.co\\.jp/i";
group = "headers";
score = 1.250000;
}
GOOGLE_FORWARDING_MID_MISSING {

rspamd を再起動。あとは、条件に合致するメールが送られてくるのを、Web GUI をチェックしながら、ひたすら待つだけ…。

で、ブロックされたメールの情報を GUI で確認すると、下の画像のように自分で設定した正規表現フィルタのシンボルが追加されていることがわかります。

設定したフィルタでブロックされたスパム

GUI でシンボル名で検索すれば、どのメールが自分の設定した正規表現フィルタで引っかかるのかもチェックできますから、誤判定されていないかをチェックして、正規表現の記述の仕方やスコアを調整していくのに使えますね。

取り敢えずは、正規表現の指定の仕方自体は、間違っていないことは確認できたので

#実際、 regexp.conf は設定しようと試してみたものの、個別設定の内容が反映されないので、設定ファイルの書き方についての研究がもう少し必要…。

[From Rspamd の設定を細かくやってみる - Soukaku's HENA-CHOKO Blog]

早いとこ local.d/regexp.conf のほうで設定できるようにしたいなぁ…。

ということで、以上、正規表現フィルタを力技で設定する方法でした。

トラックバック(0)

コメントする