自宅環境でLinuxで利用できるウィルスチェックを入れたくなったので、Clam AntiVirusを導入した。
今回はサーバとして動作させているCentOS 7に導入させることにした。

1.インストール

まずはインストール。
CentOS 7でClam AntiVirusをインストールする場合、Repoforgeからインストールすると楽なので、まずリポジトリを導入する。
(Epelだったらもっといいのだが、残念ながらデーモンとして動作させるclamdがなかった。)

rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
[root@BS-PUB-SEC ~]# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
[root@BS-PUB-SEC ~]# rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm を取得中
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:rpmforge-release-0.5.3-1.el7.rf  ################################# [100%]

次に、ClamAVをインストール。

yum -y install clamd

これでインストールが出来た。

2.設定変更

次に、ClamAVがサーバとして動作するよう、環境に合わせて設定を変更する。
まず、clamdの設定ファイル(/etc/clamd.conf)で、以下のコマンドを実行し編集を行う。

除外ディレクトリの追記(環境に応じて書き換える事)

cat <<EOF >> /etc/clamd.conf

# 除外ディレクトリ
ExcludePath ^/proc/
ExcludePath ^/sys/
ExcludePath ^/dev/

EOF

実行ユーザの変更(rootにする)

sed -i '/^User clamav/s/^/# /g' /etc/clamd.conf

壊れたファイルの除外設定

sed -i '/^DetectBrokenExecutables yes/s/^/# /g' /etc/clamd.conf

これで、ひとまずclamdの設定ファイルの変更は完了。
次に、SELinuxが有効の状態でも動作するよう、以下のコマンドを実行する。
※これだけだと、「/etc/selinux」配下とか引っかかるので、可能ならSELinux自体無効化した方が早い。

setsebool -P antivirus_can_scan_system 1

ソケットファイルの生成場所が再起動すると消えてしまうので、消えないようにする。

echo "d /var/run/clamav 0755 root root -" > /etc/tmpfiles.d/clamd.conf
systemd-tmpfiles --create clamd.conf
systemctl daemon-reload

また、epelを導入しているサーバの場合、yum update時に競合して正常にアップデートされないようなので、以下のコマンドを実行しておく。

sed -i '/gpgkey/a/exclude=clam*/g' /etc/yum.repos.d/epel.repo

3.clamdデーモンの起動

設定は完了したので、clamdを起動させる。

systemctl start clamd
systemctl enable clamd

実際にスキャンを実施してみる。

clamdscan
[root@BS-PUB-SEC ~]# clamdscan
/root: OK

----------- SCAN SUMMARY -----------
Infected files: 0
Time: 0.011 sec (0 m 0 s)

正常に動作しているようだ。
テスト用のウィルスファイルをダウンロードして動作をみてみよう。

[root@BS-PUB-SEC ~]# clamscan --infected --remove --recursive
LibClamAV Warning: **************************************************
LibClamAV Warning: ***  The virus database is older than 7 days!  ***
LibClamAV Warning: ***   Please update it as soon as possible.    ***
LibClamAV Warning: **************************************************

----------- SCAN SUMMARY -----------
Known viruses: 1258735
Engine version: 0.98.4
Scanned directories: 1
Scanned files: 8
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 2.939 sec (0 m 2 s)
[root@BS-PUB-SEC ~]#  wget http://www.eicar.org/download/eicar.com
--2016-05-04 20:07:15--  http://www.eicar.org/download/eicar.com
www.eicar.org (www.eicar.org) をDNSに問いあわせています... 188.40.238.250
www.eicar.org (www.eicar.org)|188.40.238.250|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 68 [application/octet-stream]
`eicar.com' に保存中

100%[=========================================================================>] 68          --.-K/s 時間 0s

2016-05-04 20:07:16 (8.19 MB/s) - `eicar.com' へ保存完了 [68/68]

[root@BS-PUB-SEC ~]# clamscan --infected --remove --recursive
LibClamAV Warning: **************************************************
LibClamAV Warning: ***  The virus database is older than 7 days!  ***
LibClamAV Warning: ***   Please update it as soon as possible.    ***
LibClamAV Warning: **************************************************
/root/eicar.com: Eicar-Test-Signature FOUND
/root/eicar.com: Removed.

----------- SCAN SUMMARY -----------
Known viruses: 1258735
Engine version: 0.98.4
Scanned directories: 1
Scanned files: 9
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 2.844 sec (0 m 2 s)

無事、ウィルスファイルを発見、駆除することができた。

4.ウィルス定義ファイルの最新化・自動更新

さて、先ほどのテスト実行時にウィルス定義ファイルが古いと言われたので、最新化と自動更新を行うように設定をする。

sed -i 's/^Example/#Example/g' /etc/freshclam.conf
freshclam
[root@BS-PUB-SEC ~]# sed -i 's/^Example/#Example/g' /etc/freshclam.conf
[root@BS-PUB-SEC ~]# freshclam
ClamAV update process started at Wed May  4 20:09:25 2016
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.98.4 Recommended version: 0.99.2
DON'T PANIC! Read http://www.clamav.net/support/faq
Downloading main-55.cdiff [100%]
Empty script main-56.cdiff, need to download entire database
Downloading main.cvd [100%]
main.cvd updated (version: 57, sigs: 4218790, f-level: 60, builder: amishhammer)
WARNING: getfile: daily-15077.cdiff not found on remote server (IP: 194.8.197.22)
WARNING: getpatch: Can't download daily-15077.cdiff from database.clamav.net
WARNING: getfile: daily-15077.cdiff not found on remote server (IP: 130.59.10.36)
WARNING: getpatch: Can't download daily-15077.cdiff from database.clamav.net
Trying host database.clamav.net (208.72.56.53)...
nonblock_connect: connect timing out (30 secs)
Can't connect to port 80 of host database.clamav.net (IP: 208.72.56.53)
Trying host database.clamav.net (207.57.106.31)...
WARNING: getfile: daily-15077.cdiff not found on remote server (IP: 207.57.106.31)
WARNING: getpatch: Can't download daily-15077.cdiff from database.clamav.net
WARNING: Incremental update failed, trying to download daily.cvd
Downloading daily.cvd [100%]
daily.cvd updated (version: 21514, sigs: 90868, f-level: 63, builder: neo)
Downloading bytecode.cvd [100%]
bytecode.cvd updated (version: 277, sigs: 47, f-level: 63, builder: neo)
Database updated (4309705 signatures) from database.clamav.net (IP: 150.214.142.197)
Clamd successfully notified about the update.

これで、無事ウィルス定義ファイルがアップロードできた。
なお、この時点で/etc/cron.daily/freshclamにファイルが作成されているので、以降は日時で定義ファイルが更新される。

5.定期実行するウィルスチェックスクリプトの作成

これでClamAVを動作させる環境は整ったが、定期的にスキャンをさせる必要がある。
以下のスクリプトを作成して定期的に実行させる。

/etc/cron.daily/clamdvirusscan

#!/bin/bash

# PATH
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# MAIL
MAIL_ADDR="メールアドレス"

# clamd update
yum -y update clamd > /dev/null 2>&1

# virus scan
CLAMSCANTMP=`mktemp`

clamdscan --recursive --remove /  > $CLAMSCANTMP 2>&1

[ ! -z "$(grep FOUND$ $CLAMSCANTMP)" ] && \
grep FOUND$ $CLAMSCANTMP | mail -s "$(hostname) Virus Found" $MAIL_ADDR

[ -z "$(grep FOUND$ $CLAMSCANTMP)" ] && \
echo "$(hostname) Virus Not Found" | mail -s "Virus Not Found" $MAIL_ADDR

rm -f $CLAMSCANTMP

作成後、以下のコマンドで権限の付与を行う。

chmod +x /etc/cron.daily/clamdvirusscan

これで、自動的にウィルススキャンが実施されるようになった。