rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

clam anti-virus / clamAVの Ubuntu / Arch系Manjaro Linuxへのインストール

2024 Feb. 25.
2022 Feb. 11.
2021 Nov. 21.
2021 Jun. 05.
2021 May 02.
2021 Apr. 27.
2021 Mar. 28.
2021 Jan. 31.
2020 Sep. 21.

参考元
Ubuntu Desktop 18.04でClamAVによるウィルスチェックを実行する!
Ubuntu 20.04 LTS : Clamav アンチウィルス : Server World
https://www.hiroom2.com/2018/05/06/ubuntu-1804-clamav-ja/
【Ubuntu 20.04/18.04 LTS Server】ClamAVで定期的にウイルスチェックし、メール通知する | The modern stone age.


clamscanによるウイルススキャンは低速だが高機能。
clamdデーモンを使うclamdscanによるウイルススキャンは高速だが低機能。
この記事ではclamdscanを利用する。

準備作業

パッケージをインストール

Ubuntu

$ sudo apt update && sudo apt install clamav clamav-daemon


(Arch系Manjaro Linux

# pacman -S clamav

ウイルス定義更新

出典 【Ubuntu 20.04/18.04 LTS Server】ClamAVで定期的にウイルスチェックし、メール通知する | The modern stone age.

$ sudo freshclam

上記freshclamで次のエラーが出たら、下記のログ設定を行う
(エラー出力例)

$ 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!


(エラー対応ログ設定)

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

/etc/logrotate.d/clamav-freshclamもしくは/etc/logrotate.d/clamavを修正する
変更前:create 640 clamav adm
変更後:create 640 clamav clamav


(確認)

$ sudo freshclam


ウイルス定義の自動更新起動状況確認
$ systemctl status  clamav-freshclam.service

(clamav-freshclam.serviceが動いていなかったら)
$ sudo systemctl enable  clamav-freshclam.service
$ sudo systemctl start  clamav-freshclam.service


clamdscanに必要なclamav-daemonの設定

ウイルスを移動する設定の時の移動先ディレクトリの作成

$ sudo mkdir /var/moved_virus
$ sudo chmod 777 /var/moved_virus


/etc/clamav/clamd.conf を編集
設定項目リスト CentOS6:ClamAV(Clam AntiVirus)のインストール及び設定(1) | Engineer Log

## rootなファイルをスキャンできるようにユーザーをrootにする
# User clamav
User root

### スキャンするファイルサイズを無制限にする
## スキャンされるデータの最大量
#MaxScanSize 100M
MaxScanSize 0

## 通常のファイルと、アーカイブから展開されたファイルの最大サイズ
#MaxFileSize 25M
MaxFileSize 0

## ディレクトリ深さ
#MaxDirectoryRecursion 15
MaxDirectoryRecursion 20

## スキャンしないファイル・ディレクトリ
ExcludePath ^/dev/
ExcludePath ^/proc/
ExcludePath ^/sys
ExcludePath ^/var/moved_virus/

## ScanOnAccessは廃止されたので設定しない。clamAVでのオンアクセススキャンにはfanotifyを利用する。

(Ubuntuでは)ClamAV をrootで実行できるようにAppArmorによる制限を外す。

参考元 Linuxでウイルス対策 – ClamAVのインストールと初期設定 | 如是我聞 - a blog about life and tech

Ubuntu
AppArmor Utilsをインストールし、ClamAVへのAppArmorによる制限を外す

$ sudo apt install apparmor-utils
$ sudo aa-complain clamd



(Arch系Manjaro Linux

# aa-complain clamd


CPUへの高負荷対策

参考元 Debian 9.3 ClamAV高負荷問題の対処2 (Linux自作PC)
/lib/systemd/system/clamav-daemon.service の [Service]セクションに CPUQuota=50% と記述する。

設定反映

$ sudo systemctl daemon-reload
$ systemctl status clamav-daemon.service

(動いていなかったら)
$ sudo systemctl enable clamav-daemon.service
$ sudo systemctl start clamav-daemon.service

(動いていたら)
$ sudo systemctl restart clamav-daemon.service

データベースを更新する
$ sudo systemctl stop clamav-freshclam.service
$ sudo freshclam 

上記での出力を確認しておく

データベースの自動更新設定

/etc/clamav/freshclam.conf内のChecks設定が1日の更新回数

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

clamav-daemonを利用したclamdscanによるスキャンを試しに実行する

無害ウイルスをダウンロードして、スキャンしてみて、リターンコードを確認する。

$ cd YOUR/WORKING/DIR
$ wget https://secure.eicar.org/eicar.com.txt

$ clamdscan --multiscan --fdpass --move VIRUS/MOVED/DIR YOUR/WORKING/DIR > OUTPUT.txt
  ## --multiscan 複数のスレッドを使用するため、処理速度が向上
  ## --move VIRUS/MOVED/DIR ウイルスファイルの移動先ディレクトリ
  ##  YOUR/WORKING/DIR スキャンするディレクトリ。子ディレクトリもスキャンされる
  ## --remove ウイルスファイルを削除する
  ## --quiet 出力を抑制
  ## --log=FILE ファイルに保存。デフォルトは/etc/clamav/clamd.conf内のLogFile指定
  ## --fdpass
  ##   他のユーザが実行しているclamdデーモンでスキャン。
  ##  clamav-daemon.serviceを実行するclamdユーザーとしてファイルをスキャン。
  ##  Pass the file descriptor permissions to clamd. This is useful if clamd is running as a different user as it is faster than streaming the file to clamd. Only available if connected to clamd via local(unix) socket. 

$ echo $?
  ## clamdscanの返り値(リターンコード)
  ## 0 : No virus found
  ## 1 : Virus(es) found
  ## 2 : An error occurred 

返り値を確認する
画面出力と/var/log/clamav/clamav.logでeicar.com.txt(無害ウイルス)の検知を確認する。
ログ(OUTPUT.txt)で「ウイルスファイルのrenameに失敗」「ハードリンクはできない」とか出力されるが、ウイルスファイルが移動先ディレクトリに移動されていた。

(OUTPUT.txt)

eicar.com.txt: Win.Test.EICAR_HDB-1 FOUND
traverse_rename: Failed to rename: eicar.com.txt
        to: moved_virus/eicar.com.txt.001
Error:Invalid cross-device link
eicar.com.txt: moved to 'moved_virus/eicar.com.txt.001'

----------- SCAN SUMMARY -----------
Infected files: 1
Time: 1.165 sec (0 m 1 s)
Start Date: 2024:02:25 18:29:04
End Date:   2024:02:25 18:29:05

  2021 Apr. 23. Ubuntuで、--multiscanを付けるとリターンコードが139となり動作しなくなった。
  2022 Feb. 10. Ubuntuで、--multiscanを付けても動作した。

clamdscanをcron設定しておく(Arch系のManjaro Linuxではsystemd/タイマーを利用するのが標準)

$ sudo crontab -e

23  1   *   *   *   clamdscan --log=/var/log/clamav/clamdscan.log --multiscan --fdpass --quiet --move /var/moved_virus /

上記の定期設定で動作したので、サーバーPCはこの設定とした。

デスクトップPCで、システム起動時の実行としてcronで@reboot設定にすると
ERROR: Could not connect to clamd on LocalSocket /var/run/clamav/clamd.ctl: No such file or directory
となったので、下記の "systemd/タイマーへの定期実行設定" に変更した。
@reboot clamdscan --log=/var/log/clamav/clamdscan.log --multiscan --fdpass --quiet --move /var/moved_virus /


systemd/タイマーへの定期実行設定

参考ページ
systemdでtimerの作り方(最小限のサンプル) #systemd - Qiita
systemd/タイマー - ArchWiki
systemd .timerについて調べた事を記事にしておく | そう備忘録

実行するスクリプト作成

( /YOUR/SCRIPT/myclamdscan.sh)

#!/bin/bash
/usr/bin/clamdscan --log=/var/log/clamav/clamdscan.log --multiscan --fdpass --quiet --move /var/moved_virus /
スクリプトに実行権限付与
$ sudo chmod 755 /YOUR/SCRIPT/myclamdscan.sh

systemdサービスファイル作成

/etc/systemd/system/myclamdscan.service

[Unit]
Description=myClamdScan

[Service]
Type=simple
ExecStart=/YOUR/SCRIPT/myclamdscan.sh

[Install]
WantedBy=multi-user.target

myclamdscan.serviceの有効化
$ sudo systemctl enable myclamdscan.service
systemdタイマーファイル作成

/etc/systemd/system/myclamdscan.timer

[Unit]
Description=Runs myclamdscan.service

[Timer]
# ブート後、この時間後にこのタイマーを開始する。1minでは動作しなかったので2minにした。
OnBootSec=2min
# 実行する時間の間隔
OnUnitActiveSec=4d 
Unit=myclamdscan.service

[Install]
WantedBy=multi-user.target

myclamdscan.timerの有効化
$ sudo systemctl enable myclamdscan.timer
$ sudo systemctl start  myclamdscan.timer



clamdscanの返り値をメールするようにしたらよいかも。






以下は参考程度に

ウイルス定義ファイル更新設定変更

/etc/clamav/freshclam.conf を修正する
 ウイルス定義ファイル更新時のclamdサービスへの通知を非通知に設定する
  # NotifyClamd // NotifyClamd行をコメント行にする

  DatabaseMirror のドメインをjp に(db.XY.clamav.net→ db.jp.clamav.net)

ウイルス定義ファイル更新時にclamav-freshclam(ウイルス定義ファイル自動更新プログラム)が稼働しているとエラーを吐くので止める

# systemctl stop clamav-freshclam.service

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

# freshclam

画面出力とログ/var/log/clamav/freshclam.logを確認する

手動ウイルススキャン設定

clamav-freshclamによるデータベース更新の間隔設定

/etc/clamav/freshclam.confのChecksの値で1日の更新回数を設定

ウイルス定義ファイル自動更新を起動

# systemctl start clamav-freshclam.service

デフォルトでは各種ファイル属性がclamavなのでrootに変更(この属性変更は不要か)

# chown root:clamav /var/log/clamav/freshclam.log
# chown root:clamav /var/lib/clamav
# chown root:clamav /var/lib/clamav/*

手動動作確認

お試し無害ウィルスをダウンロード
$ cd YOUR/WORKING/DIR
$ wget http://www.eicar.org/download/eicar.com


汚染ファイル隔離先ディレクトリを作成
$ mkdir ~/virus


手動ウイルススキャン実行
$ clamscan --infected --remove --recursive --move=${HOME}/virus --exclude-dir="^/dev/" --exclude-dir="^/proc/" --exclude-dir="^/sys/" DIR/TO/BE/SCANNED

結果が画面出力(標準出力か標準エラー出力か未確認)

clamdデーモンによる高速手動ウイルススキャン設定

clamdはサーバとして動作し、clamdscanコマンドを用いてソケット通信を介してウイルス検査を実行する。
clamscanよりも実行速度は速い
( 【Ubuntu 20.04/18.04 LTS Server】ClamAVで定期的にウイルスチェックし、メール通知する | The modern stone age. より )

デーモンパッケージインストール

# apt install clamav-daemon

データベース更新の間隔設定

/etc/clamav/clamd.confのSelfCheckの値の秒数間隔で更新される

スキャン実行者をrootにする

/etc/clamav/clamd.confのUser設定行をコメント行にする
 # User clamav (clamavユーザーのままだとroot属性のファイルをスキャンできない)

ウイルススキャン時に"Directory recursion limit reached"と出るなら

/etc/clamav/clamd.confのMaxDirectoryRecursionを25にしてみる

MaxDirectoryRecursion 25

( Debian 9.3 ClamAV高負荷問題の対処 (Linux自作PC) より)


システムに高負荷がかかっているようなら

/lib/systemd/system/clamav-daemon.service の [Service]セクションに CPUQuota=50% と設定してみる
( Debian 9.3 ClamAV高負荷問題の対処2 (Linux自作PC) より)

デーモン起動

# systemctl restart clamav-daemon.service

ウイルススキャン

参考元
clamav - 「clamdscan」でフォルダを除外し、「-infected」のみをログに記録する方法は? - 初心者向けチュートリアル
オープンソースのアンチウイルスソフトウェア、ClamAVをCentOS 7にインストールする #CentOS - Qiita


設定
/etc/clamav/clamd.confの編集(正規表現可能)

# Example  // Exampleはコメント行にする
User root
ExcludePath ^/dev/
ExcludePath ^/proc/
ExcludePath ^/sys/


ウイルススキャン実行とオプション
# clamdscan --multiscan --fdpass --quiet /DIR/TO/BE/SCANNED > OUTPUT.txt
  --multiscan 複数のスレッドを使用するため、処理速度が向上
  --quiet 感染ファイルを除くすべての出力を抑制
  --log=FILE ファイルに保存(出力リダイレクトでも可能)
  --fdpass
    clamav-daemon.serviceを実行するclamdユーザーとしてファイルをスキャン。
    他のユーザが実行しているclamdデーモンでスキャン。
    Pass the file descriptor permissions to clamd. This is useful if clamd is running as a different user as it is faster than streaming the file to clamd. Only available if connected to clamd via local(unix) socket.

  clamdscanの返り値(リターンコード)
   0 : No virus found.
   1 : Virus(es) found.
   2 : An error occurred.

   参考 clamscanとclamdscanの使用方法 - tech.farend
      clamdscan lstat() failed: Permission denied | まあのぶつぶつ
      Configure clamdscan to scan all files on a system on Ubuntu 12.04 - Stack Overflow
      clamav - 「clamdscan」でフォルダを除外し、「-infected」のみをログに記録する方法は? - 初心者向けチュートリアル


clamdscanで再起的なスキャン実行
# ls -R DIR/TO/BE/SCANNED | grep / | tr -d : | xargs clamdscan
clamscanとclamdscanの使用方法 - tech.farend より)