「Clam AV」 + 「amavisd-new」の設定

ウィルス対策として、「Clam AV」を導入します。
また、「Postfix」と「Clam AV」を連携させる為に「amavisd-new」も導入します。
なお、ここではスパム対策も行っていますが、その場合「SpamAssassin」も導入する必要があります。
「SpamAssassin」の設定方法はこちらを参照して下さい。
上記のリンク先では「Procmail」との連携を記述していますが、「SpamAssassin」の設定のみで構いません。

「Clam AV」のインストール

「Clam AV」用のユーザを作成します。

Solaris# groupadd -g 3310 clamav
Solaris# useradd -u 3310 -g clamav -d /bin/false -s /bin/false clamav

「Clam AV」のソースファイルをダウンロードし、インストールします。

Solaris# mkdir /usr/local/src/clamav <= 作業用ディレクトリの作成
Solaris# chmod 777 /usr/local/src/clamav <= 作業用ディレクトリのパーミッション変更
Solaris# exit <= 一般ユーザになる
Solaris% cd /usr/local/src/clamav <= 作業用ディレクトリへ移動
Solaris% wget http://jaist.dl.sourceforge.net/sourceforge/clamav/clamav-0.88.tar.gz <= 「Clam AV」のソースをダウンロード
Solaris% gunzip -c clamav-0.88.tar.gz | tar xf - <= ダウンロードしたファイルの展開
Solaris% cd clamav-0.88 <= 展開したディレクトリに移動
Solaris% ./configure |& tee configure.log
Solaris% gmake |& tee make.log <= コンパイル
Solaris% su <= スーパーユーザになる
Password: <= パスワードの入力
Solaris# gmake install |& tee make-install.log <= インストール

なお、ウィルス定義ファイルを更新する「freshclam」も同時にインストールされます。

「Clam AV」の設定

「Clam AV」のバージョン0.90から設定値に真偽値を指定する必要があります。
上記のインストールでのバージョンは0.88ですが、ここではバージョンを0.90に上げた場合の設定も記述しています。

Solaris# vi /usr/local/etc/clamd.conf <= 設定ファイルの編集
Example
↓
#Example <= コメントアウト

#LogFile /tmp/clamd.log
↓
LogFile /var/log/clamd.log <= ログファイルを指定

#LogTime
↓
LogTime <= ログファイルに日付と時間を加える
LogTime yes <= 0.90以降の場合

#PidFile /var/run/clamd.pid
↓
PidFile /var/run/clamav/clamd.pid <= PIDファイルを指定

LocalSocket /tmp/clamd
↓
LocalSocket /var/run/clamav/clamd.sock <= 変更

FixStaleSocket
↓
FixStaleSocket no <= 0.90以降の場合

PIDファイルとSocketファイル格納する為のディレクトリを作成し、オーナを変更します。

Solaris# mkdir /var/run/clamav
Solaris# chown clamav:clamav /var/run/clamav
「freshclam」の設定
Solaris# vi /usr/local/etc/freshclam.conf <= 設定ファイルの編集
Example
↓
#Example <= コメントアウト

#UpdateLogFile /var/log/freshclam.log
↓
UpdateLogFile /var/log/freshclam.log <= コメント解除

ログファイルを作成し、パーミッションとオーナを変更します。

Solaris# touch /var/log/freshclam.log <= ログファイルの作成
Solaris# chmod 644 /var/log/freshclam.log <= ログファイルのパーミッションを変更
Solaris# chown clamav:clamav /var/log/freshclam.log <= ログファイルのオーナの変更
「Clam AV」の起動と「freshclam」の実行

「Clam AV」の起動

Solaris# /usr/local/sbin/clamd <= 「Clam AV」の起動

「freshclam」の実行

Solaris# /usr/local/bin/freshclam <= 「freshclam」の実行

ウィルス定義ファイルの自動更新

「freshclam」をデーモンではなく、手動で実行するようにしていますので、cronに登録して定期的に更新するようにします。
また、ウィルス定義ファイルを更新したら「Clam AV」を再起動して、最新のウィルス定義ファイルを読み込むようにします。

Solaris# vi ~/freshclam.sh <= ウィルス定義ファイルの自動更新のスクリプトの作成
#!/sbin/sh

if [ -f /usr/local/bin/freshclam ]; then
        /usr/local/bin/freshclam
fi

if [ -f /var/run/clamav/clamd.pid ]; then
        kill `cat /var/run/clamav/clamd.pid`
        sleep 3
fi

if [ -f /usr/local/sbin/clamd ]; then
        /usr/local/sbin/clamd
fi


Solaris# chmod 755 ~/freshclam.sh <= 設定ファイルに実行権限付加
Solaris# crontab -e <= 設定ファイルの編集
00 4 * * * /root/freshclam.sh <= 追加(毎日4:00に実施)

「Clam AV」+「freshclam」の自動起動

「Clam AV」等をデーモンモードにして自動起動したい場合はこちらに起動スクリプトがあります。

「amavisd-new」のインストール

「gcc」+「glibc」のインストール

「amavisd-new」をインストールする前に「gcc」と「glibc」がインストールされていなければ、インストールします。
ソースからインストールしても問題ありませんが、パッケージがこちらにありますので、 パッケージからインストールしたほうが楽です。

perlモジュールのインストール

「gcc」と「glibc」がインストールされれば、次にperlの関連モジュールをインストールします。

必要なモジュールは下記の通りです。
インストールは「CPAN」を利用すると簡単です。

・Archive::Tar
・Archive::Zip
・Compress::Zlib
・Convert::TNEF
・Convert::UUlib
・MIME::Base64
・MIME::Parser
・Mail::Internet
・Net::Server
・Net::SMTP
・Digest::MD5
・IO::Stringy
・Time::HiRes
・Unix::Syslog

なお、「CPAN」を利用しない場合、こちらより必要なモジュールを取得し、 下記のようにインストールします。

Solaris% gunzip -c Unix-Syslog-0.100.tar.gz | tar xf -
Solaris% cd Unix-Syslog-0.100
Solaris% perl Makefile.PL |& tee make-perl.log
Solaris% make |& tee make.log
Solaris% su
Password:
Solaris# make install |& tee make-install.log

「BerkeleyDB」のインストール

「BerkeleyDB」を利用する為に、こちらで紹介している方法だけではなく、 次のようにして「BerkeleyDB」のPerlモジュールをインストールします。
なお、「BerkeleyDB」のファイルのダウンロード先と展開作業までは、上記のリンク先と同じとしています。

Solaris% cd /usr/local/src/db/db-4.4.20/perl/BerkeleyDB
Solaris% setenv BERKELEYDB_INCLUDE /usr/local/BerkeleyDB.4.4/include
Solaris% setenv BERKELEYDB_LIB /usr/local/BerkeleyDB.4.4/lib
Solaris% perl Makefile.PL |& tee make-pl.log
Solaris% make |& tee make-berkeleydb.log
Solaris% make test
Solaris% su
Password:
Solaris# make install |& tee make-install.log

「amavisd-new」用のユーザの作成

「amavisd-new」用のユーザを作成します。

Solaris# groupadd -g 3311 vscan <= グループの作成
Solaris# useradd -u 3311 -g vscan -d /bin/false -s /bin/false vscan <= ユーザの作成

「amavisd-new」のインストール

ソースをダウンロードし、インストールします。

Solaris# mkdir /usr/local/src/amavisd-new <= 作業用ディレクトリの作成
Solaris# chmod 777 /usr/local/src/amavisd-new <= 作業用ディレクトリのパーミッション変更
Solaris# exit <= 一般ユーザになる
Solaris% cd /usr/local/src/amavisd-new <= 作業用ディレクトリへ移動
Solaris% wget http://www.ijs.si/software/amavisd/amavisd-new-2.3.3.tar.gz
 <= 「amavisd-new」のソースをダウンロード
Solaris% gunzip -c amavisd-new-2.3.3.tar.gz | tar xf - <= ダウンロードしたファイルの展開
Solaris% cd amavisd-new-2.3.3 <= 展開したディレクトリに移動
Solaris% su <= スーパーユーザになる
Password: <= パスワードの入力
Solaris# cp amavisd /usr/local/sbin/amavisd <= 「amavisd-new」のインストール
Solaris# cp amavisd.conf /etc/amavisd.conf <= 設定ファイルのコピー
Solaris# rehash <= パスを通す

「amavisd-new」の作業用ディレクトリの作成

「amavisd-new」の作業用ディレクトリを作成し、オーナを変更します。

Solaris# mkdir /var/amavis <= 作業用ディレクトリの作成
Solaris# mkdir /var/amavis/tmp <= 作業用ディレクトリの作成
Solaris# mkdir /var/amavis/db <= 作業用ディレクトリの作成
Solaris# mkdir /var/virusmails <= 作業用ディレクトリの作成
Solaris# chown vscan:vscan /var/amavis <= オーナの変更
Solaris# chown vscan:vscan /var/amavis/tmp <= オーナの変更
Solaris# chown vscan:vscan /var/amavis/db <= オーナの変更
Solaris# chown vscan:vscan /var/virusmails <= オーナの変更

インストールの確認

必要なモジュールのインストールや設定ファイルのコピーが完了したかを確認します。

Solaris# amavisd debug <= debugモードで起動

モジュールが足りない場合等はエラーメッセージが出力されますので、インストールします。
設定が完了した場合、延々とメッセージが出力されますので、「Ctrl + C」で終了します。

「amavisd-new」の設定

「amavisd-new」の設定

ここでは、スパム対策も記述していますが、その場合「SpamAssassin」も導入する必要があります。
「amavisd-new」と連携させずに「SpamAssassin」を利用する場合、あるいはスパム対策を行わない場合、以下の設定の
# @bypass_spam_checks_maps = (1);
の部分のコメント解除を行ってして下さい。
その場合、その他のスパムのみに関連する記述は行わなくて構いません。
なお、「SpamAssassin」を「Procmail」と連携させて利用する場合はこちらを参照して下さい。

Solaris# vi /etc/amavisd.conf <= 設定ファイルの編集
# @bypass_spam_checks_maps  = (1);  # uncomment to DISABLE anti-spam code
↓
@bypass_spam_checks_maps  = (1);  # uncomment to DISABLE anti-spam code <= 「SpamAssassin」と連携させない場合、コメント解除

$mydomain = 'example.com';   # a convenient default for other settings
↓
$mydomain = 'crimson-snow.net';   # a convenient default for other settings <= ドメインを指定

$QUARANTINEDIR = '/var/virusmails'; <= ウィルス等と判断したメールを隔離するディレクトリ

スパムメール判定の閾値を決める(詳細は後述)
$sa_tag_level_deflt  = 2.0;  # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 6.31; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 6.31; # triggers spam evasive actions
$sa_dsn_cutoff_level = 9;    # spam level beyond which a DSN is not sent
# $sa_quarantine_cutoff_level = 20; # spam level beyond which quarantine is off
ここまで

$sa_mail_body_size_limit = 200*1024; # don't waste time on SA if mail is larger <= スパム判定をするメール本文の最大長を指定

$virus_admin               = "virusalert\@$mydomain";  # notifications recip.
↓
$virus_admin               = "root\@$mydomain";  # notifications recip. <= ウィルス検出時の通知先アドレスを指定

$sa_spam_subject_tag1 = '***possible SPAM*** ' <= スパムと判断したメール($sa_tag_level_deflt以上のスコア)の件名に付ける文字列
$sa_spam_subject_tag = '***SPAM*** '; <= スパムと断定したメール($sa_tag2_level_deflt以上のスコア)の件名に付ける文字列

# $myhostname = 'host.example.com';  # must be a fully-qualified domain name!
↓
$myhostname = 'Solaris.crimson-snow.net';  # must be a fully-qualified domain name! <= ホスト名を記述

$spam_admin   = "root\@$mydomain"; <= 追加(スパム検出時の通知先アドレスを指定)
$hdr_encoding = 'iso-2022-jp'; <= 追加(ヘッダの文字コードをJISに指定)
$bdy_encoding = 'iso-2022-jp'; <= 追加(ボディの文字コードをJISに指定)

# $notify_method  = 'smtp:[127.0.0.1]:10025';
# $forward_method = 'smtp:[127.0.0.1]:10025';  # set to undef with milter!
↓
$notify_method  = 'smtp:[127.0.0.1]:10025'; <= コメント解除
$forward_method = 'smtp:[127.0.0.1]:10025';  # set to undef with milter! <= コメント解除

以下の設定を追加し、ウィルスやスパムの処理を決める(詳細は後述)
$final_virus_destiny      = D_DISCARD;
$final_banned_destiny     = D_BOUNCE;
$final_spam_destiny       = D_PASS;
$final_bad_header_destiny = D_PASS;

$warnvirussender  = 0;
$warnspamsender   = 0;
$warnbannedsender = 0;
$warnbadhsender   = 0;
ここまで

「Clam AV」に関する部分のコメントを解除し、sockファイルを「Clam AV」の設定と合わせる
# ### http://www.clamav.net/
# ['ClamAV-clamd',
#   \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd"],
#   qr/\bOK$/, qr/\bFOUND$/,
#   qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
# # NOTE: the easiest is to run clamd under the same user as amavisd; match the
# # socket name (LocalSocket) in clamav.conf to the socket name in this entry
# # When running chrooted one may prefer: ["CONTSCAN {}\n","$MYHOME/clamd"],
↓
### http://www.clamav.net/
['ClamAV-clamd',
  \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"], <= sockファイルを指定
  qr/\bOK$/, qr/\bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
# NOTE: the easiest is to run clamd under the same user as amavisd; match the
# socket name (LocalSocket) in clamav.conf to the socket name in this entry
# When running chrooted one may prefer: ["CONTSCAN {}\n","$MYHOME/clamd"],

ウィルス、スパムメール検出時の通知設定

「SpamAssassin」でスパムメールと判断する閾値を以下のように設定することが出来ます。

設定変数 説明
$sa_tag_level_deflt スパムと判断したメールのヘッダに「X-Spam-Level」と「X-Spam-Status」ヘッダを付与する。
$sa_tag2_level_deflt スパムと断定したメールのヘッダに「X-Spam-Flag: YES」を付与する。
$sa_kill_level_deflt スパムと断定したときのアクションを実行する。
$sa_dsn_cutoff_level メールを配送しない。
その為、そのメールを確認するには隔離したディレクトリから探すことになる。
$sa_quarantine_cutoff_level 隔離すら行わず、メールを削除する。
この設定しない方が良いと思う。

ウィルス、スパムメールを検出した場合の通知を以下のように設定することが出来ます。

設定変数 説明
$final_virus_destiny ウィルスメールの最終的な処理方法。
$final_banned_destiny banned(禁止された)メールの最終的な処理方法。
$final_spam_destiny スパムメール($sa_kill_level_deflt以上のスコア)の最終的な処理方法。
$final_bad_header_destiny ヘッダにASCII以外の文字が含まれているメール(Bad Header)の最終的な処理方法。

上記の項目の設定値には以下のものがあります。

設定値 説明
D_DISCARD メールは受信者に配送せず、送信者にも通知しない。
D_BOUNCE メールは受信者には配送されないが、配送されなかったことを送信者に通知する。
ただし、例外的に送信者に通知しないものがある。
D_REJECT メールは受信者には配送されないが、配送されなかったことを送信者に通知する。
D_PASS メールは配送される。

設定値に D_PASS を指定した場合に、ウィルスやスパムメールを受け取った場合、警告するかどうかを以下のように設定出来ます。
なお、有効にする場合は「1」を指定し、無効にする場合は「0」を指定します。

設定変数 説明
$warnvirussender ウィルス送信者に通知するかどうか。
$warnspamsender スパム送信者に通知するかどうか。
$warnbannedsender 禁止メールの場合、送信者に通知するかどうか。
$warnbadhsender ヘッダにASCII文字以外のものが含まれているメールの場合、送信者に通知するかどうか。

「Clam AV」の設定

「amavisd-new」と「Clam AV」の実行ユーザを同じにする必要がある為、再び「Clam AV」を設定し、 「Clam AV」の実行ユーザを変更します。
また、「Clam AV」設定時に変更したディレクトリのオーナを「amavisd-new」の実行ユーザに変更します。

Solaris# vi /usr/local/etc/clamd.conf <= 設定ファイルの編集
#User clamav
↓
User vscan <= 「amavisd-new」の実行ユーザに合わせる


Solaris# chown vscan:vscan /var/run/clamav <= オーナの変更
「amavisd-new」の起動

「amavisd-new」の起動

Solaris# /usr/local/sbin/amavisd

「amavisd-new」の自動起動

起動スクリプトを作成して、Solaris起動時に自動的に起動するようにします。

Solaris# vi /etc/init.d/amavisd <= 起動スクリプトファイルの作成
#!/sbin/sh

PID='/var/amavis/amavisd.pid'

case "$1" in
'start')
        if [ -f $PID ]; then
                echo "amavisd-new has started"
        else
                /usr/local/sbin/amavisd
                echo "Running: amavisd-new"
        fi
        ;;

'stop')
        if [ -f $PID ]; then
                /usr/local/sbin/amavisd stop
                echo "Stopping: amavisd-new"
        else
                echo "amavisd-new has stopped"
        fi
        ;;

'reload')
        /usr/local/sbin/amavisd reload
        echo "ReLoading: amavisd-new"
        ;;

'restart')
        $0 stop
        sleep 3
        $0 start
        ;;

'status')
        if [ -f $PID ]; then
                echo "amavisd-new starts"
        else
                echo "amavisd-new stopped"
        fi
        ;;

*)
        echo "Usage: $0 { start | stop | reload | restart | status }"
        exit 1
        ;;
esac

exit 0


Solaris# chmod 744 /etc/init.d/amavisd <= 起動スクリプトファイルに実行権限付加
Solaris# ln /etc/init.d/amavisd /etc/rc2.d/S80amavisd <= ランレベル2で起動する
Solaris# ln /etc/init.d/amavisd /etc/rc3.d/S80amavisd <= ランレベル3で起動する
Solaris# ln /etc/init.d/amavisd /etc/rc0.d/K80amavisd <= ランレベル0で停止する
「Postfix」の設定

main.cfの設定

Solaris# vi /etc/postfix/main.cf <= 設定ファイルの編集
content_filter = smtp-amavis:[127.0.0.1]:10024 <= 追加

master.cfの設定

Solaris# vi /etc/postfix/master.cf <= 設定ファイルの編集
以下を追加( -o の前の空白はTABにする必要あり)
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
▲ページのトップへ