Orange Pi 5 Plusにclamonacc入れた

clamav

約 15 分で読めます。



6月頃に買ったOrange Pi 5 Plusにclamonaccを入れて運用開始しました。
ウィルス検出すると、このようにLINE通知するようにしました。
 以前はメールで通知していた。



clamonaccについては、この記事で解説していますので、ご興味あればどぞ。



↑の記事当時は0.104が最新でしたが、この記事を書いているときは1.2.0が最新になっていました。

Release ClamAV 1.2.0 · Cisco-Talos/clamav
ClamAV 1.2.0 includes the following improvements and changes: Major changes Added support for extracting Universal Disk ...



ビルド方法も少し変わっているので、そのあたり含めてまとめます。

ビルド環境準備

いつからか、rustを使うようになっているようです。
ここに詳しくまとまっていますので、従っていきます。

Unix from source (v0.104+) - ClamAV Documentation
An open source malware detection toolkit and antivirus engine.



必要なパッケージを入れます。

$ sudo apt update && apt install -y \
  `# install tools` \
  gcc make pkg-config python3 python3-pip python3-pytest valgrind \
  `# install clamav dependencies` \
  check libbz2-dev libcurl4-openssl-dev libjson-c-dev libmilter-dev \
  libncurses5-dev libpcre2-dev libssl-dev libxml2-dev zlib1g-dev \
  cmake



先ほど示した公式ページではpython-pytestも入れる、と書いてあるのですが、

Orange Pi 5 Plusだからなのか、↓のようにaptで入れることができませんでした。
 なくても問題なかった。



お次はrust環境を入れます。

こちらのページにあるように、

rustup.rs - The Rust toolchain installer
The Rust toolchain installer



このコマンドラインを実行すればインストールされます。
 現在実行中のユーザー環境(/home/<User>/以下)に入る。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

ソースコードダウンロード、ビルド、インストール

ソースコードはgithubで公開されていますので、cloneなりReleaseからダウンロードなりします。

git cloneならこう。

$ git clone -b clamav-1.2.0 https://github.com/Cisco-Talos/clamav.git
$ cd clamav

あるいはアーカイブページからダウンロード。

$ wget https://www.clamav.net/downloads/production/clamav-1.2.0.tar.gz
$ tar zxf clamav-1.2.0.tar.gz
$ cd clamav-1.2.0



お次はビルド、テスト、インストールです。
合計で30分もかからなかった気がします。さすがOrange Pi 5 Plus。

$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .
$ ctest
$ sudo cmake --build . --target install

install_manifest.txtを見るとわかるとおり、以下のように配置されます。

$ cat install_manifest.txt 
/usr/local/bin/clamav-config
/usr/local/lib/pkgconfig/libclamav.pc
/usr/local/lib/libclamunrar.so.12.0.1
/usr/local/lib/libclamunrar.so.12
/usr/local/lib/libclamunrar.so
/usr/local/lib/libclamunrar_iface.so.12.0.1
/usr/local/lib/libclamunrar_iface.so.12
/usr/local/lib/libclamunrar_iface.so
/usr/local/lib/libclammspack.so.0.8.0
/usr/local/lib/libclammspack.so.0
/usr/local/lib/libclammspack.so
/usr/local/lib/libclamav.so.12.0.1
/usr/local/lib/libclamav.so.12
/usr/local/lib/libclamav.so
/usr/local/include/clamav.h
/usr/local/include/clamav-types.h
/usr/local/include/clamav-version.h
/usr/local/lib/libfreshclam.so.3.0.1
/usr/local/lib/libfreshclam.so.3
/usr/local/lib/libfreshclam.so
/usr/local/include/libfreshclam.h
/usr/local/bin/clamconf
/usr/local/sbin/clamd
/usr/local/bin/clamdscan
/usr/local/sbin/clamonacc
/usr/local/sbin/clamav-milter
/usr/local/bin/clamscan
/usr/local/bin/sigtool
/usr/local/bin/clambc
/usr/local/bin/clamsubmit
/usr/local/bin/freshclam
/usr/local/bin/clamdtop
/usr/local/etc/clamd.conf.sample
/usr/local/etc/freshclam.conf.sample
/usr/local/etc/clamav-milter.conf.sample
/usr/local/share/man/man1/clamscan.1
/usr/local/share/man/man1/freshclam.1
/usr/local/share/man/man1/sigtool.1
/usr/local/share/man/man1/clamdscan.1
/usr/local/share/man/man1/clamconf.1
/usr/local/share/man/man1/clamdtop.1
/usr/local/share/man/man1/clamsubmit.1
/usr/local/share/man/man1/clambc.1
/usr/local/share/man/man5/clamd.conf.5
/usr/local/share/man/man5/clamav-milter.conf.5
/usr/local/share/man/man5/freshclam.conf.5
/usr/local/share/man/man8/clamd.8
/usr/local/share/man/man8/clamav-milter.8



アンインストールしたくなったら、以下のとおりコマンド実行します。

$ sudo xargs rm < install_manifest.txt

自動起動設定

systemctlに自動起動してもらうようにします。

まず起動スクリプト。

$ cat /usr/local/bin/start_clamonacc.sh 
#!/bin/bash

CLAMONACC=/usr/local/sbin/clamonacc
QUARANTINE_DIR=/opt/clamav/quarantine

${CLAMONACC} --config-file=/usr/local/etc/clamonacc.conf --ping 3 > /dev/null
if [ 0 -ne $? ]; then
	echo "clamd doesn't exist. exiting..."
	exit 1;
else
	echo "Good, clamd exists."
fi

if [ ! -d ${QUARANTINE_DIR} ]; then
	mkdir -p ${QUARANTINE_DIR}
fi

${CLAMONACC} --fdpass --move=${QUARANTINE_DIR} --config-file=/usr/local/etc/clamonacc.conf



clamonacc.confは以下のとおりにしました。

$ cat /usr/local/etc/clamonacc.conf 
TCPSocket 1234
TCPAddr 192.168.1.123
OnAccessIncludePath /media/
OnAccessVirusEvent curl -X POST -H "Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -F "message=${CLAM_VIRUSEVENT_VIRUSNAME} is found in ${CLAM_VIRUSEVENT_FILENAME} on $(cat /etc/hostname)." https://notify-api.line.me/api/notify

それぞれの設定項目は以下の通り。

項目意味
TCPSocketclamdが動いているコンピューターのポート番号
TCPAddrclamdが動いているコンピューターのIPアドレス
OnAccessIncludePathclamonaccでスキャンしたいディレクトリ
OnAccessVirusEventウィルス検出時に実行させたいコマンドライン



別コンピューターで動作しているclamdを使う方法は↓の記事を参照してください。



2024/03/28追記
ワタシの動作環境では起動時に以下のエラーが出ました。
 多分監視対象ファイルが多すぎる

no space left on device



sysctlで1プロセスが開くことのできるファイルディスクリプタ数を増やすことで対処しました。

vim /etc/sysctl.conf

# ↓を追記
s.inotify.max_user_watches=524288

ウィルス検出時動作設定

OnAccessVirusEventは本家clamavにはなく、自分で追加した設定項目です。
clamonaccがファイル変更を検出して、結果的にウィルス検出すると、clamonaccが動作しているコンピューター上で指定したコマンドを実行します。
↑の記事に詳しく載っていますので、ご興味ある方はどぞ。

githubにパッチを載せています。

https://github.com/kurofuku/dotfiles/blob/clamav-1.2.0_compatible/clamav/add_OnAccessVirusEvent_functionalty.diff



このOnAccessVirusEventで、LINEに通知するようにしています。
LINE Notifyという機能を使っています。
通常のHTTPリクエストで自分のLINEに通知できる、とても便利なサービスです。

LINE Notify
LINE NotifyはGitHub,IFTTT,MackerelなどのWebサービスからの通知を、LINEで受信することが出来る便利なサービスです。



自分が設定したコマンドラインは以下の通りです。
通常のcurl利用で動作するのがとても良いです。

curl -X POST -H "Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -F "message=${CLAM_VIRUSEVENT_VIRUSNAME} is found in ${CLAM_VIRUSEVENT_FILENAME} on $(cat /etc/hostname)." https://notify-api.line.me/api/notify

Bearerのあとにある”XXX…”はLINE NotifyのPersonal Access Tokenで、ご自身のアカウントでLINE Notifyにログインし、取得してもらう必要があります。
1分で終わります。

終わりに

いかがでしたか。

ラズパイでのノウハウを使えるのが嬉しい!

Comments

タイトルとURLをコピーしました