Rspamdで迷惑メールを判定 (続き)

Rspamd

前回の続き。
前回はかろうじて動く程度にしただけなのでもう少し実用になるよう設定した。

上書き系の設定

/usr/local/etc/rspamd/override.d/metrics.conf (v1.7系では使用しないこと)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
actions {
  reject = 10;
}

symbol "PHISHING" {
  score = 15.0;
}

symbol "HAS_ATTACHMENT" {
  score = 1.5;
}

迷惑メールの判断しきい値は前回書いたように少し下げているが、これはrmilterの設定で「迷惑メールと判断されたメールを削除しない」場合に限る。
あとの2つは既存のルールのスコアを変更。

この部分は設定がガラっと変わったのでRspamd 1.7系のアクション設定の変更を参照下さい。

/usr/local/etc/rspamd/override.d/multimap.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
freemail_envfrom {
  map = "/usr/local/etc/rspamd/map/free.txt.zst";
}

freemail_envrcpt {
  map = "/usr/local/etc/rspamd/map/free.txt.zst";
}

freemail_to {
  map = "/usr/local/etc/rspamd/map/free.txt.zst";
}

freemail_cc {
  map = "/usr/local/etc/rspamd/map/free.txt.zst";
}

disposable_envfrom {
  map = "/usr/local/etc/rspamd/map/disposable.txt.zst";
}

disposable_envrcpt {
  map = "/usr/local/etc/rspamd/map/disposable.txt.zst";
}

disposable_from {
  map = "/usr/local/etc/rspamd/map/disposable.txt.zst";
}

disposable_to {
  map = "/usr/local/etc/rspamd/map/disposable.txt.zst";
}

disposable_cc {
  map = "/usr/local/etc/rspamd/map/disposable.txt.zst";
}

disposable_replyto {
  map = "/usr/local/etc/rspamd/map/disposable.txt.zst";
}

これらは設定の初期値ではhttps://rspamd.com/に置かれたファイルが指定されているが、ローカルに置くことにした。
なお、ファイルサイズがそれほど大きいものでもないので変更無しでも構わないとは思う。

/usr/local/etc/rspamd/override.d/
1
2
3
4
openphish_enabled = true;
phishtank_enabled = true;
openphish_map = "/usr/local/etc/rspamd/multimap/feed.txt";
phishtank_map = "/usr/local/etc/rspamd/multimap/online-valid.json.zst";

前回も書いたがonline-valid.json.zstはダウンロードに時間がかかるので定期的にダウンロードしてローカルに置く方が良さげ。
前回は自前のウェブサーバに置いたが今回は完全ローカル。

2017年8月5日追記:
phishtank_enabledをtrue指定するのはrspamdが利用できるメモリが最低で8GB(サーバーのメモリ搭載量じゃない)、安心して使うには16GB以上ある場合だけにしておいた方が良いので要注意。rspamdがメモリをバカ食いするので悩んでいたが、これが原因だったっぽい。

追加系の設定

2018年4月28日削除:
Rspamd 1.7.3で使用するには不適切だと思われる内容を削除した。

/usr/local/etc/rspamd/local.d/multimap.conf
1
2
3
freemail_replyto {
  map = "/usr/local/etc/rspamd/multimap/free.txt.zst";
}

これだけはオーバーライドしようとしたら怒られたのでlocal.dに書いた。

/usr/local/etc/rspamd/local.d/redis.conf (1行)
servers = "127.0.0.1";

これは前回書いたのと同じ。

/usr/local/etc/rspamd/local.d/worker-controller.inc (1行)
enable_password = "$2$????(中略)????";

これは前回書いたウェブ管理画面へのアクセス用パスワードの登録。
閲覧用のpasswordを使うか閲覧&登録用のenable_passwordを使うか決めてrspamadmコマンドでパスワードを作成して記入。
両方使えるようにするのもアリなんだろうけどenable_passwordだけでいいんじゃないかと。

ホワイトリストの例 (from addressで)
/usr/local/etc/rspamd/override.d/multimap.conf (新規 or 追記)
1
2
3
4
5
6
7
sender_from_whitelist_user {                     
        type = "from";                           
        filter = "email";                   
        map = "/usr/local/etc/rspamd/multimap/whitelist_from_user.map";
        symbol = "SENDER_FROM_WHITELIST_USER";
        action = "accept"; # Prefilter mode
}

/usr/local/etc/rspam/module.d/multimap.confの例からfilter, mapの2行を変更したもの。

メールアドレスのホワイトリスト
/usr/local/etc/rspamd/multimap/whitelist_from_user.map (新規)
1
2
foobar@example.com
hoge@example.net

X-Spamd-Result: default: False [0.00 / 10.00]
 SENDER_FROM_WHITELIST_USER(0.00)[foobar@example.com]

ホワイトリストに登録したアドレスからのメールのヘッダには上のような記録がある筈。

設定の確認

$ /usr/local/bin/rspamadm configtest
syntax OK

上のようにsyntax OKが出れば文法的には問題ない。

$ /usr/local/bin/rspamadm configdump

全設定・ルール表示。これでしっかり確認した方が良さげ。
これで表示される設定/ルールを変更するなら上書きなのでoverride.dに書く。存在しないのを追加するならlocal.dに書くという感じ。

rspamadmは他に幾つか役割があるのでRspamd導入直後は頻繁に使うことになると思われる。

学習

ベイジアンフィルタに迷惑メールと正常なメールをそれぞれ200以上学習させてやる。迷惑メールだけ学習させれば良いというものではないらしい。(Rspamdのログのメッセージより)

初期学習必要数の200があまりにも多いということであれば /usr/local/etc/rspamd/local.d/classifier-bayes.conf に min_learns = 30; などと学習数を指定するようだが効果は未確認。

迷惑メールを1ファイルだけ学習させる。
$ /usr/local/bin/rspamc -c bayes learn_spam /hoge-path/spam-mail.eml
/hoge-path/というディレクトリ(フォルダ)に溜めているメールファイル(複数)を学習させる。
$ /usr/local/bin/rspamc -c bayes learn_spam /hoge-path/
非迷惑メールを1ファイルだけ学習させる。
$ /usr/local/bin/rspamc -c bayes learn_ham /hoge-path/ham-mail.eml
/hoge-path/というディレクトリ(フォルダ)に溜めているメールファイル(複数)を学習させる。
$ /usr/local/bin/rspamc -c bayes learn_ham  /hoge-path/

迷惑メールは消しちゃってるから学習させる検体持ってないよという場合はSPAM Archiveさんあたりから貰ってくる。ここは古いのから新しいのまで膨大にある(数十万通/月)ので量的には困らない筈。直近3,4ヶ月分程度を学習させれば十分すぎるかと。凄い時間かかるけど。
非迷惑メールは過去に受信して保存している自分のメールを全部学習させれば良い筈。
ちなみに150万通ほど学習させてbayes.spam.sqliteとlearn_cache.sqliteのファイルサイズの合計は400MB程度と以外と小さい。

この記事はRspamd 1.6.1でやってるので違うバージョンで正常に動くとは限らない。
Rspamdは発展途上ということもあってかバージョンによって設定がコロコロ変わるので念の為。

関連記事: