CentOS7にウイルスソフト(Clamd)を導入

今回はLinuxウイルス対策ツールのClamdの導入を行いたいと思います。
Windowsマシンであればウイルスバスターやらノートンウイルス対策ツールを導入することは当然になっていますが、Linuxのウイルスソフトって案外知らないものですよね。

今回は以下のような流れで導入を行います。
yumリポジトリの追加
・インストール
・動作検証
・シェルの定期実行設定

リポジトリの追加

CentOS7ではClamdをyumからインストールするためにリポジトリを追加する必要があります。
過去CentOS6などでは、epelリポジトリにもあったのですが現在はrpmforgeに存在するようです。

では、まず複数リポジトリ管理を楽にするパッケージを導入します。

[root@hoge ~]# yum install yum-plugin-priorities  
[root@hoge ~]# cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.org  
[root@hoge ~]# vi /etc/yum.repos.d/CentOS-Base.repo  
[root@hoge ~]# diff /etc/yum.repos.d/CentOS-Base.repo.org /etc/yum.repos.d/CentOS-Base.repo  
18a19  
> priority=1  
26a28  
> priority=1  
34a37  
> priority=1  
43a47  
> priority=1  

このパッケージを導入すると複数のリポジトリに同じパッケージが存在するときに利用するリポジトリに優先度をつけることができます。
なので、Baseのpriority(優先度)を最優先とすることで、基本をベースリポジトリにして不足分を他のリポジトリから取得するようになります。

では、設定が完了したのでrpmforgeリポジトリを追加しましょう。

[root@hoge ~]# cd /usr/local/src  
[root@hoge src]# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm  
[root@hoge src]# rpm -ivh rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm   
warning: rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 6b8d79e6: NOKEY  
Preparing...                          ################################# [100%]  
Updating / installing...  
   1:rpmforge-release-0.5.3-1.el7.rf  ################################# [100%]  
[root@hoge src]# rm rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm   
rm: remove regular file ‘rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm’? y  
[root@hoge src]# yum -y update rpmforge-release  
[root@hoge src]# cp /etc/yum.repos.d/rpmforge.repo /etc/yum.repos.d/rpmforge.repo.org  
[root@hoge src]# vi /etc/yum.repos.d/rpmforge.repo  
[root@hoge src]# diff /etc/yum.repos.d/rpmforge.repo.org /etc/yum.repos.d/rpmforge.repo  
11a12  
> priority=10  

よくあるリポジトリの追加を行っています。
上記のパッケージを利用しているので、repoファイルのenableは1のままとしています。
ここで優先度を10として設定しています。
慣習的にベース以外は10以上を設定したりするようです。

またここでpriorityを設定しなかった場合に、clamdをインストール後にyum updateで優先付けが上手くできないのかエラーとなってしまうので注意です。

Clamdインストール

リポジトリを追加したので、Clamdをインストールします。

[root@hoge ~]# yum install clamd  
[root@hoge ~]# cp /etc/clamd.conf /etc/clamd.conf.org  
[root@hoge ~]# vi /etc/clamd.conf  
[root@hoge ~]# diff /etc/clamd.conf.org /etc/clamd.conf  
195c195  
< User clamav  
---  
> #User clamav  
  
[root@hoge ~]# cp /etc/freshclam.conf /etc/freshclam.conf.org  
[root@hoge ~]# vi /etc/freshclam.conf  
[root@hoge ~]# diff /etc/freshclam.conf.org /etc/freshclam.conf  
38c38  
< LogSyslog yes  
---  
> #LogSyslog yes  

ここまでがファイルの設定です。
Userをコメントアウトしているのは、root権限でcronに設定して定期実行することを想定してるため、root権限で動くように合わせているためです。
あとはすべてのファイルを確認して欲しいという理由ですね。

またLogSysLogをコメントアウトしているは、yesのままだと定期的にログが出力されてしまいログが見づらくなるのと,
容量増えるのを防止するためです。

続いてサービスの起動設定。

[root@hoge ~]# systemctl start clamd  
[root@hoge ~]# systemctl is-enabled clamd  
clamd.service is not a native service, redirecting to /sbin/chkconfig.  
Executing /sbin/chkconfig clamd --level=5  
enabled  
  
# どうやらclamdはネイティブなサービスじゃないのでchkconfigを使えとのこと  
# ただし結局似たようなエラーが出る  
[root@hoge ~]# chkconfig clamd on  
[root@hoge ~]# chkconfig --list clamd  
  
Note: This output shows SysV services only and does not include native  
      systemd services. SysV configuration data might be overridden by native  
      systemd configuration.  
  
      If you want to list systemd services use 'systemctl list-unit-files'.  
      To see services enabled on particular target use  
      'systemctl list-dependencies [target]'.  
  
clamd           0:off  1:off  2:on   3:on   4:on   5:on   6:off  
  
# versionが古いと出るがyumリポジトリにあるものが最新でないので無視  
[root@hoge ~]# freshclam  
ClamAV update process started at Sun Oct 18 00:58:29 2015  
WARNING: Your ClamAV installation is OUTDATED!  
WARNING: Local version: 0.98.4 Recommended version: 0.98.7  
......  
Clamd successfully notified about the update.  

コメントにもありますが、clamdはネイティブなサービスではないのでsystemctlコマンドではなくchkconfigを使えと出ます。
ただそちらを使っても結局似たようなことを言われます。
設定自体は有効になっているようなので、ここでは無視しています。

また、最後にウイルスのデータベースを更新しています。
これが完了するまでにある程度時間がかかりますので待ちましょう。

その際に警告が表示されますがyumで導入したclamdは最新ではないためこのような警告が表示されています。
特に気にする必要はありません。

動作検証

設定が完了したので今度は動作検証を行います。
公開されているテスト用のウイルスファイルをwgetで取得し、スキャンを行います。

# infectedでウイルスファイルのみ出力  
# recursiveで再帰的にスキャンと圧縮ファイルも解凍してスキャン  
[root@hoge ~]# wget http://www.eicar.org/download/eicar.com \  
http://www.eicar.org/download/eicar.com.txt \  
http://www.eicar.org/download/eicar_com.zip \  
http://www.eicar.org/download/eicarcom2.zip  
  
[root@hoge ~]# clamscan --infected --remove --recursive  
----------- SCAN SUMMARY -----------  
Known viruses: 4031016  
Engine version: 0.98.4  
Scanned directories: 3  
Scanned files: 14  
Infected files: 4  
Data scanned: 0.05 MB  
Data read: 0.02 MB (ratio 2.00:1)  
Time: 8.887 sec (0 m 8 s)  

infected filesにダウンロードされた4つ分が表示されていますので検証は完了です。

定期実行設定

最後にウイルススキャンの定期実行設定を行います。
シェルを作ってcronに設定するだけです。

またログ出力用にフォルダを作成しています。
ログ出力はclamavの権限で実行されるので権限を与えます。

[root@hoge ~]# mkdir /var/log/clamd/  
[root@hoge ~]# chown clamav:clamav /var/log/clamd/  
[root@hoge ~]# vi /etc/clamscan.exclude  
  
# proc, sysは仮想ファイルのためエラーを招く。除外  
# sysはシステムじゃなくてプロセスやドライバなど。procみたいなものが入っているらしい  
# bootは誤検出で削除されるとやばいから除外  
[root@hoge ~]# cat /etc/clamscan.exclude  
/boot  
/sys  
/proc  
[root@hoge ~]# chown clamav:clamav /etc/clamscan.exclude  
[root@hoge ~]# chmod 644 /etc/clamscan.exclude  
  
# https://gist.github.com/matchy2/4334403 参照  
[root@hoge ~]# vi virusscan  
[root@hoge ~]# cat virusscan  
#!/bin/bash  
  
MAILTO="hogehoge@fugafuga.com"  
PATH=/usr/bin:/bin  
   
# excludeopt setup  
excludelist=/etc/clamscan.exclude  
if [ -s $excludelist ]; then  
  for i in `cat $excludelist`  
  do  
    if [ $(echo "$i"|grep \/$) ]; then  
      i=`echo $i|sed -e 's/^\([^ ]*\)\/$/\1/p' -e d`  
      excludeopt="${excludeopt} --exclude-dir=^$i"  
    else  
      excludeopt="${excludeopt} --exclude=^$i"  
    fi  
  done  
fi  
  
# clamd update  
yum -y update clamd > /dev/null 2>&1  
freshclam > /var/log/clamd/clamav.log  
   
# virus scan  
CLAMSCANTMP=`mktemp`  
clamscan --recursive --remove ${excludeopt} / > $CLAMSCANTMP 2>&1  
[ ! -z "$(grep FOUND$ $CLAMSCANTMP)" ] && \  
   
# when detect virus, send mail  
grep FOUND$ $CLAMSCANTMP | mail -s "Virus Found in `hostname`" $MAILTO  
rm -f $CLAMSCANTMP  
  
[root@hoge ~]# yum install -y mailx  
[root@hoge ~]# chmod +x virusscan  
[root@hoge ~]# mv virusscan /etc/cron.daily/  

シェルのコードはコメントにも書いてありますが、こちらを参考にさせていただきつつ、ちょっと変えてあります。

シェルの中でfreshclamを実行していますが、実はyumでclamdをインストールするとcron.dailyにfreshclamを行うシェルが登録されているので不要です。
ただcron.dailyは実行タイミングや順番があまり明確に担保されていた気がしないので、明示的に指定しています。

最後mailxをインストールしていますが、これは私の環境ではmailxが入っていなかったためです。
minimalインストールを行っている方はmailコマンドがないと思うので、インストールしましょう。

ファイルの権限を調整して、cronに突っ込んだら終わりです。
これで毎日朝の4時くらいに毎日ウイルススキャンが実行されます。
ウイルスを検知するとメールで教えてくれます。

cron.dailyなどは時間が非常に適当なので明示的に指定したい場合にはcrontab -eで直接指定してください。

あとがき

今まで数年サーバを稼働させていますが、一度もエラーメールが送られてきたことがありません。
サーバの場合には、検知してメールが送られてきたらサーバクリーンしたほうがいいんじゃないかと思わなくもないですが現実そうもいかなかったりしますよね。