目次

spam対策

SpamAssassin:http://www.spamassassin.org

procmail を使った振り分け

procmailを使って、Maildirへメールを振り分けながら、spamを除去する方法について触れます。1)

“~/.forward”に、次のように記述します。2)

"|IFS=' ' && p=/usr/bin/procmail && test -f $p && exec $p -Yf-||exit 75 #araki"

次に、~/.procmailrc をつくり、次のように記述します。3)

PATH=/bin:/usr/bin:/usr/local/bin:/usr/sbin:/sbin
MAILDIR=${HOME}/Maildir/
LOGFILE=${HOME}/log/procmail.log
DEFAULT=${MAILDIR}
TRASH=${MAILDIR}/.Trash/
 
:0fw
*~^X-Spam.*
        |/usr/bin/spamassassin
:0:
* ^X-Spam-Status: .*Yes
$TRASH
...

~/.spamassassin/user_pref

# user_prefs for spamassassin
#
header ISO20JP_CHARSET        Content-Type =~ /charset['"]?iso-2022-jp['"]?/i
describe ISO2022JP_CHARSET    ISO-2022-JP message
score ISO2022JP_CHARSET       -0.182
#
uri SPAM_ACLICE_CORP          /alicecorp\.main\.jp/i
describe SPAM_ALICE_CORP      Absolutely spam
score SPAM_ALICE_CORP         100.00
#
uri SPAM_INTER_AGENCY         /inter-agent\.net/i
descrive SPAM_INTER_AGENCY    Absolutely spam
score SPAM_INTER_AGENCY       100.00
#
uri SPAM_DEAI                 /k-server\.org/i
describe SPAM_DEAI            Absolutely spam
score SPAM_DEAI               100.00
#
ok_languages ja en
ok_locales ja en
#
required hits 5.4
full RAZOR_CHECK
describe RAZOR_CHECK
# for Japanese mail
score CASHCASHCASH 0.00
score UPPERCASE_25_50 0.00
score UPPERCASE_50_75 0.00
score UPPERCASE_75_100 0.00
score US_DOLLARS_2 0.00
score HTTP_CTRL_CHARS_HOST 0.00
#
score JAPANESE_UCE_SUBJECT 100.0
score MIME_HTML_ONLY 2.00
#
blacklist_from *@sadoga.com
blacklist_from *@yume.otegami.com
blacklist_from *@avsins.com
blacklist_from *@deol241.net
blacklist_from *@attbi.com

3.0.0以降へのアップグレード

SpamAssassinをアップグレードしたら、user_prefsは2.6のものを利用できなくなります。古いuser_prefsをそのまま使おうとすると、errorを起こし、メールのスキャンが出来なくなりますので、必ず新しく作り直してください。

作り直すにあたっては、/usr/share/spamassassin/user_prefs.templateを使って、必要な変更を加えるか、或いは、設定ツールを使って、生成するかのいずれかの方法がお勧めです。特に後者は、エントリボックスに必要な情報を入力するだけの簡単操作ですので、非常に便利です。

生成したファイルを、古い user_prefsと置き換えて、あとは、blacklistやwhitelistその他の設定を必要に応じて移入すれば完了です。次のような感じになっています。

# SpamAssassin config file for version 2.5x
# generated by http://www.yrex.com/spam/spamconfig.php (version 1.01)

# How many hits before a message is considered spam.
required_hits           5.0

# Whether to change the subject of suspected spam
rewrite_subject         0

# Text to prepend to subject if rewrite_subject is used
subject_tag             *****SPAM*****

# Encapsulate spam in an attachment
report_safe             1

# Use terse version of the spam report
use_terse_report        0

# Enable the Bayes system
use_bayes               1

# Enable Bayes auto-learning
auto_learn              1

# Enable or disable network checks
skip_rbl_checks         0
use_razor2              1
use_dcc                 1
use_pyzor               1

# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
# - english japanese 
ok_languages            en ja 

# Mail using locales used in these country codes will not be marked
# as being possibly spam in a foreign language.
ok_locales              en ja 

# additional configuration (ここから下は手で追加しました。)
score CASHCASHCASH 0.00
score UPPERCASE_25_50 0.00
score UPPERCASE_50_75 0.00
score UPPERCASE_75_100 0.00
score US_DOLLARS_2 0.00
score HTTP_CTRL_CHARS_HOST 0.00
# あまりにうざいので、ベイジアンフィルタが99%以上と認定したのは即削除
score BAYES_99 5.0

score JAPANESE_UCE_SUBJECT 100.0
score MIME_HTML_ONLY 2.00

blacklist_from *@sadoga.com
blacklist_from *@sage.ocn.ne.jp
blacklist_from *@yume.otegami.com
blacklist_from *@avsins.com
blacklist_from *@deol241.net
blacklist_from *@attbi.com
blacklist_from *@members.interq.or.jp
blacklist_from *@kingyon.com
blacklist_from *@*.mine.nu
blacklist_from *@*.vig-seet.to

POPFile:http://popfile.sourceforge.net

popfile-0.21.1をVine-2.6上で運用してきていたのですが(Vine 2.6はperl 5.6.1ベースだったので、Encode → Jcodeの変更が必要です)、Vine-3.0ではうまく動きませんでした。動作はしているのですが、一切の学習を拒否されてしまいました。

どうやら、perl-DBI/perl-DBD-SQLiteに問題があったようです。(POPFileには問題はなかったようです。) CPANモジュールを利用してインストールしようとすると、DBD::SQLiteのテストケースのうち、データの挿入で必ず失敗していました。どうもこれが原因で学習結果をデータベースに登録できなくなっていたようです。

今回、0.21.2がリリースされたのを受けて、DBI/DBD-SQLiteの再構築も行ってみたところ、どうやらうまくテストもパスしたので、再び利用できるようになったものと思います。

POPFile:http://popfile.sourceforge.net

perl 5.6では、Encode.pmが動作しないために、そのままPOPFileを利用することが出来ません。ただし、Jcode.pmを導入し、二箇所変更を加えることで動作させることが出来ます。 変更するファイルは、

です。

Classfiier/Bayse.pm
subparse_with_kakasi
{
  my ( $self, $file, $dcount, $mcount ) =@_;
  
   # This is used for Japanese support
   # require Encode; <-- コメントアウトする
   require Jcode; #  <-- 追加
   
   # This is userd to parse Japanese
   require Text::Kakasi;
   ...
   while( <KAKASI_IN> ){
       my $kakasi_out;
       $kakasi_out = Text::Kakasi::do_kakasi($_);
       #Encode::from_to($kakasi_out, "iso-2022-jp", "euc-jp"); <-- コメントアウトする
       $kakasi_out = Jcode->new(\$kakasi_out)->euc; #          <-- 追加
       print KAKASI_OUT $kakasi_out;
   }
Classifier/MailParse.pm
sub convert_encoding
{
    my ( $string, $from, $to ) = @_;
    # require Encode; <-- コメントアウトする
    require Jcode; #  <-- 追加
    
    #Encode::from_to($string, $from, $to); <-- コメントアウトする
    $string = Jcode->new(\$string)->euc; # <-- 追加(EUC-JPきめうちにしているがこれでよし)
    
    return $string;
}

1;

Postfix:http://www.postfix.org/]]+[[http://www.ijs.si/software/amavisd/|amavisd-new]]+[[http://clamav-jp.sourceforge.jp/|ClamAV]]+[[SpamAssassin:http://www.spamassassin.org

ウィルスやspamをメールサーバ側でブロックするための手法です。4) VineLinux 3.1に特化した内容を含んでいます。

db4のアップデート

amavisd-newはdb4に強く依存しています。そして、VineLinux 3.1でインストールされている db4-4.2.52-6vl3以前のdb4は、POSIX mutexのハンドリングに問題があり、amavisd-newを動作させることが出来ません。(他にもdb4に依存するもので動かなくなるものがあるようです。) この問題は2005/02/08にリリースされた db4-4.2.52-6vl3.1以降のパッケージでは修正されていますので、まず、こちらにアップデートすることからはじめなければなりません。aptを使うのであれば、次のようにすれば完了です。

# apt-get update
# apt-get upgrade

ClamAVの導入と設定

ClamAVはオープンソースのアンチ・ウィルスソフトです。もちろんメールのスキャン以外にもシステムのスキャンにも使えます。頻繁にパターンやエンジンのアップデートがされていますが、有償のアンチ・ウィルスソフトに比べてどの程度の防御能力があるのかはわかりません。

導入は、VineLinuxの場合は、VinePlusに収録されているので、aptを使えば簡単に行なうことができます。

# apt-get install clamav

導入してもそのままでは用いることは出来ません。

  1. パターンの自動アップデート
  2. daemon起動用のスクリプトの準備と登録
  3. 設定ファイルの修正

が必要になります。

cronを利用して毎日アップデートするのが理想的でしょう。/etc/cron.daily/freshclam.sh というファイルを以下の内容で作成し、実行パーミッションを与えてください。

#!/bin/sh
/usr/bin/freshclam --daemon-notify --quiet --log=/var/log/freshclam.log

また、蓄積するログの処理のために、/etc/logrotate.d/freshclam というファイルも作っておきましょう。

/var/log/freshclam.log {
    monthly
    missingok
}

更に、/etc/freshclam.conf の中から、Exampleという行のコメントアウトをします。

7: # Comment or remove the line below
8: # Example

念のため、手で実行しておきましょう。

# freshclam

起動用のスクリプトが何故かパッケージに入っていないので、自分で作成します。こちらのページに掲載されていたものがよいでしょう。

#!/bin/bash
# chkconfig: 345 80 20
# description: Clamd daemon
. /etc/init.d/functions
prog="/usr/sbin/clamd"
prog_base="$(basename ${prog})"
prog_config_file="/etc/clamd.conf"
RETVAL=0

case "$1" in
  start)
    action $"Starting ${prog_base}:" ${prog} -c ${prog_config_file}
    RETVAL=$?
    echo
    ;;
  stop)
    echo $"Shutting down ${prog_base}"
    killproc ${prog_base}
    RETVAL=$?
    echo
    ;;
  status)
    status $"${prog_base}"
    RETVAL=$?
    ;;
  restart)
    $0 stop
    $0 start
    RETVAL=$?
    ;;
  reload)
    pid=`pidofproc ${prog_base}`
    kill -USR2 ${pid}
    RETVAL=$?
    ;;
  *)
    echo "Usage: $0 {start|stop|status|restart|reload}"
    exit 1
esac

exit $RETVAL

/etc/init.d/clamd 作成したら、chkconfig でちゃんと毎回起動されるように設定しましょう。

# chkconfig on clamd
# chkconfig --list clamd
clamd           0:off   1:off   2:off   3:on    4:on    5:on    6:off

/etc/clamd.confを正しく設定しなければ、clamdは動作しません。以下、主な変更点を。

8行目の Example をコメントアウトします。(してないとclamdは起動しません。)

7: # Comment or remove the line below
8: # Example

14行目のログファイルの指定します。(ログをとらないなら何もしなくて構いません。)

13: # Default: disabled
14: LogFile /var/log/clamav.log

72行目のUNIXドメインソケットの指定を変更します。(amavisd-newにあわせます。)

71: # Default: disabled
72: LocalSocket /var/run/clamav/clamd

このとき、/var/run/clamavは存在していないはずなので、このディレクトリを作成します。 所有者は root で、パーミッションは 0755 でいいと思います。

# mkdir /var/run/clamav

ここまで来たら、/etc/init.d/clamd を使って起動してみます。

# /etc/init.d/clamd start

amavisd-newの導入と設定

amavisd-newは、メールを受け取り、SpamAssassinやClamAVに流して、メールのフィルタリングを行なうIFを司ります。利用に当たっては、perlとdb4および、かなりの数のモジュールが必要になります。

必要な、perlモジュールは、こちらから入手できる、日本語化パッケージを展開してできる、amavisd_install.shを実行することで、自動的にインストールされます。(但し、CPANモジュールが利用可能な状態になっている必要があります。)

db4については、先に書いたように、必ず4.2.52-6vl3.1以降にアップグレードしてある必要がありますのでご注意ください。これをしないと、amavisdが起動しないためメールを受信できないような状態になってしまう恐れがあります。ご注意ください。

インストールがすんだら、次の作業をします。

  1. /etc/amavisd.confの修正
  2. /etc/init.d/amavisd のシステムへの登録
  3. 通知用aliaseの追加
  4. 起動

'@bypass_*checks_maps'設定を外します。コメントアウトしておかないとこれらの機能はバイパスされてしまいますので必ずコメントアウトしてください。

10: # ウィルスチェックをしないときにコメントを外す
11: # @bypass_virus_checks_maps = (1);
12:
13: # スパムチェックをしないときにコメントを外す
14: # コメントにする場合はMail:SpamAssassinが必要です
15: # @bypass_spam_checks_maps  = (1);

自分のホスト名とドメイン名の設定

24: 自分のドメインを設定(必ず設定)
25: $mydomain = '自分のドメイン名'; # a convenient default for other settings
...
117: # OTEHR MORE COMMON SETTINGS (defaults may suffice):
118: # ホスト名のFQDNを記入,通常はメールサーバ名(必ず設定)
119: $myhostname = '自分のホスト名(FQDNで)';

こちらは、はじめから /etc/init.d/amavisdがインストールされているはずなので、単に有効にするだけです。

# chkconfig amavisd on
# chkconfig --list amavisd
amavisd         0:off   1:off   2:off   3:on    4:on    5:on    6:off
#

/etc/aliases に、通知用のaliasであるvirusalertおよびspamalertを追加します。

virusalert: root
spamalert: root

必要に応じて、root以外のユーザや或いはメーリングリストなどを定義してもいいでしょう。 設定が済んだら、aliaseの登録をPostfixに通知します。

# newaliases

設定がうまくいっているか、或いはモジュールなどの不足がないかどうかを確かめるために、テスト起動してみましょう。 テスト起動するときに、foregroundを指定することで、エラーメッセージなどを画面に出すことができ、問題があればそれを容易に発見できます。

# /usr/sbin/amavisd -c /etc/amavisd.conf foreground

エラーを出さずに起動に成功したら、Ctrl+C で止め、改めて、/etc/init.d/amavisdを使って起動します。今度はバックグラウンドで動作しますので、すぐにプロンプトに戻ってきます。

# /etc/init.d/amavisd start
Starting amavisd: [ Ok ]
#

以上で、amavisd-newの設定まで完了です。

Postfixの設定の変更

Postfixの設定は、content_filterの設定をすることと、amavisdを利用するトランスポートの定義をすることの二点になります。修正すべきファイルは /etc/postfix/main.cf と /etc/postfix/master.cf です。変更に失敗すると、メールの受信が出来ない状態になりますから、この二つのファイルは必ずバックアップを取ってから作業を始めるようにしてください。

次の二つのサービスをmaster.cfに追加します。追加する場所はファイルの末尾でいいでしょう。 改行は適宜。smtp-amavisは、postfixからamavisdへの渡し口で、localhost:10025は戻り口になります。

#
# check virus/spam with amavis + SpamAssassin + ClamAV
#
smtp-amavis     unix    -       -       n       -       2       smtp
  -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
127.0.0.1:10025 inet    n       -       n       -       -       smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks=127.0.0.0/8
  -o strict_rfc821_envelopes=yes
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000

次の内容を、ファイルの末尾に追加してください。

# for amavisd-new
content_filter=smtp-amavis:[127.0.0.1]:10024

動作テスト

  1. 通常のメールの送受信が出来るか
  2. リレーアクセスなど、不正アクセスを排除できているか
  3. spamメールや、ウィルスメールを正しく除去できているか

を確かめます。

送信制限

ローカルのユーザによるメールの送信に制限をかける必要があることがあるかと思う。例えばhttpdを実行しているユーザに、無制限のメール送信を許すと、万一、ユーザの設置している、或いはサービスとして提供しているCGIなどに何らかの問題があった場合に、SPAMのランチャーとして利用されかねないので、ローカルへのメール以外を禁止するなどは、安全のために必要な措置だと思う。

ローカルのユーザによる送信に制限をかけたい場合に、postfixでは、check_sender_accessなどのパラメータを smtpd にかけて行なう。しかし、この方法は、メールがローカルから直接pickupに送り込まれた場合には機能しない。5)メールの送信に制限をかける方法に関する記述は多いが、実は、この点が見過ごされているものが多い。制限がうまく行ったり行かなかったりするのは、大体、この、メールの送り出しにSMTPを使っているか否かによって分かれていると推測される。/var/log/maillogを見て、メールがpostfix/pickupから始まっている場合には、多くのサンプルの示す方法では、制限を実現できないと言うことに留意する必要がある。多くの場合、ローカルのユーザIDで、特定のプロセスを動かすために作られたものは、メールを直接sendmailにたたき込む場合がほとんどだと思われるので、この種のユーザへの制限には、ベツの方法が必要になる。

幸いに、amavis-newのために、pickup が拾い出したメールを、amavisに流し、戻って来たものを、127.0.0.1:10025でsmtpdが受け取るように設定しているので、この段階で、ローカルユーザに対する送信制限を実現することが出来る。

以下に、ユーザ apacheに対して、リモートへのメール送信を禁止する例を示す。ローカルへのメール送信を許可するのは、サーバからのエラーレポートなどを受け取るためである。

main.cf

# rules for master.cf
check_local_only = check_recipient_access hash:/etc/postfix/local_domains,reject
check_sender_restriction = check_sender_access hash:/etc/postfix/restricted_senders

master.cf

127.0.0.1:10025 inet    n       -       n       -       -       smtpd
 -o content_filter=
 -o local_recipient_maps=
 -o relay_recipient_maps=
 -o smtpd_restriction_classes=local_only
 -o local_only=${check_local_only}
 -o smtpd_client_restrictions=
 -o smtpd_helo_restrictions=
 -o smtpd_sender_restrictions=${check_sender_restriction}
 -o smtpd_recipient_restrictions=permit_mynetworks,reject
 -o mynetworks=127.0.0.0/8
 -o strict_rfc821_envelopes=yes
 -o smtpd_error_sleep_time=0
 -o smtpd_soft_error_limit=1001
 -o smtpd_hard_error_limit=1000

/etc/postfix/local_domains

wildtree.jp    OK

/etc/postfix/restricted_senders

apache@wildtree.jp   local_only

以上のファイルの作成/変更をしたら、以下のコマンドを実行するのを忘れずに。

# postmap /etc/postfix/local_domains
# postmap /etc/postfix/restricted_senders
# /etc/init.d/postfix reload


VineLinuxに関して へ戻る。

1)
~/.procmailrcの振り分け先の指定から末尾の'/'を除去すれば、MH形式にすることもできます。
2)
末尾の #araki は自分のアカウントで置き換えること。
3)
spamd が起動しているなら、/usr/bin/spamassassinの代わりに/usr/bin/spamcが利用できる。
4)
こちらを参考にさせていただきました。
5)
ローカルのメール配信には、一般的にはSMTPが使われない。が、MUAによってはローカルでもSMTPでアクセスしている可能性がある。このあたりはMUA次第。