====== spam対策 ====== ===== SpamAssassin:http://www.spamassassin.org ===== ==== procmail を使った振り分け ==== procmailを使って、Maildirへメールを振り分けながら、spamを除去する方法について触れます。((~/.procmailrcの振り分け先の指定から末尾の'/'を除去すれば、MH形式にすることもできます。)) "~/.forward"に、次のように記述します。((末尾の #araki は自分のアカウントで置き換えること。)) "|IFS=' ' && p=/usr/bin/procmail && test -f $p && exec $p -Yf-||exit 75 #araki" 次に、~/.procmailrc をつくり、次のように記述します。((spamd が起動しているなら、/usr/bin/spamassassinの代わりに/usr/bin/spamcが利用できる。)) 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以降へのアップグレード ==== [[http://www.spamassassin.org|SpamAssassin]]をアップグレードしたら、user_prefsは2.6のものを利用できなくなります。古いuser_prefsをそのまま使おうとすると、errorを起こし、メールのスキャンが出来なくなりますので、必ず新しく作り直してください。 作り直すにあたっては、/usr/share/spamassassin/user_prefs.templateを使って、必要な変更を加えるか、或いは、[[http://www.yrex.com/spam/spamconfig.php|設定ツール]]を使って、生成するかのいずれかの方法がお勧めです。特に後者は、エントリボックスに必要な情報を入力するだけの簡単操作ですので、非常に便利です。 生成したファイルを、古い 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に問題があったようです。([[http://popfile.sourceforge.net|POPFile]]には問題はなかったようです。) CPANモジュールを利用してインストールしようとすると、DBD::SQLiteのテストケースのうち、データの挿入で必ず失敗していました。どうもこれが原因で学習結果をデータベースに登録できなくなっていたようです。 今回、0.21.2がリリースされたのを受けて、DBI/DBD-SQLiteの再構築も行ってみたところ、どうやらうまくテストもパスしたので、再び利用できるようになったものと思います。 ==== POPFile:http://popfile.sourceforge.net ==== perl 5.6では、Encode.pmが動作しないために、そのままPOPFileを利用することが出来ません。ただし、Jcode.pmを導入し、二箇所変更を加えることで動作させることが出来ます。 変更するファイルは、 * Classifier/Bayes.pm * Classifier/MailParse.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( ){ 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をメールサーバ側でブロックするための手法です。(([[http://tsuttayo.sytes.net/postfix/clamav/|こちら]]を参考にさせていただきました。)) [[http://www.vinelinux.org|VineLinux 3.1]]に特化した内容を含んでいます。 ==== db4のアップデート ==== amavisd-newはdb4に強く依存しています。そして、[[http://www.vinelinux.org|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の導入と設定 ==== [[http://clamav-jp.sourceforge.jp/|ClamAV]]はオープンソースのアンチ・ウィルスソフトです。もちろんメールのスキャン以外にもシステムのスキャンにも使えます。頻繁にパターンやエンジンのアップデートがされていますが、有償のアンチ・ウィルスソフトに比べてどの程度の防御能力があるのかはわかりません。 導入は、VineLinuxの場合は、VinePlusに収録されているので、aptを使えば簡単に行なうことができます。 # apt-get install clamav 導入してもそのままでは用いることは出来ません。 - パターンの自動アップデート - daemon起動用のスクリプトの準備と登録 - 設定ファイルの修正 が必要になります。 * パターンの自動アップデート 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 * daemon起動用のスクリプトの準備と登録 起動用のスクリプトが何故かパッケージに入っていないので、自分で作成します。[[http://tsuttayo.sytes.net/postfix/clamav/|こちらのページ]]に掲載されていたものがよいでしょう。 #!/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の導入と設定 ==== [[http://www.ijs.si/software/amavisd/|amavisd-new]]は、メールを受け取り、SpamAssassinやClamAVに流して、メールのフィルタリングを行なうIFを司ります。利用に当たっては、perlとdb4および、かなりの数のモジュールが必要になります。 必要な、perlモジュールは、[[http://marijuana.ddo.jp/|こちら]]から入手できる、日本語化パッケージを展開してできる、amavisd_install.shを実行することで、自動的にインストールされます。(但し、CPANモジュールが利用可能な状態になっている必要があります。) db4については、先に書いたように、必ず4.2.52-6vl3.1以降にアップグレードしてある必要がありますのでご注意ください。これをしないと、amavisdが起動しないためメールを受信できないような状態になってしまう恐れがあります。ご注意ください。 インストールがすんだら、次の作業をします。 - /etc/amavisd.confの修正 - /etc/init.d/amavisd のシステムへの登録 - 通知用aliaseの追加 - 起動 * /etc/amavisd.confの修正 '@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 のシステムへの登録 こちらは、はじめから /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 # * 通知用aliaseの追加 /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の設定の変更 ==== [[http://www.postfix.org/|Postfix]]の設定は、content_filterの設定をすることと、amavisdを利用するトランスポートの定義をすることの二点になります。修正すべきファイルは /etc/postfix/main.cf と /etc/postfix/master.cf です。変更に失敗すると、メールの受信が出来ない状態になりますから、この二つのファイルは必ずバックアップを取ってから作業を始めるようにしてください。 * 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 * main.cfの変更 (content_filterの設定) 次の内容を、ファイルの末尾に追加してください。 # for amavisd-new content_filter=smtp-amavis:[127.0.0.1]:10024 ==== 動作テスト ==== - 通常のメールの送受信が出来るか - リレーアクセスなど、不正アクセスを排除できているか - spamメールや、ウィルスメールを正しく除去できているか を確かめます。 ==== 送信制限 ==== ローカルのユーザによるメールの送信に制限をかける必要があることがあるかと思う。例えばhttpdを実行しているユーザに、無制限のメール送信を許すと、万一、ユーザの設置している、或いはサービスとして提供しているCGIなどに何らかの問題があった場合に、SPAMのランチャーとして利用されかねないので、ローカルへのメール以外を禁止するなどは、安全のために必要な措置だと思う。 ローカルのユーザによる送信に制限をかけたい場合に、postfixでは、check_sender_accessなどのパラメータを smtpd にかけて行なう。しかし、**この方法は、メールがローカルから直接pickupに送り込まれた場合には機能しない。**((ローカルのメール配信には、一般的にはSMTPが使われない。が、MUAによってはローカルでもSMTPでアクセスしている可能性がある。このあたりはMUA次第。))メールの送信に制限をかける方法に関する記述は多いが、実は、この点が見過ごされているものが多い。制限がうまく行ったり行かなかったりするのは、大体、この、メールの送り出しに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に関して]] へ戻る。