ウイルス対策

2021年11月17日

動作確認済みシステム Debian 11

ウイルス対策のために、ClamAVを導入し、定期スキャンを設定します。

リポジトリにあるClamAVは、バージョンが古いことがあるので、ソースコードからインストールする方法を説明します。今回インストールするClamAVのバージョンは、1.2.0です。

まず、稼働中のサーバーのカーネルが fanotify をサポートしていることを確認します。

CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y

の2行が確認できればOKです。

ls /boot/config*
/boot/config-5.10.0-9-amd64
cat /boot/config-5.10.0-9-amd64 | grep FANOTIFY
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y

必要なパッケージをインストールします。

apt install gcc make pkg-config python3 python3-pip python3-pytest valgrind check libbz2-dev libcurl4-openssl-dev libjson-c-dev libmilter-dev libncurses5-dev libpcre2-dev libssl-dev libxml2-dev zlib1g-dev libsystemd-dev

python3でcmakeをインストールします。

python3 -m pip install cmake

Rustもインストールする必要があります。こちらを参考にインストールしてください。
Rustツールチェーンのインストール

clamav用のグループ、ユーザーを作成します。

groupadd clamav
useradd -g clamav -s /bin/false -c "Clam Antivirus" clamav

clamavのソースコードをダウンロードします。

cd /usr/local/src/
wget https://www.clamav.net/downloads/production/clamav-1.2.0.tar.gz

ダウンロードしたtar.gzファイルを展開します。

tar zxvf clamav-1.2.0.tar.gz

展開したディレクトリの中にbuildディレクトリを作成し、その中に入ります。

cd clamav-1.2.0
mkdir build && cd build
cmake .. -D CMAKE_INSTALL_PREFIX=/usr -D CMAKE_INSTALL_LIBDIR=lib -D APP_CONFIG_DIRECTORY=/etc/clamav -D DATABASE_DIRECTORY=/var/lib/clamav -D ENABLE_JSON_SHARED=OFF
cmake --build .
ctest
cmake --build . --target install

ウイルススキャンを定期的に実行するためのスクリプトファイルと、リアルタイムスキャンでウイルスが見つかった場合に実行するためのスクリプトファイルを置くフォルダを作成し、その中に入ります。

cd /root/
mkdir bin
cd bin

ウイルススキャンの定期実行スクリプトを作成します。

vi virus_scan.sh
#!/bin/bash

SCANDIR=/
VIRUS_MVDIR=/root/virus
MAILADDR=administrator@example.com
CLAMDSCAN=/bin/clamdscan
HOSTNAME="example.com"
RUNDATE=`date +%Y%m%d-%H%M%S`
SCANTMP=/var/tmp/clamdscan-cron_$RUNDATE
LOGFILE=/var/log/clamav/clamdscan-cron_$RUNDATE.log

$CLAMDSCAN -l $LOGFILE $SCANDIR > $SCANTMP 2>&1

# Mail notification 
[ ! -z "$(grep FOUND$ $SCANTMP)" ] && \
cat $SCANTMP | mail -s "[$HOSTNAME] Virus Found $RUNDATE" $MAILADDR
 
[ -z "$(grep FOUND$ $SCANTMP)" ] && \
cat $SCANTMP | mail -s "[$HOSTNAME] Virus Not Found $RUNDATE" $MAILADDR
 
rm -f $SCANTMP

リアルタイムスキャンでウイルスが見つかった場合に実行するスクリプトファイルを作成します。

cd /root/bin/
vi found_virus.sh
#!/bin/bash
HOSTNAME="example.com"
MAILADDR=administrator@example.com

export LANG=C
 
message="Virus Found: $CLAM_VIRUSEVENT_VIRUSNAME in $CLAM_VIRUSEVENT_FILENAME"

echo "$message" | mail -s "[$HOSTNAME] Virus Found" $MAILADDR

作成したそれぞれのスクリプトに実行権限を与えます。

chmod +x virus_scan.sh
chmod +x found_virus.sh

作成したスクリプトを文法チェックします。

/bin/bash -n virus_scan.sh
/bin/bash -n found_virus.sh

何も表示されなければ、文法チェックOKです。

設定ファイルをコピーします。

cd /etc/clamav/
cp clamd.conf.sample clamd.conf
cp freshclam.conf.sample freshclam.conf

設定を行います。

vi /etc/clamav/clamd.conf
# コメント化
#Example

# コメント解除
LogFile /var/log/clamav/clamav.log

# コメント解除
LogFileMaxSize 2M

# コメント解除
LogTime yes

# コメント解除
LogRotate yes

# コメント解除
PidFile /var/run/clamd.pid

# コメント解除
TemporaryDirectory /var/tmp

# 追記
LocalSocket /var/run/clamav/clamd.ctl

# コメント解除
LocalSocketMode 660

# コメント解除
FixStaleSocket yes

# コメント解除
TCPSocket 3310

# コメント解除
TCPAddr localhost

# 追記
ExcludePath ^/proc/
ExcludePath ^/sys/
ExcludePath ^/dev/
ExcludePath ^/var/lib/
ExcludePath ^/var/log/
ExcludePath ^/etc/
ExcludePath ^/run/

# 追記
VirusEvent /root/bin/found_virus.sh

# 変更
#User clamscan
User root

# 追記
OnAccessIncludePath /home
OnAccessIncludePath /var/www

# コメント解除
OnAccessExtraScanning yes

# 追記
OnAccessExcludeRootUID yes

# コメント解除
OnAccessExcludeUname clamav
vi /etc/clamav/freshclam.conf
# コメント化
#Example

# 追記
UpdateLogFile /var/log/clamav/freshclam.log

# コメント解除
LogFileMaxSize 2M

# コメント解除
LogTime yes

# コメント解除
LogRotate yes

# コメント解除
DatabaseOwner clamav

# 修正
DatabaseMirror database.clamav.net
DatabaseMirror db.jp.clamav.net

# 追記
NotifyClamd /etc/clamav/clamd.conf

clamavのログディレクトリを作成し、所有ユーザ・所有グループを設定します。

mkdir /var/log/clamav/
chown clamav:clamav /var/log/clamav

ウイルス定義ファイルを更新します。

freshclam

サービスの起動、自動起動設定を行います。

systemctl enable clamav-daemon.service
systemctl start clamav-daemon.service

systemctl enable clamav-freshclam.service
systemctl start clamav-freshclam.service

systemctl enable clamav-clamonacc.service
systemctl start clamav-clamonacc.service

インストール直後は、テストファイルが存在しているので、テストファイルを検出しながら、削除します。

cd /usr/local/src/clamav-0.104.1/build/unit_tests/input/
clamdscan ./ --remove

定期実行の設定を行います。

vi /etc/cron.d/virus_scan
MAILTO=root
00 4 * * 0 root /root/bin/virus_scan.sh

毎週日曜日の4時にrootユーザで/root/bin/virus_scan.shを実行する、という設定です。

これで、ClamAVを使って、定期ウイルススキャンとリアルタイムスキャンができるようになりました。