スパムアサシン(spamassassin)の設定メモ


あくまでもユーザーの立場に徹してメモを残してみます。 まだSpamassassinの設定はそれほどネットにないようなので、こんないい加減なメモでも多少は役に立つかもしれませんし…。

はじめの一歩

まず始めに、以下の手順でSpamassassinを利用できる環境を作ります。

SPAMを学習させる

教師信号としてSPAMを入力する

sa-learn --spam ~/Mail/JUNK

上記の例では、HOME上のMail/JUNKの下にSPAMを集めておいて、それを sa-learnに読み込ませることになる。 ファイルが1つに連結したmbox形式の場合には別途オプションが必要。
sa-learn --spam --mbox

Non-SPAMを学習させる

sa-learn --nonspam ~/Mail/inbox または sa-learn --ham --file ファイル名

基本的に不要だと思うけど、第1種の過誤が多い場合にはNon-SPAMを学習させる。 個人的には、user_prefsを編集してwhitelistに載せた方が早いような気がしますが…。

さて、Spamassassinは迷惑メールの自動振替以外にも、ウィルスメールの自動削除にも有効です(ウィルスのパターンを学習させる)。 したがって、procmailとの組み合わせは非常に利点が多いシステムだと思います。

しかし、Spamassassinを使うための前提条件としては、UNIXのシェル環境が使えることがまず第一にあり、それ以外にも、使って嬉しい環境というのが実はあるように思います。

たとえば、僕のようにPOPを利用してローカルにメールをとってきて読んでいるような環境だと、Spamassassinに学習させるネタがサーバー側にないのでメリットが半減してしまいます。 この場合は、後述するuser_prefsや.procmalを編集して、チマチマと手動で設定する必要があります。 これで必要十分ですが、それほどありがたくありません。 Procmailを利用するメリットはあっても、Spamassassinを利用するメリットをほとんど感じられないからです。。 おそらく、Spamassassinで重要なことは何かというと、SPAMとNon-SPAMの違いをコンピュータが学習・判定してくれることであり、細かいルールを人間がチマチマと指定しないで済ますことができる点にあると思います。

ですが、POPでローカルにメールをとってきている場合にも、実は簡単に学習させることができるのです。

思いつけば非常に当たり前ですが、ジャンクメールをFTPでサーバー側にアップロードして、それを学習させればいいんですね。(笑) これで、MTAにPOPを使った作業環境(e.g., MeW など)でも、ベイズネットの学習効果の恩恵に浴することができるわけです。

user_prefsの設定

学習させるのが面倒(意外と時間がかかります)なので、僕は気が向いたらEMACSやVIで編集しています。 ただ、こういうふうにuser_prefsを直接編集することは、spamassassinの導入意図を考えるとやや本末転倒だと思います。 上述したとおり、user_prefsで設定している内容と同じことは、ほとんどProcmailで実現可能だし、 また、規則を一々書き加えていく方式はメンテナンスが大変だからです (スコアを細かくチューニングすることも嫌いじゃありませんが、そんな面倒なことは計算機にさせるべきだと思います)。

なお、ベイジアンで学習させた内容よりも、user_prefsで規則として指定した条件の方が優先して判定されるようです。 spamassassin --lintで設定内容のエラー自体は簡単にチェックできますが、ドメインを丸ごと指定するような場合には、(目視で)慎重に確認した方がいいでしょう。

Whitelistの指定方法

無条件に受け付けるアドレスやドメインを指定することが可能です。 ひとまず、仕事関係者や友だちなどのアドレスを指定しておくと安全でしょう。

whitelist_from *@city.sendai.jp
whitelist_from *.myswan.ne.jp
whitelist_from *.miyagi.jp
# whitelist_from *.ac.jp
whitelist_from *.go.jp
whitelist_from *.edu
whitelist_from *.edu.sg
whitelist_from *.net.mm
whitelist_from friends@var.foo.com

Blacklistの指定方法

あんまり物ぐさ?をしてはいけませんが、決めうち的に排除することも可能です。 悪質なサイトを載せるだけにとどめた方が安全だと思います (などと言いながらも、既に100以上も指定しているような…まさに、イタチごっこ)。

blacklist_from *artlist.com
blacklist_from *rock.com
blacklist_from *artcompendium.com
blacklist_from *cmecsz.com
blacklist_from *materialfair.com
blacklist_from *@usa.com
blacklist_from *@usa.net
blacklist_from *@vip.gr
blacklist_from *@vip.net
blacklist_from *@vip.com

参考までに、こちらに僕のブラックリストを載せてみます。 問題があるようでしたらご一報ください。

SCOREの設定方法

チューニングをするのは邪道といっても、ルールベースで操作するのも意外と楽チンだったりします。 ということで、SCOREの設定もしておくとベターだと思います。

スコアが5よりも高いとSPAMとして判定されるようになっています(下記のレシピを参照)。 バージョンによって変数が違うと思いますが、user_prefsにこんな風に書き加えます。 経験則で適当に決めているので、別のスコアリングがあると思います。 たぶん、かなり保守的に運用している方だと思うのですが、あんまり厳しく設定すると弊害が出てくるので、ホドホドにしておくのが肝要かと。。。笑

ver3.0の変数の説明はApacheのサイトにあります。

score PRIORITY_NO_NAME 1.5
score FROM_ENDS_IN_NUMS 1.0
score SUBJ_ILLEGAL_CHARS 1.0
score MISSING_MIMEOLE 1.0
score FORGED_RCVD_HELO 2.5
score RCVD_NUMERIC_HELO 1.0
score X_PRIORITY_HIGH 1.0
score RCVD_NUMERIC_HELO 1.0
score RCVD_ILLEGAL_IP 2.5
score HTML_MESSAGE 1.0
score HTML_FONT_BIG 5.0
score HTML_IMAGE_ONLY_20 5.0
score HTML_TEXT_AFTER_BODY 1.5
score HTML_TEXT_AFTER_HTML 1.5
score MIME_HTML_ONLY 2.5
score HTML_10_20 1.0
score HTML_50_60 1.0
score NO_REAL_NAME 1.0
score LOTS_OF_STUFF 1.0
score NOT_ADVISOR 1.0
score DATE_IN_FUTURE_12_24 1.0
score DATE_IN_PAST_06_12 1.0
score MSGID_OUTLOOK_INVALID 1.0
score FORGED_MUA_OUTLOOK 3.0
score FORGED_OUTLOOK_HTML 2.0
score FORGED_OUTLOOK_TAGS 1.0
score MSGID_FROM_MTA_ID 1.0
score URIBL_SBL 5.0
score RCVD_IN_SBL 1.0
score RCVD_IN_SORBS_DUL 0.5
score RCVD_IN_NJABL_DUL 0.5
score INVALID_MSGID 1.0

.procmailの設定

ネットの上にはもっと詳しいレシピ集があるので、 凝った内容はそちらにお任せして、 ここでは備忘録代わりに抜粋して例を示すだけにします。

蛇足ながら, 『#』以下の行はコメント行です。 また,お分かりだと思いますが,『←』から右も注釈です。 コピペして使うときにはこれらを削除してください。 あと,ロックファイルは最後の『:』以下にそれぞれロックファイルを指定するか(たとえば,『:0Ec: temp.lock』とか『:0: trashfile.lock 』),サンプルのように省略して,自動的に作ってもらった方が無難なようです。 (参考:Procmailの紹介とレシピの書き方正規表現メモ

SHELL=/usr/bin/sh
PATH=/bin:/usr/bin/:/usr/local/bin
LOGFILE=$HOME/procmail`date +%y%m`.log    ←ログファイルをとっておく。レポートの提出を求めるときに便利
MAILDIR=$HOME/Mail
#DEFAULT=/dev/null
DEFAULT=$MAILDIR/
:0fw: spamassassin.lock
| spamc    ←Spamassassinのマクロにすべて読み込ませる

:0:
* ^X-Spam-Level: \*\*\*\*\*
$MAILDIR/Junk    ←いきなり/dev/nullに叩き込むのはさすがにまずいので、ディレクトリに保管する
#/dev/null    ←気分的に^H^H^H^H実質的に/dev/null送りにしても構わないのですが…。

# junkフォルダに保管する代わりに、!trash@gomi.ad.jp という感じにメールを転送する方法もあります。

:0:
* ^Content-Type: text/plain;charset=\"GB2312\"    ←学習させるのが面倒なので文字コードを直接指定しています
$MAILDIR/Junk

:0: 
* ^Subject: .*GB2312   ←どうもサブジェクトではねるのが一番効率的なようです。
$MAILDIR/Junk


:0:
* ^X-Mailer: against asia    ←MUAの指定もできます
$MAILDIR/Junk

:0:
* ^Received .*ap.yourxxx.ne.jp    ←悪質である疑いが濃厚な接続業者の指定もできます
$MAILDIR/Junk           # このレシピは意外とニーズが高い?
                  # でも、リスクが高すぎるので、あまりお勧めは…。

:0 Ec:  ←Ecとは手前のレシピが実行されなかったら(E)、メッセージのコピーを残して処理する(c)。
! my-real@mail.address.ne.jp    ←こんな具合にメールをフォワードすることも可能

つまり、最後のdefaultで処理される=ローカルにメールを残した状態でメールを転送する。cをつけないとメールをローカルで読めないわけです。ちなみに,ISPのアドレスにメールを転送するのと同時に,3KB以下のメールを携帯に転送したいような場合には,以下のような二段構えにします。

:0c:
* <3000
! areare@vodafone.ne.jp

:0c:
! ufufu@hehehe.com

で,↓こんな風に転送先のアドレスを複数並記することも可能ですが,受け取り先が携帯電話だとサーバーではねられてエラーメールになってしまうことがあります。 どういうquotaにしているのか分かりませんが,1048576バイト/一通がvodafoneの上限のようです。

:0c:
! ufufu@hehehe.com areare@vodafone.ne.jp

そして,最後の処理なので,↓これを外すと大変なことに・・・。

:0
$DEFAULT

雑感

こんな具合に、ProcmailとSpamassassinを組み合わせると、一日に100通を超える迷惑メールやウィルス付きのメールにも楽々対応できるようになります。 ま、最後に残ったメールが意味のある内容とは限りませんが、、、。

ただ、これはこれで大変結構な話なのですが、受け取ったメールを一度でもSPAMと判定してしまうと、次からは下手をするとそのドメインごと(人為的に)無視してしまう可能性もあるかもしれません。

たとえば、僕のように一々学習させるのが面倒な人は、ついついuser_prefsを編集してblacklistを増やしていくような気がします。 過激な人は、たとえば特定の国から届くメールをすべてSPAMにしてしまうことも十分に可能なわけです。 実際に、Content-typeがGB2312のメイルを僕は一切見ないわけですが(もちろん、時々ざっと目を通しますが)、留学生の人がメールを英語で書いていても、メールソフトの設定がこれらの言語だと届かないリスクもあるわけです。

本学の学生さんたちの様子を見る限り、そういう人がほぼゼロに等しいと分かっているので、僕は自己責任でそうしています。 しかし、上記の例のように、こういう指定の仕方は本当は大変危険ですし、リスクがあることを分かった上で運用しないと痛い目に遭うでしょう。 でも、僕は一日100通を超えるジャンクメールに一々目を通すことは仕事に支障を来すので、絶対にしたくありません。 リスクとメリットを比較すると、ヘッダー情報に中国語が含まれるメールを読まずにすべて削除する方を僕は選びたいと思います。 できればこんなことはしたくないけど、そうしないと本当に大変なことになってしまいます。

こんな具合にインターネットはどんどん使いにくくなっていくわけですが、今後の情報教育を考えると、正しいメールを出すスキルの習得はより重要になってくると思います。 たとえば、本文がHTMLメールだけのメールは、デフォルトの設定でたぶん+2点くらいになっているはずですし…。 僕自身も変な書式のメールを出さないように気をつけていきたいと思います(内容はいいのか? ^^;)。

メールの転送設定

最後に本学におけるメール転送の記述方法を示しておきます。 以下の書式に則って(Your_IDは学籍番号…d1234など)、「.forward」というファイルを作成し、これをzドライブの一番上のフォルダーに保存します。 こうすると、たとえば、hogehoge@hotmail.comというアドレスにメールを転送し、なおかつ学内でもメールを読み書きできるようになるわけです。

\Your_ID, hogehoge@hotmail.com

SPAMクローラーの回避策

単純なmailtoではなくて,こんな風にするとアドレス収集業者を少しごまかせるようです。 出典は忘れてしまいましたが,コピペして使わせていただいています。 効果はあるような気がします。

しかし,画像でメールアドレスを示したり, 分かち書きをしたり(hogehoge at miyakyo-u ac jpとか), 色々な方法がありますが, そもそも,Webページを見てメールを出してくる人は非常に少ないので。。。必要なのでしょうかね。(笑) ま,気が向いたらメールを送ってみてください。

<SCRIPT LANGUAGE="JavaScript">
document.write("<a href=\""+"mailto:"+"m-taira"+"@"+"staff.miyakyo-u."+"ac.jp"+"\">"+"m-taira"+"@"+"staff.miyakyo-u."+"ac.jp"+"</a>");
</SCRIPT>

講義資料一覧に戻る
平のホームページに戻る
講義関連掲示板