完全版: FreeBSDにSpamAssassinとClamAVを入れる

English << Japanese

新しくインストールしたまっさらなFreeBSD5.4にportsからSpamAssassinとClamAVをインストールしました。ちょうどいい機会なので手順を解説します。

この設定をすることによりFreeBSD5.4-RELEASE-p6上で SpamAssassin3.0.4 + ClamAV0.86.2 + sendmail8.13.3 という組み合わせで動くウイルスおよびspamに対して強力な選別機能を持ったメールサーバーが立ち上がることになります(2005年9月7日時点)。

以下はsendmailを使う前提で説明しています。他のMTAを使う場合には設定方法が異なるのでご注意ください。

注意:以下の全ての作業はroot権限で行ってください。

FreeBSDのインストール

FreeBSDはISOイメージを
ftp://ftp.jp.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/5.4/
から取得しCDに焼いてインストールします。CDにあるportsは古いものなのでここからはインストールしません。

OSが立ち上がったらsysinstallコマンドでConfigure(Do post-install configuration of FreeBSD ) -> Networking(Configure additional network services) -> Mailと進み Sendmail (Use sendmail)を選択します。(下の図)


/etc/rc.conf にはsendmail_enable="YES" という行が追加されます。エディタを使って直接これを追加してもかまいません。

portsは ftp://ftp.jp.freebsd.org/pub/FreeBSD/ports/ports/ports.tar.gz として最新のものをダウンロードし /usr 以下に /usr/ports/* として展開します。

そのあとアップデートのシステムcvsup-without-gui-16.1hをportsから入れます。これを使ってプログラム、ライブラリそれにカーネルを最新のものにしておきます

perl5.8を最新版にする

FreeBSD5.4に入っているperlはバージョンが5.8.6です。のちほどportupgradeを入れるときに支障になるので最新版のperl5.8.Xにしておきます。この記事を書いた時点ではperl5.8.7になりました。
cd /usr/ports/lang/perl5.8
make deinstall
make install
以下のSpamAssassinやClamAVをインストールした後だとライブラリの位置が変わってしまい動かなくなるのでそれに先立ってやる必要があります。

SpamAssassinのインストール

SpamAssassin本体です。
cd /usr/ports/mail/p5-Mail-SpamAssassin
make
make install

今後普及することも考えダイアログでSPF_QUERYにもチェックを入れます。RAZORはかなり有効だとわかっているのでこのオプションも選択します。TOOLSは何が入るのかわからないのですが入れてみました。 一度インストールすると以降はこのダイアログは出ません。

この時点で自動起動スクリプトは以下だけがあります。
# ls -l /usr/local/etc/rc.d
total 2
-r-xr-xr-x  1 root  wheel  696 Sep  2 18:01 sa-spamd.sh

spamassassin-milterのインストール

SpamAssassinとsendmail の橋渡しをするソフトです。
cd /usr/ports/mail/spamass-milter
make
make install
この時点で自動起動スクリプトは以下になります。
# ls -l /usr/local/etc/rc.d
total 4
-r-xr-xr-x  1 root  wheel   696 Sep  2 18:01 sa-spamd.sh
-r-xr-xr-x  1 root  wheel  1013 Sep  2 18:04 spamass-milter.sh

ClamAVのインストール

フリーのウイルス駆除ソフトです。
cd /usr/ports/mail/p5-Mail-ClamAV
make
make install

しばらくして出るダイアログでMILTERにチェックを入れます。一度インストールすると以降はこのダイアログは出ません。

clamd.logを書き込めないというパーミッションエラーが出るのであらかじめ空ファイルを作りオーナーをclamavにしておきます。(portsが新しくなれば修正されていてこれをやる必要は無いかもしれません)
touch /var/log/clamav/clamd.log
chown clamav /var/log/clamav/clamd.log
この時点で自動起動スクリプトは以下になります。これで全部そろいました。
# ls -l /usr/local/etc/rc.d
total 10
-r-xr-xr-x  1 root  wheel   687 Sep  2 18:17 clamav-clamd.sh
-r-xr-xr-x  1 root  wheel   722 Sep  2 18:17 clamav-freshclam.sh
-r-xr-xr-x  1 root  wheel  1066 Sep  2 18:17 clamav-milter.sh
-r-xr-xr-x  1 root  wheel   696 Sep  2 18:01 sa-spamd.sh
-r-xr-xr-x  1 root  wheel  1013 Sep  2 18:04 spamass-milter.sh

sendmailの設定

sendmailというのはメールを配送してくれるプログラム(MTA)です。FreeBSDではこのsendmail以外にPostFixとEximというMTAを選択することができますが今回は筆者の慣れたsendmailを選択しました。以下で述べる内容はsendmail以外のMTAの設定には使えません。

sendmailからSpamAssassinとClamAVを使うにはそれらとやりとりするメカニズムをsendmail.cfに記述しないとなりません。さらにはRBLを参照する定義などもsendmail.cfに記述してspam対策を行います。

sendmail.cfは通常直接編集することはなくそれを生成する元ネタファイル( .mc )を編集したあとそれを使ってsendmail.cfを生成します。

FreeBSDで設定をする場合にはその元ネタファイルはホスト名を付けて自動的に生成されます。たとえばあなたのサーバー名(ホスト名)がmail.example.jpだとすると
cd /etc/mail
make
でmail.example.jp.mcという元ネタファイルが新たに作られます。これに各種設定を追加してsendmail.cfを生成することになります。

mail.example.jp.mcというファイルは一旦作られると新たに上書きはされないので追加変更するときにはそのファイルを直接を編集してかまいません。以下ではこの名前で説明を続けます。

0)基本設定

まず自分のメールサーバーでどのようなメールアドレスの形式を受け取るかを定義します。

mail.example.jpで受け取るメールの形式が
test@example.jp
test@mail.example.jp
である場合には
/etc/mail/local-host-names
を作成しその内容を以下のようにします。(後者はホスト名と同じなので無くてもかまいません)。example.jpのDNSにあるMXの設定もこの設定と矛盾が無いことを確認してください。「どちらのメールアドレス形式であってもメールはmail.example.jpに届く」という設定にするわけです。
example.jp
mail.example.jp

さらには
/etc/mail/relay-domains
に、共通したドメイン名
example.jp
192.168.0
を記述します。二行目はNATの内側のローカルアドレス192.168.0.0-255からの送信を許可するという設定です。これを設定しないとNAT内部からメールを送ることができなくなります。(もちろんローカルアドレスが例と異なる場合にはそのアドレスにします)

以上で基本的メールの送受信を行うことができます。


1)sendmail.cfにSpamAssassinとClamAVの設定を追加
cd /etc/mail
vi mail.example.jp.mc 
として開いたファイルに以下を追加します。
INPUT_MAIL_FILTER(`spamassassin',`S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')dnl
INPUT_MAIL_FILTER(`clmilter', `S=local:/var/run/clamav/clmilter.sock, F=, T=S:4m;R:4m')dnl
define(`confINPUT_MAIL_FILTERS', `clmilter,spamassassin')dnl

2)sendmail.cfに逆引き関係の設定

逆引きできないホストから拒絶する設定をします。この設定をすると逆引きがほとんど無い中国や韓国からのspamを強力に排除してくれます。

その副作用としてまっとうな組織からのメールも拒絶されます。この設定に反対している人もおりますので、詳細は「逆引きできないホストからのメールを遮断 (2004-10-25)」をご覧ください。ここには逆引き対策した場合の例外処理についても書かれています。

逆引きの無いホストからだけを拒絶する場合にはこの設定を、それに加えて正引きと逆引きが一致しないホストも拒絶する場合にはこの設定を追加します(TABをスペースコードに置き換えないでそのまま使うこと)。

あなたが逆引きできないホストからのメールを受け取りたいのでしたらこの設定をしてはいけません。中国、韓国の不特定多数のサーバーからメールが来る可能性がある場合には同じく設定してはいけません。


3)IPベースのRBLの指定

SpamAssassinではspamと判定されてもメールは届きますがsendmailにRBL参照機能を付けると完全に拒絶されて届かなくなるのでRBLの選定には十分に注意してください。今回はいろいろあるRBLのうち下の4つを使うことにしました。
FEATURE(dnsbl,`all.rbl.jp')dnl
FEATURE(dnsbl,`list.dsbl.org')dnl
FEATURE(dnsbl,`sbl-xbl.spamhaus.org')dnl
FEATURE(dnsbl,`bl.spamcop.net')dnl
spamcop.netは日本語メールマガジンのサーバーもたびたび登録されることがあって拒絶し過ぎという話もあるので安全を考えると無くてもいいかと思います。

BLARS http://www.blars.org/errors/block.html
JAMM http://www.jammconsulting.com/policies/dnsbl.shtml
SORBS http://www.sorbs.net/
の3つについては運営方針がまずいという評判があるので使わないでください。

RBLの参照はここで定義した順番に行われます。仮に全部が完全に同じデータを持っているとすると最初のRBLで拒絶されるためそれだけが /var/log/maillog というメール配送のログに現れます。

RBLの数が多いからといって効果があるとは限りません。あなたのメールサーバーが無用に過負荷になる上に無駄なトラフィックも発生するので可能な限り少ないRBLで運用してください。しばらく運用してみてほとんど拒絶されないような場合には重複したデータを持っているRBLと判断してその分を削除してください。


この時点で mail.example.jp.mc のファイルの変更部はこのようになっています。MAILER(local)と MAILER(smtp) はすでにあったものですからこの前後に配置されることになるわけです。LOCAL_RULESETSから下は逆引きの無いホストからのメールを拒絶の定義です。


4)sendmail.cfの生成

この設定が終わったら
cd /etc/mail
make
とすると mail.example.jp.cfというファイルが生成されます。このファイルがsendmai.cf相当なので
cp mail.example.jp.cf sendmai.cf
としてコピーします。

自動起動の設定

/etc/rc.confに以下を追加
spamass_milter_enable="YES"
spamd_enable="YES"

clamav_clamd_enable="YES"
clamav_milter_enable="YES"
clamav_freshclam_enable="YES"

以上で準備完了でFreeBSD上でClamAVとSpamAssassinおよび各種RBLが使えるようになりましたがさらに以下の処置をするとより効果的にspamを駆除してくれますので是非とも行ってください。


いくつかのソフトをインストール

1)procmail
cd /usr/ports/mail/procmail
make install
Linuxには標準で入っているようですがFreeBSDにおいては追加ソフトとなっています。

procmailを使うとspamと判定したメールを別フォルダに振り分けたり、読まないようにしたりという処理が行えますが使い方についてはgoogle.co.jpなどで調べてください。

2)portupgrade
cd /usr/ports/sysutils/portupgrade
make install
portupgrade は古いportsを最新のものにアップデートしてくれるソフトです。portsからインストールしたClamAVとSpamAssassinを後日以下のコマンドで最新のバージョンにアップデートすることができます。(その前にあらかじめ最新のports.tar.gzをとりよせ展開しておくこと)
portupgrade -vr p5-Mail-ClamAV

portupgrade -vr clamav

portupgrade -vr p5-Mail-SpamAssassin

SpamAssassin強化

1)SpamAssassinにRBL.JPの設定を追加

インストールしたSpamAssassinはデフォルトではRBL.JPを参照してくれませんのでRBL.JP利用方法を見て /usr/local/etc/mail/spamassassin/local.cf に設定を追加します。これで日本語spamに対してさらに強力な機能が加わります。

local.cf の代表的な設定を以下に示しますがRBL.JP利用方法を見て意味を理解してから使うようにしてください。
urirhssub URLBL_RBLJP  url.rbl.jp.      A   2
body      URLBL_RBLJP  eval:check_uridnsbl('URLBL_RBLJP')
describe  URLBL_RBLJP  Has URI in url.rbl.jp
tflags    URLBL_RBLJP  net
score URLBL_RBLJP    2.0

uridnsbl        URLBL_IP_RBLJP    url.rbl.jp.       TXT
body            URLBL_IP_RBLJP    eval:check_uridnsbl('URLBL_IP_RBLJP')
describe        URLBL_IP_RBLJP    Has IP URL in url.rbl.jp
tflags          URLBL_IP_RBLJP    net
score           URLBL_IP_RBLJP    2.0

header  RCVD_IN_ALL_RBL_JP   eval:check_rbl_txt('rbl.jp', 'all.rbl.jp.')
describe RCVD_IN_ALL_RBL_JP Received via a relay in all.rbl.jp
tflags RCVD_IN_ALL_RBL_JP   net
score RCVD_IN_ALL_RBL_JP 1.5

2)特定ドメインをホワイトリストから削除
vi /usr/local/share/spamassassin/25_uribl.cf
としてドメインのホワイトリストからgeocities.comを削除しました。この理由は最近このドメインのURLを宣伝するspamが大量に来るためこれをローカルのRBLを使って選別するためです(このローカルのRBLにはgeocities.com以外にも多くのフリーのサービスでspammerに利用されたドメインが登録されています)。しかしながら個人のサーバーであると友人知人がgeocities.comの無料サーバーを使っている可能性があるのでお薦めはしません。

SpamAssassinを再度インストール/アップデートするとこのファイルは新しいファイルに上書きされるのでまたやらなくてはなりません。

3)日本語spamに対応するためのパッチ

本パッチはSpamAssassin3.0.4に対応しているもので、将来のバージョンでは位置が異なったりすでに対策が済んでいる可能性があります。

ここに説明のある日本語spam対応のパッチを行います。
cd /usr/local/lib/perl5/site_perl/5.8.7/Mail/SpamAssassin/
vi PerMsgStatus.pm
SpamAssassinを再度インストール/アップデートするとこのファイルは新しいファイルに上書きされるのでまたやらなくてはなりません。


実行および確認

サーバーを再起動して以下のプロセスが動いていることを確認します。
$ ps -axw | grep -e clam -e spam
  480  ??  Is     0:09.97 /usr/local/sbin/clamd
  487  ??  Is     0:00.13 /usr/local/bin/freshclam --daemon
  494  ??  Ss     2:57.21 /usr/local/sbin/clamav-milter --pidfile /var/run/clamav/clamav-milter.pid --postmaster-only --local --pos
  522  ??  Ss     0:45.65 /usr/local/sbin/spamass-milter -f -p /var/run/spamass-milter.sock
 5314  ??  Is     0:03.04 /usr/local/bin/spamd -c -d -r /var/run/spamd/spamd.pid (perl5.8.7)
28621  ??  I      2:44.87 spamd child (perl5.8.7)
28632  ??  I      2:43.92 spamd child (perl5.8.7)
28635  ??  I      2:48.82 spamd child (perl5.8.7)
28649  ??  I      2:32.14 spamd child (perl5.8.7)
28664  ??  I      2:35.95 spamd child (perl5.8.7)

このあと自分宛にメールを送ってみてヘッダのX-Spam-Checker-Version: にSpamAssassinの文字が、X-Virus-Scanned: にClamAVがあることを確認してください。


● SpamAssassinのlocal.cf の記述を変更した場合には
/usr/local/etc/rc.d/sa-spamd.sh restart
として再起動します。このあと ps -ax | grep spam として以下のプロセスが動いていることを確認してください。
# ps -ax | grep spam
  522  ??  Ss     0:46.57 /usr/local/sbin/spamass-milter -f -p /var/run/spamass
46347  ??  S      0:00.03 /usr/local/bin/spamc
46349  ??  Ss     0:02.89 /usr/local/bin/spamd -c -d -r /var/run/spamd/spamd.pi
46356  ??  S      0:00.71 spamd child (perl5.8.7)
46357  ??  S      0:00.01 spamd child (perl5.8.7)
46358  ??  S      0:00.01 spamd child (perl5.8.7)
46359  ??  S      0:00.01 spamd child (perl5.8.7)
46360  ??  S      0:00.01 spamd child (perl5.8.7)

● sendmail.cfの設定を変更した場合には
cd /etc/mail
make restart
とすることでsendmailを再起動することができます。このあと ps -ax | grep sendmail として以下のプロセスが動いていることを確認してください。
# ps -ax | grep sendmail
16383  ??  Is     0:01.10 sendmail: Queue runner@00:30:00 for /var/spool/client
16385  ??  Ss     1:57.27 sendmail: accepting connections (sendmail)

ローカルに持つ拒絶リスト

/etc/mail/access に所定の書式でメールアドレス、ドメイン名それにIPアドレスを書いた拒絶リストを用意しておくと自分のサーバー独自で拒絶することができます。

cd /etc/maill
vi access
として編集します。

以下が書式で、拒絶したいアドレスをTABまたはスペースで区切りそのあとREJECTと記述してください。 1行に1つのアドレスを書き、何行あってもかまいませんがアドレス類は重複があってはいけません。
privatefun@usa.net      REJECT
mta163060.savings1friend.com	REJECT
69.63.161.83  REJECT
72.26.220 REJECT
exrim.net	REJECT
一行目はこのメールアドレスの受け取りを拒絶します。
二行目はこのホスト名のサーバーからの受け取りおよびそのホスト名が From: にあるメールの受け取りを全部拒絶します。
三行目はこのIPアドレスからの受け取りを全部拒絶します。
四行目は72.26.220のブロック、すなわち72.26.220.0-255からの受け取りを全部拒絶します。
五行目は逆引きにこのドメインを持つサーバー名と From: にこのドメインがあるメールの受け取りを全部拒絶します。

五行目の例だとこのドメインに送ることもできなくなります。通常は拒絶しているのだから送る必要もなくていいのですが送信だけはできるようにしたい場合には先頭にFrom: をつけて
From:exrim.net	   REJECT
のようにしてください。

リストを作り終わったら
make
とすると有効になります。sendmailを再起動する必要はありません。

なお推奨する拒絶リストは本拒絶日記に不定期に掲載されますので参考にしてください。

トラブル

● SpamAssassinのlocal.cfの定義の文法にエラーがあるとそれ以降の記述が無効になる場合があります。あらかじめ
spamassassin --lint
として文法チェックをして修正してください。

● 予定していたプロセスが立ち上がらなかったら /var/log/maillog と /var/log/messages を調べてみてください。何かの記録があるはずです。

● 立ち上がっていないプロセスがあった場合には /usr/local/etc/rc.d 以下にある起動スクリプトを使ってたとえば
/usr/local/etc/rc.d/sa-spamd.sh start
のように手動で起動してみるとメッセージが表示される場合があります。スクリプトを追いかけていけばそれが関係しているファイルやディレクトリの名前がわかるので無いディレクトリを作ったり、パーミッションを修正すれば立ち上がります。

● 設定ファイルをWindowsで編集する場合には改行コードの扱いに気をつけてください。アップロードするときに必ずLFだけが行末になるようにしなくてはなりません。Windowsの形式のCR LFのままアップロードすると予期せぬ動きやエラーが発生します。

その他

OSやパッケージは逐一進化しています。古いバージョンのままだとウイルス定義データも使えなくなることもあるので常に最新版にするよう心がけてください。

SpamAssassinは local.cf にいろいろ追加設定をするとさらにspamを排除する能力が上がります。この追加設定については本拒絶日記にいくつかアップされているほか新しいものも発表されるのでたまに見に来るようにしてください。

おまけ
ClamAVが9月16日に0.87となりました。この場合ports.tar.gzの最新版を持ってきて解凍し、
portupgrade -vr clamav
とすればアップデートされます。

portupgrade を使わないで行うには
cd /usr/ports/security/clamav
make WITH_MILTER=yes
make deinstall
make WITH_MILTER=yes install
でアップデートできます。

どちらの方法でもアップデートするとclamavは停止されるので
/usr/local/etc/rc.d/clamav-clamd.sh start
/usr/local/etc/rc.d/clamav-freshclam.sh start
/usr/local/etc/rc.d/clamav-milter.sh start
として立ち上げてください。

改訂
2005-08-9 sendmail 設定
2005-09-22 perlのインストール順序その他変更追加

ご注意:本件に関してはあなたの責任において行ってください。ノーサポートです。業務多忙につき質問が来てもお返事はいたしかねます。(業務として行うことはいたします)

Nikki Top