Ubuntu Weekly Recipe

第900回Ubuntuでもウイルスのオンアクセススキャンをしてみよう

Ubuntuで利用できるアンチウイルスソフトウェアといえば、一番有名なのがClamAVでしょう。本連載でも第429回で紹介しましたが、もう10年も前の記事になります。そこで今回はUbuntu 24.04向けにアップデートした、ClamAVのオンアクセススキャンの使い方を紹介します。

Ubuntuのアンチウイルス事情

繰り返し語られて来ましたが、いわゆる「ウイルス」と呼ばれるプログラムのほとんどが、Windowsをターゲットにしています。そのためUbuntuをはじめとするLinuxでは、パッケージを常に最新にすることや、内容のわからないスクリプトを不用意に実行しないことのほうが重要で、アンチウイルスソフトウェアの優先度はそれほど高くないというのが筆者の考えです。

とはいえWebサーバーやファイルサーバー本体はLinuxでも、アクセスするクライアントの多くは(特に企業では)WindowsやMacではないでしょうか。そのためサーバーにアップロードされたファイルが安全かどうかを、定期的にチェックしておくのはよい考えです。また社内のセキュリティポリシーで、⁠机上端末には必ずアンチウイルスをインストールし、オンアクセススキャンを有効にすること」のように定められているケースもあるでしょう。開発用途にLinuxデスクトップを用いる場合であっても、当然ルールには従わなくてはなりません。こうした際にClamAVは、非常に便利な存在です。

Linuxではファイルシステムアクセスに割り込んだ処理が難しく、Windowsのようなオンアクセススキャンはできない……と、2000年代前半くらいからLinuxデスクトップを使っていた方は思うかもしれません。ですが現在のLinuxカーネルには、fanotifyと呼ばれる機能が実装されています。fanotifyはファイルシステムへのアクセスを監視し、プロセスのファイルアクセスを許可/ブロックできる機能です。ClamAVにはclamonaccというオンアクセススキャン機能があり、これはまさにfanotifyによって実装されています。

ClamAVのインストール

それではClamAVをインストールしましょう。⁠clamav」パッケージと、オンアクセススキャンを使うために「clamav-daemon」パッケージをインストールします。

$ sudo apt install -U -y clamav clamav-daemon

インストールはこれだけです。非常に簡単ですね。

シグネチャのアップデート

ClamAVがウイルスやマルウェアを検出する際に利用するのが「シグネチャ」です。これは簡単に言うと、ウイルスを識別するための定義をまとめたルール集です。当然ですが、最新のウイルスに対応するには、最新のシグネチャを使う必要があります。

ClamAVでは、freshclamコマンドを使ってシグネチャを更新します。freshclamには大きく2通りの使い方があります。

  • freshclamコマンドを直接実行する
  • freshclamをデーモンとしてシステムに常駐させる

ただし、通常はfreshclamを常駐させる必要はないでしょう。というのも、シグネチャはそれほど高頻度にアップデートされるわけではありません。そしてfreshclamデーモンは特別な指定がない限り、1日あたり12回シグネチャの更新をチェックします。ですがその程度の頻度であれば、わざわざデーモンを常駐させてリソースを割くよりも、Cronやsystemd.timerで2時間おきにfreshclamコマンドを実行したほうがよいというのが筆者の考えです。またファイルサーバーなどの実運用であれば「共有ディレクトリをスキャンして、結果をメールやSlackで通知する」といったシェルスクリプトをCronで起動することになるでしょう。それならそのスクリプト内でfreshclamを実行してしまえば、Cronの設定すら不要になります。

Ubuntuのfreshclamコマンドは、clamav-freshclamパッケージで提供されています。そしてこのパッケージにはsystemdのユニットファイルとして、freshclamをデーモンとして起動する「clamav-freshclam.service」と、freshclamコマンドを定期的に実行する「clamav-freshclam-once.timer」の両方が含まれています。ただしどちらもデフォルトでは「disable」となっており、シグネチャの自動更新は動かないようになっています。ただ面白いのは、インストール直後は「clamav-freshclam.service」が起動している点です。サービスとしては無効化されているものの、パッケージインストール直後は一度だけ起動し、その時点の最新のシグネチャファイルをダウンロードするようになっているというわけです。

図1 サービスはdisabledになっているものの、runningにもなっている
図2 実際にfreshclamコマンドが、デーモンモードで起動している
図3 clamscanコマンドにversionオプションをつけると、最新のシグネチャがインストールされていることが確認できる

前述の通り常駐するデーモンは不要でしょうから、初回のアップデートが完了したらサービスを止めてしまいましょう。

$ sudo systemctl stop clamav-freshclam

その上で、もしfreshclamを定期的に自動実行したい場合は、systemd.timerを有効化するとよいでしょう。

$ sudo systemctl enable --now clamav-freshclam-once.timer 
図4 systemd.timerでfreshclamの実行がスケジュールされた状態

clamdの設定

ClamAVのオンアクセススキャンには、clamonaccコマンドと、バックエンドであるclamdデーモンが必要です。まずはデーモン側を設定しましょう。

設定ファイルである「/etc/clamav/clamd.conf」をテキストエディタで開き、以下のように変更してください。これはclamdを実行するユーザーの指定です。オンアクセススキャンでは、各ユーザーのホームディレクトリをスキャン対象にしたいたいめ、root権限が必要になります。

User clamav
↓
User root

またファイルの末尾に以下を追加してください。これは「rootユーザーはスキャンの対象外とする」⁠/homeをスキャン対象とする」⁠ウイルス検出時にファイルへのアクセスをブロックする」⁠読み取りだけでなく作成、移動時もチェック」という設定です。

OnAccessExcludeUID 0
OnAccessExcludeUname root
OnAccessIncludePath /home
OnAccessPrevention yes
OnAccessExtraScanning yes

clamdを再起動します。

$ sudo systemctl restart clamav-daemon.service

オンアクセススキャンの動作を試す

「clamav-clamonacc」を起動します。これでオンアクセススキャンが動作し始めます。

$ sudo systemctl enable --now clamav-clamonacc.service 

安全なウイルスのテストファイルであるEICARを使って、動作を確認してみましょう。ホームディレクトリに「eicar.txt」というファイルを作り、以下の68バイトの文字列を書き込みます。

$ echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > ~/eicar.txt

このファイルをcatで読み込んでみましょう。

$ cat eicar.txt
図5 自分で作ったテキストファイルなのに、アクセスがブロックされた

このように、オンアクセススキャンによって、リアルタイムにファイルアクセスがブロックされました。

図6 ローカルだけでなく、リモートからネットワーク越しのアクセスであってもブロック可能

なおclamd.confにはデフォルトで「OnAccessMaxFileSize 5M」という記述があり、5MBを越えるファイルはオンアクセススキャンの対象外となります。もちろんこの数値を増やすこともできるのですが、あまり大きなファイルをオンアクセススキャンの対象としてしまうと、システムのパフォーマンスに影響が出てきます。そこで大きなファイルは定時スキャンに任せ、オンアクセススキャンの対象は、普段読み書きする頻度の高いサイズのファイルに絞るのがお勧めです。

おすすめ記事

記事・ニュース一覧