とーますメモ

Ruby on Rails / Goなどの学習メモ

【ClamAV】Ubuntu18.04にClam AntiVirusを設定してみた

ネット上で調べてみると、

clamscanとclamdscanの違いなどをまずは把握する必要がある。
ClamAV(R)でスキャンしてみる | カメノドットコム

自分の場合、頻繁にスキャンする用途ではなく、
1時間に1回の頻度でスキャンし、レポートメールを受け取れれば
それで良いので以下のように環境を構築した。

※前提として、メールは環境は別途構築済み(Postfix + mailutils)

後述するがリアルタイムスキャンの機能がclamavにもあるが、
メモリリソースを結構消費するので、メモリ消費が少ない時間帯を狙って
実行できるように設定する。

その設定方法は主に以下のサイトを参考にして作成する。(すごい役に立つ内容で感謝!)
ClamAVによる定期ウイルススキャンの設定 | 稲葉サーバーデザイン

1)インストール

$ apt install -y clamav

昔の記事をみるとclamav以外にもclamav-daemonやclamav-freshclamを別途インストールするような
記載がある記事もあるが、
上記だけで、clamav-daemonやclamav-freshclamもインストールされる。
ClamavNet

インストールした時点で、自動でウイルス定義ファイルの更新を行うデーモン(clamav-freshclam)が動いている。
手動で行う場合は、freshclamコマンドを打つ。
https://www.clamav.net/documents/signature-testing-and-management#freshclam

$ freshclam

ちなみにデフォルトだと、clamav-freshclamサービスが動作しているため
そのままfreshclamコマンドを打つと、「/var/log/clamav/freshclam.log is locked by another process」というエラーがでるので
一度サービスを止めてからコマンドを打つ。

$ sudo service clamav-freshclam stop

$ sudo freshclam

$ sudo service clamav-freshclam start

スキャンテスト

[オプション]

  • r・・・サブディレクトリごと再帰的に検査
  • i・・・ウイルスに感染したファイルのみを出力

システム全体のスキャン(ウイルスは削除しない)
$ clamscan -ri /

ホームディレクトリのみ
$ clamscan -ri /home

ウイルスを発見しだい削除
$ clamscan --remove -ri /home

ウイルスを発見したら他のディレクトリに移す
$ clamscan --move=DIRECTORY -ri /home

2)スキャンレポートメールスクリプトの作成

$ vim /etc/cron.d/clamscan

以下のサイトを参考に改造してものを使用。
ClamAVによる定期ウイルススキャンの設定 | 稲葉サーバーデザイン

スクリプト内の以下の変数は環境に応じて設定要
EXCLUDE_LIST_FILE="/etc/clamav/scanvirus_exclude_list.txt
EMAIL_FROM
EMAIL_TO

誤検知を防ぐために、スキャン結果のみを通知する仕組みにしている。

/etc/clamav/scanvirus_exclude_list.txt

/sys/
/proc/
/dev/

/etc/clamav/clamscan.sh

#!/bin/bash

# ClamAVによるウイルススキャンスクリプト clamscan.sh
# ウイルススキャンを実行し、ウイルスを検知したときのみ、
# 指定した宛先にアラートメールを送信する。
# 誤検知もあり得るため、検知しても駆除(削除)は実施しない。
#
# スキャンの実行前には、ClamAVプログラムおよびウイルス定義を
# アップデートする。
#
# スキャンの除外対象ディレクトリ、ファイルは、${EXCLUDE_LIST_FILE}
# ファイルに1行ずつ記載すること。ディレクトリの末尾には、/ をつける。

EXCLUDE_LIST_FILE="/etc/clamav/scanvirus_exclude_list.txt"
LOGFILE="/var/log/clamav/scanlog/clamav-$(date +'%Y-%m-%d_%H:%M:%S').log"
LATEST_SCAN_RESULT="/var/log/clamav/scanresult.txt"

MAX_FILESIZE=200M
MAX_SCANSIZE=200M

EMAIL_FROM=from@example.com
EMAIL_TO=to@example.com

export LANG=C

echo "===== Scan Virus =====" >> ${LOGFILE}

#########################################
#
#         2. ウイルス定義の更新
#
#########################################

echo "`date` Update Database start" >> ${LOGFILE}
/usr/bin/freshclam 1>> ${LOGFILE} 2>&1
echo "`date` Update Database end" >> ${LOGFILE}



#########################################
#
#         3. ウイルススキャンの実施
#
#########################################

echo "`date` Do Scan Virus start" >> ${LOGFILE}

## スキャン除外リストの展開
while read LINE
do
    if [ $(echo "${LINE}"|grep \/$) ]; then
        i=`echo ${LINE}|sed -e 's/^\([^ ]*\)\/$/\1/p' -e d`
        excludeopt="${excludeopt} --exclude-dir=^${LINE}"
    else
        excludeopt="${excludeopt} --exclude=^${LINE}"
    fi
done < ${EXCLUDE_LIST_FILE}

echo "excludeopt: ${excludeopt}" >> ${LOGFILE}



#########################################
#
#         4. ウイルススキャンの実行
#
#########################################

/usr/bin/clamscan \
--max-filesize=${MAX_FILESIZE} --max-scansize=${MAX_SCANSIZE} \
--infected --recursive ${excludeopt} / 1> ${LATEST_SCAN_RESULT} 2>> ${LOGFILE}

# get the value of "Infected lines"
MALWARE=$(tail "$LOGFILE"|grep Infected|cut -d" " -f3);

## ウイルスを検知したときのみ、アラートメールで通知する
if [ "$MALWARE" -ne "0" ];then
  cat ${LATEST_SCAN_RESULT} | mail -s "Virus Found in `hostname`" -a "From: ${EMAIL_FROM}" -r ${EMAIL_FROM} ${EMAIL_TO}
fi

cat ${LATEST_SCAN_RESULT} >> ${LOGFILE}

echo "`date` Do Scan Virus end" >> ${LOGFILE}

ex) 毎日17:00時に動作する設定
/etc/cron.d/clamscan

drwxr-xr-x   2 root root 4096 Mar 17 20:51 ./
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
# 分 時 日 月 曜日 ユーザー コマンド
0 17    * * *   root    cd /etc/clamav/ && ./clamscan.sh

あとは実行権限を付与するだけ。

$ chmod 0755 /etc/cron.d/clamscan

これで指定した時間にスキャンされ、レポートメールが届く。

リアルタイムスキャン(今回は設定しないが、参考までに。)

デフォルトでは、リアルタイムスキャン(オンアクセススキャン)が適応されていないので
必要ならば適用する必要がある。

しかしこの設定が結構曲者。
clamdのバージョンが0.102.0未満と0.102.0以上で設定方法が違う。
[0.102.0未満]
如是我聞 - a blog about life and tech
Ubuntu 18.04 で ClamAV オンアクセススキャンを使ってみる – Yut@rommx.com
ClamAVのオンアクセススキャンについて - Tbpgr Blog

[0.102.0以上]
Ubuntu16.04LTSにClamAV0.102.1を入れてon access scanning も有効にする | 我輩はイヌである

バージョンの確認方法

$ clamd -V

テスト

無害のテスト用のウイルスを以下のようにダウンロード可能。
※上記スクリプトでは、「/var」内がスキャン対象なので、「/var」以下にダウンロード

$ wget http://www.eicar.org/download/eicar_com.zip -O /var/eicar_com.zip

すぐにテストしたければ、直接スクリプトを実行すればよい。

$ ./etc/cron.hourly/clamscan_hourly

[参考]
Configure Clamav for daily system scans and email notification on Debian

ClamAVによる定期ウイルススキャンの設定 | 稲葉サーバーデザイン
Automate ClamAV to Perform Daily System Scan and Send Email Notifications on Linux | Lisenet.com :: Linux | Security | Networking
【Ubuntu 18.04/16.04 LTS Server】ClamAVで定期的にウイルスチェックし、メール通知する | The modern stone age.