SpamAssassin - 教育

  1. メーラをつかいつつ、SpamAssassinSpam判定漏れ分を学習させる方法について。
  2. メーラにはEdmaxを使用している。
  3. spam学習には、sa-learnというコマンドを使用する。
  4. 学習方針は、「悪いものと同時に、良いものも教える」とする
  5. メールヘッダに"X-Spam-Flag: YES"と付いているものは、学習対象から除外する。

学習方法

  1. 本来アカウント毎に学習データベースを持つべきらしいが、全体に共通のパターンとして学習させたい。
  2. Edmaxから、unixMailbox形式で、SpamAssassinをかわしたspamをエクスポートする。添付ファイルも再構築して含める。
  3. エクスポートしたファイルを、spamassassin稼動サーバ(うちではメールサーバ内)に転送。
  4. spamassassinデーモンを実行しているユーザの権限(当方では`spamd`で、sa-learnを使ってspamを学習させる。(漏れた分だけ学習させる)
 spamd$ sa-learn --spam --mbox spam/spam20081016

※ユーザ:spamdで実行して効果があるのかな....
 ⇒確証はないけど、このスレの流れを信用する
  http://spamassassin.jp/modules/xhnewbb/viewtopic.php?viewmode=flat&order=ASC&topic_id=20&forum=2

※2008.10.17追記:デーモン実行ユーザでのsa-learnで正解だということを、実証的にアレした。










資料

http://www.ksknet.net/spamassassin/spamassassin_1.html

sa-learn コマンドでspamassassinに学習をさせ、スパムの判定精度を向上させることができます。

スパムの場合には
--spam オプションを

スパムでない場合には
--ham オプションを

それぞれつけてください。

また指定する読み込みの対象はファイルや、メールボックス、
ディレクトリ、などでそれぞれ続くオプションが違います。

--mbox <-- メールボックス
--file <-- ファイル
--dir <-- ディレクトリ

[例]
sa-learn --spam --file spam.txt

ちなみにmanページによると、スパムメールだけを覚えさせてもあまり効果はないようで、スパムと間違って判断してしまったメールも学習させる必要があるみたいです。最低スパムメールとそうでないメールを1000通づつ学習する必要があります。ただし、5000通以上になりますと、あまり精度はあがらないとのことです。


http://www.geocities.jp/bashou1000/spamassassin.txt

spamAssassin設定
                            新規作成 2005/02/23
                            最終更新 2005/03/08

●概要
 一日に受信するメールの内、8割をスパムが占めているユーザもいる事から、
 スパムフィルタ導入の運びとなった。
 SpamAssassinが動作するまでの処理内容としては、以下
 
   Postfixがメール受信
       ↓
   Procmailへ中継。ProcmailはSpamAssassinに再中継
       ↓
   SpamAssassinによるSpam判定
       ↓
   適切なユーザフォルダへ格納。スパムメールと判断されたら、指定フォルダに格納。


●日々の運用
 誤認識防止の為、spamアカウントに届くメールや /home/spam ディレクトリは
 毎日チェック。

 SpamAssassinを経由したメールには、メールヘッダー部分にスパム判定スコア
 などが追加されている。
 基本的に SpamAssassin に autolearn=spam と判定されたものは放置。
 autolearn=no となったものは、 sa-learn --spam で学習。

 ---------------------------------------------------------------------
 例:test@yahoo.co.jp宛のスパムメールが、正常と認識されて下記フォルダに
   格納された。
      /home/test/Maildir/cur/1109854125.3112_0.mail.yahoo.co.jp:2,S

      スパム学習させる。
      # sa-learn --spam 1109854125.3112_0.mail.yahoo.co.jp:2,S
      ※特に必要が無ければ、以下の手順は行なわず学習済のメールを削除しても良い。

      権限をspamに直す
   # chown spam 1109854125.3112_0.mail.yahoo.co.jp:2,S
      本来のspamフォルダに移動
      # mv 1109854125.3112_0.mail.yahoo.co.jp:2,S /home/spam/Maildir/new/
 ---------------------------------------------------------------------

 正常なメールがスパムと誤認識したものは sa-learn --ham で学習した後、
 本来のフォルダへ移動。
 ---------------------------------------------------------------------
 例:test@yahoo.co.jp宛のメールが、スパムと誤認識されて下記フォルダに
   格納された。
      /home/spam/Maildir/cur/1109854125.3112_0.mail.yahoo.co.jp:2,S

      スパム学習させる。
      # sa-learn --ham 1109854125.3112_0.mail.yahoo.co.jp:2,S
      権限をtestに直す
   # chown test 1109854125.3112_0.mail.yahoo.co.jp:2,S
      本来のフォルダに移動
      # mv 1109854125.3112_0.mail.yahoo.co.jp:2,S /home/test/Maildir/new/
 ---------------------------------------------------------------------
   
 誤認識していない通常のメイル (ham: SpamAssassin ローカルな slang) 
 でも、 autolearn=no は sa-learn --ham で学習。 


●whitelistへの追加
 スパム学習をしても、誤診が直らない場合、
 各ユーザディレクトリにある user_prefまたは/etc/spamassassin/local.cf内に
 下記のような記述を追加する。
 ---------------------------------------------------------------------
 whitelist_from test@yahoo.co.jp
 whitelist_from test@yahoo.ne.jp
 whitelist_from *@yahoo.co.jp
 ---------------------------------------------------------------------
 設定追加後は、spamassassinに設定を読み込ませる。
 # /etc/init.d/spamassassin reload

 whitelistに追加されたアドレスからのメールは、あらかじめSpam判定のスコアに
 -100されて計算される。判定時のスコアが8以上の場合、スパムと認識するように
 なっているので、まずスパムにはならない。


●ユーザ追加時の手順
 ユーザ追加後、メール格納用のフォルダ(新規、既読、一時)を作成する。
 ※以前の /var/mail/ フォルダは使用出来ない。Spam判定時の取り扱いを考えて
  mbox形式からMaildir形式に、メール保存方法を変更したため。
 ---------------------------------------------------------------------
 例:ユーザ:test

      ユーザ追加。ログインは出来ないように設定
   # useradd -s /bin/nologin test

   メールフォルダの作成
   # mkdir /home/test
   # mkdir /home/test/Maildir
   # mkdir /home/test/Maildir/new
   # mkdir /home/test/Maildir/cur
   # mkdir /home/test/Maildir/tmp

      全てオーナーはtestにしておく。
   # chmod -R test /home/test
 ---------------------------------------------------------------------

●SpamAssassinを有効にするには(受信メールをProcmailに渡す設定)
 各ユーザのホームディレクトリに.forward作成
  .forward の中身に、下記の一文を追加する。
  "|IFS=' ' &&exec /usr/bin/procmail -f- || exit 75 #ユーザ名"
 
 例 /home/test/.forward
  --------------------------------------------------------------------
  "|IFS=' ' &&exec /usr/bin/procmail -f- || exit 75 #test"
  --------------------------------------------------------------------
 ※SpamAssasinの適用を中止する(Procmailに渡さなくする)場合は、
  中身が空の .forward ファイルを配置すればよい。


--------------------------------------------------------------------------------

以下、インストール時の設定
●mbox から Maildir への移行時に既存のメールをmaildir形式に変換する。
 http://untroubled.org/mbox2maildir からmbox2maildirを
 取得しておき、実行可能にしておく
 # wget http://untroubled.org/mbox2maildir
 # chmod 755 mbox2maildir
  スクリプトの実行例
 # ./mbox2maildir /var/mail/test /home/test/Maildir
  ※ rootで実行したせいか、オーナーがrootに代わってしまうので、
   Maildir以下のchmodを忘れずに

●SpamAssassin3.0.2のインストール
 Debian GNU/Linux 3.0r4(woody)のSpamAssassinは2.20とバージョンが
 古いので、/etc/apt/sources.list にbackportを追加しておく。
 以下のような形だと、postfixも2.1.5の比較的新しいバージョンが
 インストール可能になる。
--------------------------------------------------------------------
# spamassassin backport 20050210
deb http://www.backports.org/debian/ woody spamassassin
deb http://www.backports.org/debian/ woody libnet-dns-perl

# postfix backport 20050210
deb http://www.backports.org/debian/ woody postfix
--------------------------------------------------------------------
  ※今回は、SpamAssassinだけをインストールした。

 SpamAssassinインストール
 # apt-get update
  # apt-get install spamassassin
 これだけだとライブラリが足らないので
 # apt-get install libnet-dns-perl

  SpamAssassinのテストは
  #spamassassin -t < /usr/share/doc/spamassassin/sample-spam.txt

 また、/etc/default/spamassassin 内の
 ENABLED=0 → ENABLED=1 にしないとspamassassinが起動出来ないらしい。
 起動は/etc/init.d/spamassassin start

●SpamAssassinの設定
 全体設定は、/etc/spamassassin/local.cf に行なう。
 今回は、下記アドレスから http://tlec.linux.or.jp/docs/user_prefs
 設定サンプルをもらってきて、local.cfとした。


●Maildir形式の受信をサポートするPOPをインストール
 # apt-get update
  # apt-get install courier-pop

●PostfixにMaildirの設定
 /etc/postfix/main.cfに下記設定を施す。
  --------------------------------------------------------------------
 #home_mailbox = Mailbox

 home_mailbox = Maildir/
 mail_spool_directory=/var/mail/
  --------------------------------------------------------------------
 この後、postfixを設定再読み込み又は、再起動すると設定反映
 # /etc/init.d/postfix reload
  又は
 # /etc/init.d/postfix restart

  なお、Debianパッケージpop-before-smtpを利用したい場合には
  下記のようなパラメータ設定をすると良いかも
  --------------------------------------------------------------------
  mynetworks = 127.0.0.0/8 hash:/var/lib/pop-before-smtp/hosts
  
  smtpd_recipient_restrictions = permit_mynetworks,reject_non_fqdn_recipient,
  check_client_access hash:/var/lib/pop-before-smtp/hosts,
  reject_unauth_destination
  --------------------------------------------------------------------
 ※ pop-before-smtp利用時は、/etc/pop-before-smtp/pop-before-smtp.confを修正する
   既存のpat pat2を#でコメントアウトし、下記設定追加
 /etc/pop-before-smtp/pop-before-smtp.conf
  --------------------------------------------------------------------
 # 2005/02/22 addd
  # For Courier-pop
  pat = '^(... .. ..:..:..) \S+ courierpop3login: LOGIN, user=\S+, ip=\[::....:(\d+\.\d+\.\d+\.\d+)\]$
'
  --------------------------------------------------------------------

●ProcmailをSpamAssassinと連携させて使う設定
 /etc/procmailrc
  --------------------------------------------------------------------
 PATH=/bin:/usr/bin:/usr/local/bin
 MAILDIR=$HOME/Maildir
 DEFAULT=$MAILDIR/
 LOGFILE=$HOME/.SPAM/procmail.log
 LOCKFILE=$HOME/.lockmail

 :0fw
 *!^X-Spam.*
 | /usr/bin/spamc

 :0:
 #*^X-Spam-Status: Yes
 * ^X-Spam-Level: \*\*\*\*\*\*\*
 ! spam
  --------------------------------------------------------------------


●Spamの促成学習
  通常、1000通ほど学習させた後にSpam判別が安定するが、
 インストールしたばかりで適当なサンプルがない場合。
  tlec から、Spamメール集を取得し、これを学習させる。
 # wget http://www.flcl.org/~yoh/yoh_spam_050102.tar.bz2
  # apt-get install bzip2
 # bzip2 -dc yoh_spam_050102.tar.bz2 | tar xvf -
 # sa-learn --spam ./home/yoh/spam/spam/

●設定変更(2005/03/04)
 運用をしていく中で、local.cf の最後尾に下記設定を追加した。
 /etc/spamassassin/local.cf
  --------------------------------------------------------------------
 (中略)
 always_add_report 1

 whitelist_from test@yahoo.jp
 whitelist_from test@yahoo.ne.jp
 whitelist_from *@yahoo.co.jp
  --------------------------------------------------------------------
 always_add_report { 0 | 1 } ※デフォルト0 
   スパムと判定した場合に、その条件でこう判定されたかのレポートを
   つけるのが0。不要なら1をセットする


http://pc11.2ch.net/test/read.cgi/unix/1124772932/