やりたい事
AWS の EC2 インスタンスに無料の Clam AntiVirus をインストールし、定期的にスキャンして感染していた場合メールで通知します。
インストール
sudo su -l
yum install -y clamd clamav-db
コンフィグ編集
clamd.conf
そのままの場所だとclamdが想定するパスではないので、コピーして編集します。
service clamd.scan start
では初期パスが使われるので、シンボリックリンクを貼っておきます。
cp /etc/clamd.d/scan.conf /etc/clamd.conf
mv /etc/clamd.d/scan.conf /etc/clamd.d/scan.conf.bak
ln -s /etc/clamd.conf /etc/clamd.d/scan.conf
vi /etc/clamd.conf
# コメントアウトする
# Example
# コメントアウトして root で動作するようにする
# User clamav
# コメントアウトされてなかったらコメントアウトする
# DetectBrokenExecutables yes
# ログ系の設定
LogFile /var/log/clamd.scan
LogFileMaxSize 2M
LogTime yes
LogSyslog yes
LogRotate yes
# ローカルモードで動作させる
LocalSocket /var/run/clamd.scan/clamd.sock
LocalSocketMode 660
# 除外ディレクトリ指定
ExcludePath ^/proc/
ExcludePath ^/sys/
freshclam.conf
vi /etc/freshclam.conf
# コメントアウトする
# Example
# ログ系の設定
UpdateLogFile /var/log/freshclam.log
LogFileMaxSize 2M
LogTime yes
LogSyslog yes
LogRotate yes
# アップデートしたら Clamd に通知して再読込させる
# service clamd start してないと失敗する模様?
NotifyClamd /etc/clamd.conf
ウィルス定義の更新設定
vi /etc/sysconfig/freshclam
#FRESHCLAM_DELAY=disabled-warn # REMOVE ME
サービスの起動
Clamd 起動
clamd start
LibClamAV Warning: **************************************************
LibClamAV Warning: *** The virus database is older than 7 days! ***
LibClamAV Warning: *** Please update it as soon as possible. ***
LibClamAV Warning: **************************************************
clamd start 後の stop, restart について
clamd start
したあと、clamd stop
しても「ソケットが使われてるよ」エラーになります。
ERROR: LOCAL: Socket file /var/run/clamd.scan/clamd.sock is in use by another process.
start した後は、ソケットを介して clamd を通信するようです。
http://clamav-jp.osdn.jp/jdoc/clamav.html
下記のようにソケットを介してコマンドを送れば停止できます。
echo SHUTDOWN | nc -U /var/run/clamd.scan/clamd.sock
ウィルス定義のアップデート
freshclam
ClamAV update process started at Thu Sep 15 05:40:56 2016
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.98.7 Recommended version: 0.99.2
DON'T PANIC! Read http://www.clamav.net/support/faq
Empty script main-56.cdiff, need to download entire database
Downloading main.cvd [100%]
(中略)
Downloading bytecode.cvd [100%]
bytecode.cvd updated (version: 283, sigs: 53, f-level: 63, builder: neo)
Database updated (4832725 signatures) from database.clamav.net (IP: 27.96.54.66)
サービスとして clamd 起動
# もし clamd start してたら下記で止める
echo SHUTDOWN | nc -U /var/run/clamd.scan/clamd.sock
# サービスとして起動
chkconfig clamd.scan on
service clamd.scan start
自動でウィルス定義をアップデート
vi /etc/cron.daily/freshclam
#!/bin/sh
### A simple update script for the clamav virus database.
### This could as well be replaced by a SysV script.
/usr/bin/freshclam --quiet
chmod 755 /etc/cron.daily/freshclam
自動でウィルススキャンして感染していたらメール通知
touch /usr/local/bin/clamdscan_path.sh
chmod 755 /usr/local/bin/clamdscan_path.sh
vi /usr/local/bin/clamdscan_path.sh
#!/bin/sh
if [ $# -ne 1 ]; then
echo "Usage : clamdscan_path.sh /scan/target/path/" 1>&2
exit 1
fi
SCAN_DIR=$1
LOG="/var/log/clamdscan_result.log"
LOG_LATEST="/var/log/clamdscan_result.log.latest"
FROM="noreply@test.com"
TO="sample@mail.com"
#-----------------------------
# update clamd
yum -y update clamd > /dev/null 2>&1
yum -y update clamav-db > /dev/null 2>&1
#-----------------------------
# restart clamd (release memory)
/sbin/service clamd.scan restart > /dev/null
#-----------------------------
# scan
/usr/bin/clamdscan --infected --log=$LOG $SCAN_DIR > $LOG_LATEST
#-----------------------------
# send email if virus is found
cat $LOG_LATEST | grep 'FOUND' > /dev/null
if [ "$?" -eq 0 ]
then
{
echo "From: $FROM"
echo "To: $TO"
echo "Subject: [SERVER] Virus Found in `hostname`"
echo
echo "Virus Found in `hostname`"
echo
cat $LOG
} | /usr/sbin/sendmail -f $FROM $TO
fi
cronで定期的に起動するようにする
crontab -e
## Virus Check
# 例えばホームディレクトリを毎朝3時にスキャン
00 3 * * * /usr/local/bin/clamdscan_path.sh /home/
clamd はそこそこ重たいので、このスクリプトでは毎回再起動してます。スクリプト内で再起動しない場合は、週一くらいで再起動させるcronを登録すると良いでしょう。