Clam AntiVirus を AWS EC2 にインストールする

# やりたい事

AWS の EC2 インスタンスに無料の Clam AntiVirus をインストールし、定期的にスキャンして感染していた場合メールで通知します。

## インストール

```bash
sudo su -l
yum install -y clamd clamav-db
```

## コンフィグ編集

### clamd.conf

そのままの場所だとclamdが想定するパスではないので、コピーして編集します。
`service clamd.scan start` では初期パスが使われるので、シンボリックリンクを貼っておきます。

```bash
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

```bash
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
```

### ウィルス定義の更新設定

```bash
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 起動

```bash
# もし clamd start してたら下記で止める
echo SHUTDOWN | nc -U /var/run/clamd.scan/clamd.sock

# サービスとして起動
chkconfig clamd.scan on
service clamd.scan start
```

## 自動でウィルス定義をアップデート

```bash
vi /etc/cron.daily/freshclam
```

```sh
#!/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
```

```bash
chmod 755 /etc/cron.daily/freshclam
```


## 自動でウィルススキャンして感染していたらメール通知

```bash
touch /usr/local/bin/clamdscan_path.sh
chmod 755 /usr/local/bin/clamdscan_path.sh
vi /usr/local/bin/clamdscan_path.sh
```

```bash
#!/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で定期的に起動するようにする

```bash
crontab -e
```

```bash
## Virus Check

# 例えばホームディレクトリを毎朝3時にスキャン
00 3 * * * /usr/local/bin/clamdscan_path.sh /home/
```

clamd はそこそこ重たいので、このスクリプトでは毎回再起動してます。スクリプト内で再起動しない場合は、週一くらいで再起動させるcronを登録すると良いでしょう。