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 ...
# 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
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-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の再構築も行ってみたところ、どうやらうまくテストもパスしたので、再び利用できるようになったものと思います。
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;
ウィルスやspamをメールサーバ側でブロックするための手法です。4) VineLinux 3.1に特化した内容を含んでいます。
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はオープンソースのアンチ・ウィルスソフトです。もちろんメールのスキャン以外にもシステムのスキャンにも使えます。頻繁にパターンやエンジンのアップデートがされていますが、有償のアンチ・ウィルスソフトに比べてどの程度の防御能力があるのかはわかりません。
導入は、VineLinuxの場合は、VinePlusに収録されているので、aptを使えば簡単に行なうことができます。
# apt-get install clamav
導入してもそのままでは用いることは出来ません。
が必要になります。
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は、メールを受け取り、SpamAssassinやClamAVに流して、メールのフィルタリングを行なうIFを司ります。利用に当たっては、perlとdb4および、かなりの数のモジュールが必要になります。
必要な、perlモジュールは、こちらから入手できる、日本語化パッケージを展開してできる、amavisd_install.shを実行することで、自動的にインストールされます。(但し、CPANモジュールが利用可能な状態になっている必要があります。)
db4については、先に書いたように、必ず4.2.52-6vl3.1以降にアップグレードしてある必要がありますのでご注意ください。これをしないと、amavisdが起動しないためメールを受信できないような状態になってしまう恐れがあります。ご注意ください。
インストールがすんだら、次の作業をします。
'@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の設定は、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
を確かめます。
ローカルのユーザによるメールの送信に制限をかける必要があることがあるかと思う。例えば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に関して へ戻る。