Ubuntu 20.04にClamAVというアンチウイルスソフトをインストールする

ClamAVとは

ClamAVは、OSSアンチウイルスソフトウェアです。 オフィシャルサイトはこちらになります。

ja.wikipedia.org

元々はメールゲートウェイでE-Mailのウイルススキャンを行うことを主目的として開発されていたそうです。 しかし、Windowsで使うような一般的なアンチウイルスソフトと同様に、ウイルス定義ファイル(パターンファイル)を基に、ファイルを検査するウイルススキャン機能もあります。

ウイルス定義ファイルは、インターネット上の配布サーバーで随時更新・配布されており、最新のウイルス定義を取得できます。 マルウェアをリアルタイムで検知する常駐監視機能(オンアクセススキャン、リアルタイムスキャン)も設定することができます。

インストール

以下のコマンドでapt経由でclamavをインストールする。

$ sudo apt update

$ sudo apt install clamav clamav-daemon

clamavのデーモンの状態を見てみる。

$ sudo systemctl status clamav-daemon

以下のような表示がされており、正しく動作していない場合がある。

Condition: start condition failed

Condition check resulted in Clam AntiVirus userspace daemon being skipped.

その場合は、clamav-freshclamを再起動した後に、再度clamav-daemonを再起動するとうまく動作するらしいです。

$ sudo systemctl restart clamav-freshclam
$ sudo systemctl restart clamav-daemon

ウイルス定義ファイルの更新

デーモンとして動作しているclamav-freshclamは何をしているのか。

これが起動していれば、自動的にウイルス定義ファイルを更新してくれる。

$ sudo systemctl start clamav-freshclam.service 
$ sudo systemctl status clamav-freshclam.service
     Loaded: loaded (/lib/systemd/system/clamav-freshclam.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-11-27 18:34:52 JST; 13min ago
       Docs: man:freshclam(1)
             man:freshclam.conf(5)
             https://www.clamav.net/documents
   Main PID: 967962 (freshclam)
      Tasks: 1 (limit: 18770)
     Memory: 2.0M
     CGroup: /system.slice/clamav-freshclam.service
             └─967962 /usr/bin/freshclam -d --foreground=true

以下のコマンドでバックグラウンドで動作していることがわかる。 -dなどのコマンドオプションは何なのかを調べてみる。

manコマンドで詳細が分かる。

$ freshclam -d --foreground=true

$ man freshclam

-dのオプションについて見てみると、以下のように書かれている。 デーモンモードで動作し、デフォルトでは1日12回更新のチェックを行う。

freshclam.confで詳細の設定が行え、ファイルの場所は/etc/clamav/freshclam.confにある。

-d, --daemon

Run  in  a  daemon  mode.
Defaults  to  12  checks per day unless otherwise specified by --checks or fresh‐clam.conf.

ログは通常であれば、/var/log/clamav/freshclam.logにある。

$ tail -f /var/log/clamav/freshclam.log

ウイルス定義の更新設定

ウイルス定義ファイルの更新を行うためのサーバーを設定できる。 ここれでは日本のミラーサーバーを追加登録する。

DatabaseMirror db.local.clamav.netコメントアウトして、DatabaseMirror db.jp.clamav.netを追加する。

DatabaseMirror db.jp.clamav.net
# DatabaseMirror db.local.clamav.net
DatabaseMirror database.clamav.net

手動更新を行ってみる

以下のコマンドを打つと手動でウイルス定義ファイルを更新できるが、以下のようなエラーが表示される場合がある。

$ sudo freshclam

WARNING: Ignoring deprecated option SafeBrowsing at /etc/clamav/freshclam.conf:22
ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).
ERROR: initialize: libfreshclam init failed.
ERROR: Initialization error!

エラーを見てみると、ログ周りにエラーが出ていることがわかる。

www.yokoweb.net

上記によれば、一度ログファイルを削除して、ログロテートの設定を変更しておく必要があるらしい。

$ sudo rm /var/log/clamav/freshclam.log
$ sudo touch /var/log/clamav/freshclam.log
$ sudo chown clamav:clamav /var/log/clamav/freshclam.log

次にログロテートの設定を変更する。

$ sudo vim /etc/logrotate.d/clamav-freshclam

以下の箇所を見つけて変更を行う。

create 640 clamav adm
  ↓
create 640 clamav clamav

再度、手動実行のコマンドを実行して、以下のような表示が出れば成功となる。

$ sudo freshclam
Sat Nov 27 19:11:04 2021 -> ClamAV update process started at Sat Nov 27 19:11:04 2021
Sat Nov 27 19:11:04 2021 -> ^Your ClamAV installation is OUTDATED!
Sat Nov 27 19:11:04 2021 -> ^Local version: 0.103.2 Recommended version: 0.103.4
Sat Nov 27 19:11:04 2021 -> DON'T PANIC! Read https://www.clamav.net/documents/upgrading-clamav
Sat Nov 27 19:11:04 2021 -> daily.cvd database is up-to-date (version: 26366, sigs: 1948040, f-level: 90, builder: raynman)
Sat Nov 27 19:11:04 2021 -> main.cvd database is up-to-date (version: 62, sigs: 6647427, f-level: 90, builder: sigmgr)
Sat Nov 27 19:11:04 2021 -> bytecode.cvd database is up-to-date (version: 333, sigs: 92, f-level: 63, builder: awillia2)

手動でウイルススキャン

--infected(-i)で感染したファイルのみを出力し、--removeで感染したファイルを削除する。(--remove=を付けることでyes/noで選択することが可能だが、デフォルトではyes`になっている)

--recursive(-r)でディレクトリを再帰的にスキャンされ、指定されたディレクトリ内のすべてのサブディレクトリがスキャンされる。

$ sudo clamscan --infected --remove --recursive <target_directory>

例えば、以下のコマンドでは/homeディレクトリ配下に対してウイルススキャンを行い、感染したファイルを削除する。

$ sudo clamscan --infected --remove --recursive /home

以下のコマンドでアンチウイルスソフト用の無害なマルウェアをダウンロードすることができるので、これを使ってclamscanで動作確認をする。

$ wget http://www.eicar.org/download/eicar.com
$ ls -la|grep eicar
-rw-rw-r--  1 user user        68  7月  2  2020 eicar.com

実際に以下のコマンドでスキャンを行ってみる。(今回は削除をしないため、--removeオプションはつけない。)

FOUNDと表示とされるのがマルウェアとして検出されたファイルとなる。 Infected files: 1という表示で検出されたのは一つだけとなる。

$ clamscan --infected --recursive ./eicar.com
/home/user/workspace/eicar.com: Win.Test.EICAR_HDB-1 FOUND

----------- SCAN SUMMARY -----------
Known viruses: 8580206
Engine version: 0.103.2
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 21.520 sec (0 m 21 s)
Start Date: 2021:11:27 19:46:59
End Date:   2021:11:27 19:47:21

スキャン結果の詳細

スキャン結果の各項目について解説します。

----------- SCAN SUMMARY -----------
Known viruses: 8580206
Engine version: 0.103.2
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 21.520 sec (0 m 21 s)
Start Date: 2021:11:27 19:46:59
End Date:   2021:11:27 19:47:21
  • Known viruses: ウイルス定義数
  • Engine version: ClamAVのバージョン
  • Scanned directories: スキャンしたディレクトリ数
  • Scanned files: スキャンしたファイル数
  • Infected files: ウイルス検知数
  • Data scanned: スキャンしたファイルサイズの合計
  • Data read: スキャン走査したデータサイズ(圧縮データの展開分含む?)の合計
  • Time: スキャン処理時間

オンアクセススキャンの設定を行う

ファイルアクセスの度にウイルススキャンを実行するオンアクセススキャンという機能があるが、デフォルトでは無効になっている。

自分の場合は重くなるのが嫌であるため、通常はOFFにしている。 ファイルの読み書きのたびにスキャン処理を行うため、各プロセスの処理が遅くなったり、常時、CPUおよびメモリリソースを使用してしまいます。

もし、ファイルサーバーなどを構築した際には、ファイルをアップロードする度にウイルススキャンを実行するなどにもなるため、有効になるかもしれない。

もし定期的に全体のウイルススキャンなどを行いたい場合は、cronなどを利用した1日1回または2回などの定期スキャンがおすすめです。

以下の設定で、このオンアクセススキャンを有効にすることができる。

# 設定ファイルをエディタで開く
$ vim /etc/clamav/clamd.conf
# 以下の箇所を変更
ScanOnAccess true
User root

# 以下を追記する
OnAccessMountPath /
OnAccessPrevention false
OnAccessExtraScanning true
OnAccessExcludeUID 0
VirusEvent /opt/clamav-utils/clamd-response.sh

上記の設定では、オンアクセススキャン対象とするディレクトリをルートディレクトリ以下全て(OnAccessMountPath)に設定している。 全てのファイルへの読み取り権限が必要なため、実行ユーザーはrootに設定する必要がある。

一番最後のVirusEventという設定は、マルウェアが見つかった時に任意のスクリプトを実行させることができる。ここでは/opt/clamav-utils/clamd-response.shというスクリプトを実行させるように設定している。

clamdscanを使った方法

clamav-daemonパッケージを上記のapt経由でインストールしたが、これをインストールすることでclamdのサービスが起動する。 clamdはサーバとして動作し、clamdscanコマンドを用いる。(先程実行したのはclamscanコマンド)

clamdscanコマンドは、ソケット通信を介してウイルス検査を実行する。デーモンが必要で管理が複雑となるが、clamscanよりも実行速度は速い。 他にもマルチスレッド実行が可能となる。(-mオプションをつけることでマルチスレッド実行が可能となる)

デフォルトでは、データベースファイルの更新を1時間毎(3600秒)にチェックしている。 下記コマンドで更新の時間を変更することができる。

$ vim /etc/clamav/clamd.conf
SelfCheck 3600

実際にclamdscanコマンドを使って手動チェック実行してみる。clamscanよりも高速なため、すぐに結果が表示されるはず。問題点としては、clamscanよりも一部の引数が使えない。

$ sudo clamdscan ./eicar.com
/home/user/workspace/eicar.com: Win.Test.EICAR_HDB-1 FOUND

----------- SCAN SUMMARY -----------
Infected files: 1
Time: 0.003 sec (0 m 0 s)
Start Date: 2021:11:27 20:13:55
End Date:   2021:11:27 20:13:55

自動でウイルススキャンを実行させる

festina-lente.blog

#!/bin/sh
echo =========================================
date
hostname
clamscan / \
     --infected \
     --recursive \
     --log=/var/log/clamav/clamscan.log \
     --move=/var/log/clamav/virus \
     --exclude-dir=^/boot \
     --exclude-dir=^/sys \
     --exclude-dir=^/proc \
     --exclude-dir=^/dev \
     --exclude-dir=^/var/log/clamav/virus

# --infected 感染を検出したファイルのみを結果に出力
# --recursive 指定ディレクトリ以下を再帰的に検査 圧縮ファイルは解凍して検査
# --log=FILE ログファイル
# --move=DIR 感染を検出したファイルの隔離先
# --remove 感染を検出したファイルを削除
# --exclude=FILE   検査除外ファイル(パターンで指定)
# --exclude-dir=DIR 検査除外ディレクトリ(パターンで指定)

if [ $? = 0 ]; then
    echo "ウイルス未検出."
    # cat /var/log/clamav/clamscan.log | mail -s "Clamav scan OK." username@localhost
else
    echo "ウイルス検出!!"
    cat /var/log/clamav/clamscan.log | mail -s "Clamav scan NG!" username@localhost
fi

ウイルススキャン実行スクリプトのファイルを移動して実行権限を与える

$ cp clamav-full.sh /opt/script/clamav-full.sh
$ chmod +x /opt/script/clamav-full.sh

cronでウイルススキャンの定期実行を設定する

crontab -e

# m h dom mon dow user  command
# 分 時 日 月 曜日 ユーザー コマンド

# example: 毎日18時に定期的に実行。
# m h  dom mon dow   command
0 18 * * * /opt/script/clamav-full.sh >> /var/log/clamav/clamav_scan.log

# example: 毎週月曜日の18時に定期的に実行。
# m h  dom mon dow   command
0 18 * * mon /opt/script/clamav-full.sh >> /var/log/clamav/clamav_scan.logCopy

GUIであるClamTkのインストール

ClamTkを入れれば、ウイルスキャンの定期実行などの設定をGUIで行うことができる。

$ sudo apt install clamtk

ClamTkを起動すると、以下の画像のようなものが表示される。

f:id:shimakazesofttech:20211127202707p:plain

まず最初に「設定」を開いてみると、以下のような表示がされるはず。

f:id:shimakazesofttech:20211127203039p:plain

詳細な設定は以下に詳しく載っています。

ClamAVのGUI版ClamTkがLinuxの最適ウイルス対策ソフトだった|ざっくりLinux!- 46 | ウラの裏