%%Title: spamassassin 様にすがってみる %%Created: Fri Nov 1 14:46:43 JST 2002 %%Updated: Fri Nov 29 12:05:54 JST 2002 o spamassassin って何? perlで書かれたspamフィルタ http://www.spamassassin.org/ FreeBSDでは p5-Mail-SpamAssassin として ports化されている ライブラリは /usr/local/lib/perl5/site_perl/5.005/Mail/SpamAssassin/ にインストールされてる ルールの初期値は /usr/local/share/spamassassin にある。 spamassassin(1) spam判定プログラム spamd(1), spamc(1) spam判定エンジンをデーモン化して時間短縮する POPしてきたメールを spamassassinや spamcにくわせてもよいが、 MTAで spamd を動かして sendmail.cf等から spamcを叩くとスプールさせる 前にspamを取り除くことができる。 2.31の時点では # TODO: doesn't yet handle checking multiple-attachment messages, # where one part is qp and another is b64. Instead the qp will # be simply stripped. なので、multipartされているとお手上げ。 o テスト spamと思うメールを spamassassin に食わせてみる。 % spamassassin < hoge Return-Path:: (メールヘッダ) : X-Spam-Status: Yes, hits=6.6 required=5.0 tests=BASE64_ENC_TEXT,DATE_IN_FUTURE_12_24,RCVD_IN_DSBL, SPAM_PHRASE_00_01,USER_AGENT_OE version=2.43 X-Spam-Flag: YES X-Spam-Level: ****** X-Spam-Checker-Version: SpamAssassin 2.43 (1.115.2.20-2002-10-15-exp) X-Spam-Prev-Content-Type: multipart/alternative; boundary="----=_NextPart_000_0463_CCF41935.2C68805A" SPAM: -------------------- Start SpamAssassin results ---------------------- SPAM: This mail is probably spam. The original message has been altered SPAM: so you can recognise or block similar unwanted mail in future. SPAM: See http://spamassassin.org/tag/ for more details. SPAM: SPAM: Content analysis details: (6.60 hits, 5 required) SPAM: USER_AGENT_OE (0.2 points) X-Mailer header indicates a non-spam MUA (Outlook Express) SPAM: SPAM_PHRASE_00_01 (0.8 points) BODY: Spam phrases score is 00 to 01 (low) SPAM: BASE64_ENC_TEXT (1.4 points) RAW: Message text disguised using base-64 encoding SPAM: DATE_IN_FUTURE_12_24 (1.0 points) Date: is 12 to 24 hours after Received: date SPAM: RCVD_IN_DSBL (3.2 points) RBL: Received via a relay in list.dsbl.org SPAM: [RBL check: found 81.160.98.24.list.dsbl.org] SPAM: SPAM: -------------------- End of SpamAssassin results --------------------- : (元のメールボディ) : 判定結果がメールヘッダとメールボディに付け加えられる。 メールヘッダはプレフィクス X-Spam- メールボディはプレフィクス SPAM: 初期設定では 5点で spamメールと判断するので、 上記の例では 6.60点なので spamメールと判定されている。 日本語のメールはルールの書き方にもよるけど % nkf -e -m0 < hoge | (setenv LANG ja_JP.EUC ; spamassassin) o チューニング 設定ファイル spamassassin(1)を使う場合 $HOME/.spamassassin/user_prefs で調整 spamassassin は起動するとこのファイルを読んで初期値を上書きする。 spamd(1)を使う場合 /usr/local/share/spamassassin/15_site.cf とかに書く。 個人で使うには user_prefs にリンクしてもいい。 # ln -s $HOME/.spamassassin/user_prefs /usr/local/share/spamassassin/15_site.cf user_prefs のサンプル blacklist_from whitelist_from 特定の From: を受信/拒否する whitelist_from Internet-Drafts@ietf.org blacklist_from big@boss.com DATE_IN_FUTURE_12_24 配送経路の時間設定に問題があると引っかかるので下げる 初期値は 3.308 score DATE_IN_FUTURE_12_24 1.0 UNDISC_RECIPS To: が undisclosed-recipients だと引っかかる 初期値は 4.034 score UNDISC_RECIPS 1.0 FROM_AND_TO_SAME_5 From: と To: が同じで 1.3 は低いと思う…とりあえず3倍。 初期値は 1.3 score FROM_AND_TO_SAME_5 3.9 DEAR_SOMEBODY DEAR_FRIEND Dear hoge を使う人とはつきあいがないので上げる 初期値は -0.694 score DEAR_SOMEBODY 1.5 score DEAR_FRIEND 1.5 ORDER_STATUS 初期値は -3.0 negative check で点数引いてるのはなんで?? score ORDER_STATUS 3.0 CASHCASHCASH JISだと $ 沢山使ってるので EUCに変換してからチェックする nkf -e -m0 < hoge | spamassasin -t ※ nkfのデフォルト動作は MIMEデコードする。SubjectもEUCに変換されちゃうと SUBJ_FULL_OF_8BITS にひっかかるので -m0 を使う それでも引っかかる… spamassasinは bodyのチェックといいつつ実はSubject:もチェックの対称にしている しかも、内部で MIMEデコードしているので本文とコードセットがことなったまま渡る。 例えば Subject: =?ISO-2022-JP?B?MTEbJEI3bjgmNWYycSRHRDokJCQ/MFU4KxsoQg==?= は、nkf -e -m0 の結果、本文がEUCでも Subject: 11.$B7n8&5f2q$GD:$$$?0U8+.(B. で渡るので、$$$にひっかかる 面倒なので無視する。 score CASHCASHCASH 0 SUBJ_HAS_Q_MARK 比較する時に Subject:は上記の様に変換されているので ? に引っかかる これも面倒なので値をさげる 初期値は 0.7 score SUBJ_HAS_Q_MARK 0.3 UPPERCASE_25_50 UPPERCASE_50_75 UPPERCASE_75_100 JISだと $ 沢山使ってるので EUCに変換してからチェックする nkf -e -m0 < hoge | spamassasin -t それでも引っかかる… EvalTests.pm では [A-Z]と[a-z]の存在比率を見てる 多分、EUC限定で [A-Z]と[a-z\x80-\xff]にしないとダメ とりあえず SpamAssassin-2.43 に対するパッチ *** EvalTests.pm.orig Fri Nov 15 02:05:47 2002 --- EvalTests.pm Fri Dec 13 08:45:02 2002 *************** *** 1639,1641 **** # count numerals as lower case, otherwise 'date|mail' is spam ! my $lower = $body =~ tr/a-z0-9//d; my $upper = $body =~ tr/A-Z//; --- 1639,1641 ---- # count numerals as lower case, otherwise 'date|mail' is spam ! my $lower = $body =~ tr/a-z0-9\x80-\xff//d; my $upper = $body =~ tr/A-Z//; CHARSET_FARAWAY_HEADERS CHARSET_FARAWAY LC_ALL,LANGUAGE,LC_MESSAGES,LANG のいずれかに ja_JP.EUC を設定しておく 優先順はこの順。 コードを見ると… spamd/spamc spamdにlocaleを設定する export LANG=ja_JP.EUC /usr/local/bin/spamd -d spamassassin export LANG=ja_JP.EUC /usr/local/bin/spamassassin -t < hoge FROM_STARTS_WITH_NUMS NO_REAL_NAME FROM_ENDS_IN_NUMS 携帯からのメールだとこれらに引っかかる。 From: のドメインを whilelist_from に追加する whilelist_from *@docomo.ne.jp whilelist_from *@jp-h.ne.jp HTTP_CTRL_CHARS_HOST Subject: [ipv6:0034] のように、メーリングリスト名とメールの 整理番号の区切りに":"を使っていると引っかかる。 PerMsgStatus.pmの $base_uri の初期値が問題あり? Subject: と本文の扱いは分けたい所。 とりあえず SpamAssassin-2.43 に対するパッチ *** PerMsgStatus.pm.orig Fri Dec 13 08:40:51 2002 --- PerMsgStatus.pm Fri Dec 13 08:41:33 2002 *************** *** 1322,1324 **** ! my $base_uri = $self->{html}{base_href} || "http://"; my $text; --- 1322,1324 ---- ! my $base_uri = $self->{html}{base_href} || ''; my $text; RELAYING_FRAME 使ってると引っかかる。 初期値は 0.031 なんでこんなに低いの? score RELAYING_FRAME 3.0 FROM_AND_TO_SAME From: To: が同じだと引っかかるんだけどマイナスしてる… 初期値は -2.071 score FROM_AND_TO_SAME 0.1 CTYPE_JUST_HTML 本文がHTMLだけのメールは読めないので spamと見なす。:-) 初期値は 1.665 score CTYPE_JUST_HTML 3.0 Subject: 未承諾広告※ をspamにする header MISHOUDAKU_KOUKOKU Subject =~ /\x4c\x24\x3e\x35\x42\x7a\x39\x2d\x39\x70\x22\x28/ describe MISHOUDAKU_KOUKOKU Subject: has 未承諾広告※ score MISHOUDAKU_KOUKOKU 5 ※の部分は様々なバリエーションがあるので最後の \x22\x28はなくていいかも header MISHOUDAKU_KOUKOKU Subject =~ /\x4c\x24\x3e\x35\x42\x7a\x39\x2d\x39\x70/