Gentoo Linuxな生活​/サーバ設定関連

SPAMとウィルスメール anchor.png

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

Page Top

ウィルスチェックソフト anchor.png

ウィルスチェックも結構個人利用に関しては便利なものがあります。

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

Page Top

インストール anchor.png

# emerge clamav
Page Top

設定 anchor.png

# rc-update add clamd default

意外に簡単でした♪

Page Top

SPAM対策 anchor.png

SPAM対策については、spamassassinという便利なツールがありました。これの便利なところは、

  • SPAMパターンの登録ができること
  • サーバに問い合わせ最新SPAMパターンと比較できること
  • ベイズフィルタという学習フィルタを持っていて、後でSPAMとそうでないメールを比較させて賢くしていけること
  • 様々なプラグインが用意されていること

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

また、最近は他の手段もあり、

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

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

Page Top

postfixとの連動 anchor.png

Postfixは、いろいろと便利な機能を持っており、content_filterという外部フィルターを通してメールを配送する機能を持っております。これを利用します。そこで、このcontent_filterを使って以下のような方法があります。

  • ウィルス対策
    • content_filterに直接AntiVirusソフトを導入してやる。
    • AMaViSというフロントエンドを導入してやる。
  • SPAM対策
    • Procmail+spamassassin
    • Postfixと直接spamassasin

チョイスポイントが何かが重要です。

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

といえます。

mail.JPG

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

Page Top

AMaViS導入 anchor.png

AMaViSとは、ちょっと触れましたが、ウィルススキャンソフトとのフロントエンドをつかさどってくれるインタフェースです。Postfixなんかと結構相性がよいので、Postfixとウィルススキャンソフトの間にかませるととっても良いと言うことです。で、このAMaViSも種類がありまして、

AMaViS-perl
perlフロントエンド。コマンドライン実行される
AMaViS-new
perlフロントエンドだが、Daemon実行される。AntiVirusとspamassassinの双方のフロントエンドになれる
AMaViS-ng
AMaViS-perlの機能拡張版。

なんでこう亜流がいっぱいあるかなぁ。調べた情報がいい加減でかなり悩みました。で、私はAMaViS-newを選びました。それは、

  • Portageにあった
  • 上に書いた運用方針に一致した

というわけで。

Page Top

AMaViS-newインストール anchor.png

emerge -b amavis-new

一発。便利なことに、これをやるとspamassassinもインストールされますので、このままでよしにしました。

Page Top

AMaViS-newの設定 anchor.png

/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
Page Top

Postfixとの連動設定 anchor.png

次は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
Page Top

では、実験! anchor.png

まず、テスト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が隔離できるという寸法です。いや便利。

Page Top

SpamAssassinの設定 anchor.png

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

Page Top

ベイズフィルタの学習 anchor.png

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

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

Page Top

DBを作る anchor.png

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;
Page Top

SpamAssassin側の設定 anchor.png

/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でないメールも学習してくださいます。

Page Top

sa-updateの設定 anchor.png

もともと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配下に、定期的にアップデートファイルが作られますのねで。

Page Top

DCCの設定 anchor.png

手元にあるSPAMだけだと、パターン数が少なすぎて、すべてをマッチさせるのは難しいもの。このために、NWのサーバに貯められているSPAMパターンと照合するという手があります。そのいくつかに、DCC,Pyzor,Razor等があります。今回私はDCCを選択いたしました。どうもDCCが一番精度がいいらしい?という評判だったので。で、DCCを導入いたします。

Page Top

DCCDのインストール anchor.png

まず/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_

以上でっす

Page Top

SPFの設定 anchor.png

spamassassinにSPFを設定するのは楽ちんです。/etc/spamassassin/init.preを以下のように編集します。

# SPF - perform SPF verification.
#
#loadplugin Mail::SpamAssassin::Plugin::SPF
                  ↓
loadplugin Mail::SpamAssassin::Plugin::SPF
        コメントを外す

以上でっす。

Page Top

Postfix側の設定 anchor.png

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

Page Top

Postgrey anchor.png

Page Top

インストール anchor.png

# emerge postgrey
Page Top

設定 anchor.png

/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
Page Top

バックアップサーバ側の設定 anchor.png

今までは、メインサーバの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

で完成。

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

Page Top

結果 anchor.png

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


Front page   Freeze Diff Backup Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 7558, today: 2, yesterday: 2
Princeps date: 2009-08-19 (Wed) 01:16:37
Last-modified: 2021-07-04 (Sun) 17:32:23 (JST) (1161d) by maruo
ページ内検索

ログイン

ユーザー名:


パスワード:





パスワード紛失

メインメニュー

サブメニュー
自宅鯖計画

Gentoo Linuxな生活

玄箱HGにGentoo格闘記

航空ショーへ行こう

モータースポーツな世界

奥深き写真の世界への誘い

我思う ゆえに我あり



携帯用QRコード