rokkonet

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

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

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
Ubuntu 18.04: ClamAVでウィルススキャンを実行する - Narrow Escape
【Ubuntu 20.04/18.04 LTS Server】ClamAVで定期的にウイルスチェックし、メール通知する | The modern stone age.


clamscanによるウイルススキャンは低速だが高機能
clamdデーモンを使うclamdscanによるウイルススキャンは高速だが低機能

準備作業

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

Ubuntu

# apt install clamav clamav-daemon


(Arch系Manjaro Linux

# pacman -S clamav

ウイルス定義更新

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

# freshclam

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

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


(エラー対応ログ設定)

# rm /var/log/clamav/freshclam.log
# touch /var/log/clamav/freshclam.log
# 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


(確認)

# freshclam


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

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


clamdscanに必要なclamav-daemonの設定

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

# mkdir /var/moved_virus
# 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は廃止されたので設定しない

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

参考元 如是我聞 - a blog about life and tech

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

$ su -
# apt install apparmor-utils
# aa-complain clamd


(Arch系Manjaro Linux
AppArmorがインストールされていなかった。

CPUへの高負荷対策

参考元 Debian 9.3 ClamAV高負荷問題の対処2 (Linux自作PC) - ksk-log
/lib/systemd/system/clamav-daemon.service の [Service]セクションに CPUQuota=50% と記述する。
cpu不可が高いのでCPUQuota=25%に変更した。

設定反映

# systemctl daemon-reload
# systemctl status clamav-daemon.service

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

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

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

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

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

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

# systemctl start clamav-freshclam.service

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

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

$ cd YOUR/WORKING/DIR
$ wget http://www.eicar.org/download/eicar.com

$ clamdscan --multiscan --fdpass --move VIRUS/MOVED/DIR YOUR/WORKING/DIR > OUTPUT.txt
$ echo $?
  ## --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. 
  
  ## clamdscanの返り値(リターンコード)
  ## 0 : No virus found
  ## 1 : Virus(es) found
  ## 2 : An error occurred 

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

(OUTPUT.txt)

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

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

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

# crontab -e

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

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

参考ページ
systemdでtimerの作り方(最小限のサンプル) - 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 /
スクリプトに実行権限付与
# 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の有効化
# systemctl enable myclamdscan.service
systemdタイマーファイル作成

/etc/systemd/system/myclamdscan.timer

[Unit]
Description=Runs myclamdscan.service

[Timer]
# ブート後、この時間後にこのタイマーを開始する
OnBootSec=1min
# 実行する時間の間隔
OnUnitActiveSec=4d 
Unit=myclamdscan.service

[Install]
WantedBy=multi-user.target

myclamdscan.timerの有効化
systemctl enable myclamdscan.timer
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) - ksk-log より)


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

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

デーモン起動

# systemctl restart clamav-daemon.service

ウイルススキャン

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