ページへ戻る

− Links

 印刷 

SPAM対策とウィルスチェックで悩む のソース :: Nest Of Hawk

xpwiki:SPAM対策とウィルスチェックで悩むのソース

« Prev[3]  
[[Gentoo Linuxな生活/サーバ設定関連]]

*SPAMとウィルスメール [#y225db96]
はっきり言って迷惑この上ないこの2つ。なんとか撃退できないものかと皆さん考えますわな。で、うちでもサーバサイドで何とかならんものかと考えておりました。んで、PostfixとCyrus-imapdの設定を調べてあれこれやっていたところ、あるじゃないですか。便利なものが。

*ウィルスチェックソフト [#n089bf9c]
ウィルスチェックも結構個人利用に関しては便利なものがあります。

-[[H+BEDV:http://www.hbedv.com/download/download.htm]]
-[[Clam AntiVirus:http://sourceforge.net/projects/clamav/]]

ほかにもあるのですが、一応この2つに着目してみました。H+BEDVは、有償ソフトなのですが、個人利用に限り無料。1年間有効なキーが送られて参りまして、1年更新で使用できます。~
Clam AntiVirusはGPLライセンスなフリーのウィルススキャンソフト。で、実はどっちも試してみたのですが、私はClam AvtiVirusを選択いたしました。というのも、H+BEDVがいつの間にか自由に更新ができづらくなってしまいましてね…

**インストール [#gd4dafca]
 # emerge clamav
**設定 [#h8b26d83]
 # rc-update add clamd default
意外に簡単でした♪


*SPAM対策 [#j0481b5a]
SPAM対策については、spamassassinという便利なツールがありました。これの便利なところは、
-SPAMパターンの登録ができること
-サーバに問い合わせ最新SPAMパターンと比較できること
-ベイズフィルタという学習フィルタを持っていて、後でSPAMとそうでないメールを比較させて賢くしていけること
-様々なプラグインが用意されていること

いや、至れりつくせりですね。

また、最近は他の手段もあり、
:greylisting|whitlist(信頼できるホストの一覧)、blacklist(信頼できないホストの一覧)というSPAMホストのリストの他に、greylistという、中間を用意する。具体的には、初めてメール転送を依頼してきたホストは、greylistに登録し、一定時間接続をRejectする。真に自分にメールを送ってくるホストは、リトライしてくるはず。SPAMなどツールで送信するホストは、一旦はじかれるとリトライしてこないので、SPAM対策になる
:SPF(Sender Policy Framework)|DNSのTXTフィールドに、ある送信ドメインを信頼してもらう場合、どのDNSレコードを信頼してもらうかを記載しておく。メールを受信したMTAは、そのDNSフィールドを参照し、信頼できるホストからのメールかどうかを判定する

いろいろと対抗策が増えているんですね~。ちょっと設定に凝ってみようと思いまする。

*postfixとの連動 [#w117632b]
Postfixは、いろいろと便利な機能を持っており、content_filterという外部フィルターを通してメールを配送する機能を持っております。これを利用します。そこで、このcontent_filterを使って以下のような方法があります。
-ウィルス対策
--content_filterに直接AntiVirusソフトを導入してやる。
--AMaViSというフロントエンドを導入してやる。
-SPAM対策
--Procmail+spamassassin
--Postfixと直接spamassasin

チョイスポイントが何かが重要です。
-ウィルス対策にAMaViSをフロントエンドで導入してあげると、ウィルスチェックソフトにPostfixが依存しなくなる事がいい点です。
-SPAM対策では、Procmail&spamassassinだと、各ユーザサイドにてSPAM選択ルールが作れます。Postfixに直接spamassassinだと、メール配信時にSPAMチェックが出来るので、ユーザ設定の手間がない。その代わりユーザによって、柔軟なカスタマイズが難しくなる。

といえます。
#ref(mail.JPG,left,around);
で、私は何を選んだか。AMaViSフロントエンド導入&Postfixと直接spamassassinです。だって、ユーザってみんながみんな賢いわけではないから、使いこなせなさそうだし、管理者がしっかりやれば、結構賢くチューニングできるはずですからね。図に示すとこんな感じ
#img(,clear);

*AMaViS導入 [#g7ee622b]
AMaViSとは、ちょっと触れましたが、ウィルススキャンソフトとのフロントエンドをつかさどってくれるインタフェースです。Postfixなんかと結構相性がよいので、Postfixとウィルススキャンソフトの間にかませるととっても良いと言うことです。で、このAMaViSも種類がありまして、
:AMaViS-perl|perlフロントエンド。コマンドライン実行される
:AMaViS-new|perlフロントエンドだが、Daemon実行される。AntiVirusとspamassassinの双方のフロントエンドになれる
:AMaViS-ng|AMaViS-perlの機能拡張版。

なんでこう亜流がいっぱいあるかなぁ。調べた情報がいい加減でかなり悩みました。で、私はAMaViS-newを選びました。それは、
-Portageにあった
-上に書いた運用方針に一致した

というわけで。
**AMaViS-newインストール [#m39a0a9d]
 emerge -b amavis-new

一発。便利なことに、これをやるとspamassassinもインストールされますので、このままでよしにしました。
**AMaViS-newの設定 [#sd1380dd]
/etc/amavisd.confを開きます。で、コメントを参考にせこせことやっていきます。が、ほとんどデフォルトで問題なし。変えたところだけピックアップすると
 $mydomain = 'example.jp';      ←自分のドメインに変更
 #検知されたメールの最終行き先
 #     D_DISCARD:メールは送信されず、送信者に通知もしない
 #     D_REJECT:メールは送信されず、送信者に送り返される
 #     D_BOUNCE;メールは送信されず、送信者に通知を入れる
 #     D_PASS:メールを通常に送信する
 $final_virus_destiny      = D_DISCARD;  
 $final_banned_destiny     = D_DISCARD;
 $final_spam_destiny       = D_PASS;  
 $final_bad_header_destiny = D_PASS;  
 #ウィルススキャナーの設定。いろいろ書いてあるので、使うAntiVirに該当するものを
 #コメントアウトすればいい
 @av_scanners = (
 # ### http://www.clamav.net/
 ['ClamAV-clamd',
   \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
   qr/\bOK$/, qr/\bFOUND$/,
   qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],


と、こんなもん。で、AMaViSdを起動します。
 /etc/init.d/amavisd start

**Postfixとの連動設定 [#m8e0ebca]
次はPostfixとの連動です。まず、main.cfに以下の行を追加。
 # Setting for Virus filter
 content_filter = smtp-amavis:[127.0.0.1]:10024

さらにmaster.cfに以下の行を追加
 smtp-amavis unix -      -       n       -       2       smtp
    -o smtp_data_done_timeout=1200
    -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

で、Postfixを再起動します。
 /etc/init.d/postfix reload

*では、実験! [#e8fbff92]
まず、テストSPAMメールを食わせてみます。送られてきたSPAMをサーバのメールに流し込んでみますと
 Return-Path: <norply@hotmail.com>
                        .
                        .
                        .
 X-Spam-Status: Yes, hits=15.6 tagged_above=3.0 required=6.3 
    tests=ACT_NOW_CAPS, DOMAIN_4U2, EARNINGS, FORGED_HOTMAIL_RCVD2,
     FORGED_MUA_OUTLOOK, FORGED_OUTLOOK_TAGS, HTML_70_80, HTML_FONTCOLOR_BLUE,
     HTML_FONTCOLOR_GREEN, HTML_FONTCOLOR_RED, HTML_FONTCOLOR_UNKNOWN,
     HTML_FONTCOLOR_UNSAFE, HTML_FONT_BIG, HTML_FONT_INVISIBLE, HTML_MESSAGE,
     HTML_MIME_NO_HTML_TAG, HTML_TAG_BALANCE_BODY, HTML_TAG_EXISTS_TBODY,
     MIME_HTML_ONLY, THIS_AINT_SPAM, X_MSMAIL_PRIORITY_HIGH, X_PRIORITY_HIGH
 X-Spam-Level: ***************
 X-Spam-Flag: YES

と、ヘッダにSpamチェックが入ります。これを振り分けルールに入れてやれば、SPAMが隔離できるという寸法です。いや便利。~


*SpamAssassinの設定 [#c7e7143e]
以下は、設定変更行ったら、amavisd_newを再起動するのを忘れないでね!

**ベイズフィルタの学習 [#q052a4f1]
先ほど、SpamAssassinには自動学習機能があるといいました。ですので、収集されたメールから、Spam学習ルールを作る自動化シェルスクリプトを作りました。

さて、2021年に、ベイズフィルタのオプションに、berkdbが使用できなくなりました…ベイズ学習データを保存するための手段DBIも、GentooのメインストリームでMaskedになっちまいました。
なので、MySQL(MariaDB)に学習データを保存するように設定してみます。

***DBを作る [#o7ae4091]
MariaDBが起動していると仮定して、以下を設定します。

 # cp /usr/share/doc/spamassassin-3.4.5/bayes_mysql.sql.bz2 ~
 # cd ~
 # bunzip2 bayes_mysql.sql.bz2
 # mysql -u root -p
 mysql> CREATE DATABASE sa_bayes;
 mysql> USE sa_bayes;
 mysql> SOURCE bayes_mysql.sql;
 mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON sa_bayes.* TO 'DBアクセスユーザー名' IDENTIFIED BY 'DBアクセスパスワード';
 mysql> FLUSH PRIVILEGES;

***SpamAssassin側の設定 [#q643cce5]

/etc/mail/spamassassin/local.cfを、以下の設定を変更(または追加)します
 use_bayes          1
 bayes_auto_learn   1
 bayes_auto_expire  1
 
 bayes_store_module Mail::SpamAssassin::BayesStore::MySQL
 bayes_sql_dsn      DBI:mysql:sa_bayes:127.0.0.1:3306
 bayes_sql_username 'DBアクセスユーザー名'
 bayes_sql_password 'DBアクセスパスワード'

これで受信時の自動学習及びベイズフィルタの使用を定義。ア~ンドamavisが溜め込むベイズフィルタをデフォルトルールとする事にしたです。そりで、
 HOME=/var/amavis
 find /var/spool/imap -type d -name SPAM -exec /usr/bin/sa-learn -- username=amavis --spam {} \;

というわけで、imapフォルダ下にあるSPAMって名前のフォルダ下にあるSPAMメールを毎日自動学習するようにCRONシェルを設定して、おしまいでっす。

さらに、
 sa-learn - username=amavis --ham <SPAMでないメールがあるディレクトリ>
と指定すると、SPAMでないメールも学習してくださいます。

**sa-updateの設定 [#d2bc7662]
もともとspamassassinは、バージョンアップ毎に更新したルールをパッケージに付与していまいたが、これだとイタチごっこに対する対応が遅い、ということで、spamassassin 3以上になると、NWから定期的に更新したルールを取ってこれるようになりました。これにはsa-updateというツールを使用します。
まず、sa-updateを使用するのに、GPGのキーファイルを作成してやります。例えば/foo/var.keysという名前で、
 26C900A46DD40CD5AD24F6D7DEE01987265FA05B
 5244EC45
こんな中身のファイルを作ってやります。テキストでそのまんまね。で、以下のコマンドをcronなどで定期的に実行してやって。
 /usr/bin/sa-update --gpgkeyfile /foo/var.keys
これで、/var/lib/spamassassin配下に、定期的にアップデートファイルが作られますのねで。

**DCCの設定 [#bb0aedb2]
手元にあるSPAMだけだと、パターン数が少なすぎて、すべてをマッチさせるのは難しいもの。このために、NWのサーバに貯められているSPAMパターンと照合するという手があります。そのいくつかに、DCC,Pyzor,Razor等があります。今回私はDCCを選択いたしました。どうもDCCが一番精度がいいらしい?という評判だったので。で、DCCを導入いたします。
***DCCDのインストール [#p25ea2b2]
まず/etc/portage/package.keywordsに mail-filter/dcc を追加いたします。んで
 # emerge dcc
/etc/dcc/dcc_confを編集いたします。以下に特に注意して。
 DCCD_ENABLE=off
 DCCIFD_ENABLE=on
さらに、/etc/init.d/dccにバグがあるので、以下を編集してやります。
 if [[ "${DCCIFD}" != "on" ]]
                ↓
 if [[ "${DCCIFD_ENABLE}" != "on" ]]
で、DCCを起動してやってください。
 # rc-update add dcc default
 # /etc/init.d/dcc start
次に、/etc/spamassassin/v310.preを編集します。
 # loadplugin Mail::SpamAssassin::Plugin::DCC
                               ↓
 loadplugin Mail::SpamAssassin::Plugin::DCC
      コメントを外してやる
そして、/etc/spamassassin/local.cfに、以下を追加してやってください。
 # DCC Configuration
 use_dcc 1
 dcc_home /var/dcc
 dcc_path /usr/bin/dccproc
 add_header all  DCC _DCCB_: _DCCR_
以上でっす

**SPFの設定 [#ve425015]
spamassassinにSPFを設定するのは楽ちんです。/etc/spamassassin/init.preを以下のように編集します。
 # SPF - perform SPF verification.
 #
 #loadplugin Mail::SpamAssassin::Plugin::SPF
                   ↓
 loadplugin Mail::SpamAssassin::Plugin::SPF
         コメントを外す
以上でっす。

* Postfix側の設定[#p8bce71c]
spamassassinだけでは、受信したメールをSPAMと分類するだけ。入り口であるPostfixにて怪しいものを拒否する手があります。先程述べたgreylistingですが、これをPosftix上で実現してくれるツールが、Postgreyです。

**Postgrey [#vba5c072]
***インストール [#xbcc195d]
 # emerge postgrey
***設定 [#f25ff92b]
/etc/conf.d/postgreyに、設定を追加いたします。重要なのは以下ですかね
 # 初受信のサーバを、何秒受信拒否するか。デフォルトは5分
 POSTGREY_DELAY=300
 # postgreyへのオプション指定。--max-ageは、受信許容したサーバのキャッシュを何日で消去するか。デフォルトは30日
 POSTGREY_OPTS="--max-age=30"
そしてpostgreyを起動してやります。
 # rc-update add postgrey default
 # /etc/init.d/postgrey start
で、最後にpostfixの設定。/etc/postfix/main.cfに以下の設定を追記します。
 smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated, 
      reject_unauth_destination,check_policy_service inet:127.0.0.1:10030
後ろにある、check_policy_service inet:127.0.0.1:10030が重要です。smtpd_recipient_restrictionsは項目の順序も重要ですので、気をつけてね!で、最後に
 # /etc/init.d/postfix reload

**バックアップサーバ側の設定 [#ra8dcbd0]
今までは、メインサーバのpostfixがダウンしてしまった場合、上位のDDNS側で、エラーではじかれたメールをプロバイダに転送してくれるよう設定してました。でも、これがSPAM大量増産の大本!せっかくこちらのPostfixでエラーで弾かれても、全部プロバイダに転送されちゃう。そのため、このプロバイダへの転送を止めちゃえば、SPAMも減るってもの。
しかし、もしもメインサーバがダウンした場合、外部から送信されてきたメールが着信せず、消えてしまいかねないので、それも困る。このためバックアップサーバが受信して、キューイングしておいてくれるように設定しておきます。
メインサーバのpostfixとの設定の違いは
-受信したら、自分のドメインに該当するメールアドレスのみ、メインサーバのpostfixへ転送する
-上記の設定なので、amavisに転送する設定は行わない

その他の設定(SMTP-AUTH/postgrey)は有効としておきます。このため、メインサーバとの差分として、amavis設定を削除し、転送用設定を付け加えときます。/etc/postfix/main.cfに以下を追加します。
 transport_maps = hash:/etc/postfix/transport
さらに、/etc/postfix/transportというファイルを作り、ドメインと転送先をそれぞれ指定。
 example.net smtp:[XXX.XXX.XXX.XXX]
 .example.net smtp:mail.server
example.netは、MXレコードを引かずに([]を付けるとMXレコードを参照しない)IPアドレスXXX.XXX.XXX.XXXに転送する。.example.net(XXX.example.net等)はmail.serverに転送する、という設定。で、
 # postmap transport
を実行して、ハッシュマップを作ります。最後に
 # /etc/init.d/postfix reload
で完成。

ちなみに、このバックアップサーバは、メールを受信したらキューイングしてとっておいてくれます。マスタサーバが生き返ったら、再送してくれるありがたいサーバとなります。マスタサーバが死んでる間は、こいつに貯めておいてもらえば、わざわざプロバイダに転送してもらわなくて済むという寸法。

*結果 [#kfe32905]
劇的にSPAMメールが減りました!それまでは1日に300~400通近いSPAMが、1/6以下に減りました。なぜSPAMが0近くにならないかというと、プロバイダのメールに着信するSPAMは、無条件で受信しちゃうから…しかし、そのメールはspamassassinにてSPAMに分類されます。bayesフィルタ、ルール、DCC、SPFを噛ますことで、SPAM認識率が相当向上しました。これでしばらくは安心でしょう♪

« Prev[3]