ClamAVでのfanotifyの有効化(2016年記事の再掲)

こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面 和毅です。

ここでは、ClamAVのインストールとfanotifyの有効化について解説されています。


1. AntiVirusでのスキャンの種類とオンアクセススキャン

LinuxでもWindowsでも良く使用されるAntiVirusですが、Virusやマルウェアを発見するために使用するVirusスキャンには、大きく分けて手動スキャンとオンアクセススキャンの二種類があります。

  • 手動スキャン(定時スキャン)

    手動でスキャン対象(デバイスやディレクトリ)を指定してVirusスキャンを実行するもの。あるいは、OSやアプリで用意されているスケジューラなどで定時にスキャンを実行する場合もある。

  • オンアクセススキャン

    ファイルを開く(open)、読む(read)、書き込む・保存(write)などのアクションが起こった際に、自動的に対象ファイルに対してスキャンを行うもの

 これらのどちらが良いかに関しては、ケースバイケースです。大まかに言ってしまうと下記のような特色があります。

  • 定時スキャン:感染した後にスキャンになるが、負荷が低い。また、処理がおかしくなる可能性が低い
  • オンアクセススキャン:感染を未然に防げるが、負荷が高い。また、実装によっては処理がおかしくなる事がある。

2. オンアクセススキャンの問題について

オンアクセススキャンでは、一般的にはファイルのopen/read/writeなどシステムコールレベルの所でhookをかけています。Linuxでのオンアクセススキャンの実装と処理の方式は、下記の様になります。

ClamAVオンラインアクセス

  1. 通常のシステムでは、ユーザ空間のプログラムがファイルに対しての処理を行う際に、sys_open/sys_closeなどのシステムコールを使用します(図上)。
  2. Virusスキャンの処理が入った場合には、事前に独自のKernelモジュールをロードし、sys_open/sys_closeが行われた際に参照するシステムコールテーブルに細工をして、元のプログラムに対してはwaitを返して処理を待機させ、対象ファイルをユーザ空間に入るVirusスキャンエンジンにスキャンさせます。このスキャンの結果でファイルが感染していない場合には元の処理にOKを返してwaitしていたプロセスが続行出来ます。しかし、ファイルがVirusに感染している場合等は、EPERMなどのエラーを返し、waitしていたプロセスがファイルに対してアクセス出来ないようにします(図下)。

2.のシステムコールテーブルに細工するKernelモジュールには各社独自の実装があります。しかし、その実装に不具合があった場合には、最悪の場合Kernel Panic等が発生してしまいます。

また、Virusスキャンの他にも、同じように下記の様に、システムコールテーブルに細工をして処理を割り込ませるものがあります(たとえば、いくつかのアクセス監査システムなど)。そのようなものとVirusScanを同システムにインストールさせると、競合により、起動・停止順を間違えた場合にKernelPanicが発生することがあります。

下記に簡単な例を示しましたが、VirusScanソフト->System監査プログラムの順に起動していた場合には、Virusスキャンを先に停止させてしまうとKernel Panicになってしまいます。通常のオペレーションでは発生しませんが、Virus Scanソフトの更新時などに発生することがあります。

ClamAV競合

3. fanotifyとは

前節で「各社独自にシステムコールテーブルに細工をするKernelモジュールを提供している」と書きましたが、このためKernel Panicなどが発生する原因になっていました。そのため、Kernel 2.6.36以降からは、Kernelの方でファイルシステムの状態変化を通知する機構(fanotify)を提供するようになりました。これはinotifyなどと同じくfsnotifyの上位レイヤで動く機構として実装されており、ファイルディスクリプタをオブジェクトに対してオープンした際に(open, close, read, write)という発生イベントの種類をユーザスペースに通知することができます。

Kernelが3.x以降になっている最近のディストリビューション(RHEL7/CentOS7/OracleLinux7や、Ubuntuなど)では、fanotifyを使用することが出来ます。

fanotifyの詳しい説明に関しては、IPA 情報セキュリティ技術動向調査(2010 年下期)「3 fanotify(filesystem wide access notification)」に詳しく説明されています。

4. ClamAVのインストールとfanotifyの有効化

以降、OracleLinux7でClamAVのインストールとfanotifyの有効化を行っていきます。特にディストロ独特の設定はありませんので、CentOS7やRHEL7などでも、同様の手順になります。

1. rpmforgeを有効化します。


[root@localhost ~]# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-XX(version#).rpm
[root@localhost ~]# rpm -ivh rpmforge-release-*.rpm
[root@localhost ~]# yum -y update rpmforge-release

2. ClamAVとClamdをインストールします。


[root@localhost pluginconf.d]# yum -y install clamav clamd

3. clamd.confファイルを編集します。


User root     ←   (fanotifyを使うため、rootユーザでのアクセスが必要になります)
ScanOnAccess yes
OnAccessIncludePath /tmp     ←    (オンアクセススキャンを有効にするディレクトリ・ファイルを列挙します)
OnAccessIncludePath /home/test1 ←    
....

(※) 現時点でのclamavの実装では、オンアクセススキャンではディレクトリのリカーシブな検索(サブディレクトリ以下の検索)を実装していません。そのため、/home/を指定した場合には、/home直下のファイルのスキャンのみ行い、/home/hogehoge、/home/fugafugaなど各ユーザのホーム内のスキャンは行いません。

4. SELinuxポリシを変更します。

clamd(antivirus_tタイプ)が各フォルダ・ファイルにアクセス出来るように、ポリシを一部追加してあげる必要があります。

(1) “selinux-policy-devel”パッケージをインストールします。

(2) 適当なディレクトリで下記のように”clamav.te”ファイルを作成します。


module clamav.pol 1.0;
require {
        type user_tmp_t;
        type antivirus_t;
        type var_run_t;
        type home_root_t;
        type user_home_dir_t;                                  <-- スキャンするディレクトリの typeを追加
        class sock_file { create unlink setattr };
        class dir read;
        class capability sys_admin;
        class file { read getattr open };
}
#============= antivirus_t ==============
#!!!! This avc can be allowed using the boolean 'antivirus_can_scan_system'
allow antivirus_t self:capability sys_admin;
allow antivirus_t home_root_t:dir read;    <-- スキャンするディレクトリの typeを追加
allow antivirus_t home_root_t:file { read getattr open };        <-- スキャンするディレクトリの typeと、アクションを追加
allow antivirus_t user_home_dir_t:dir read;     <-- スキャンするディレクトリの typeを追加
allow antivirus_t user_home_dir_t:file { read getattr open };   <-- スキャンするディレクトリの typeと、アクションを追加
allow antivirus_t user_tmp_t:file open;
allow antivirus_t var_run_t:sock_file { create unlink setattr };

(3)下記のコマンドで、ポリシモジュールを作成し、ロードします。


[root@localhost ~]# make -f /usr/share/selinux/devel/Makefile
[root@localhost ~]# semodule I clamav.pp

5. clamdのサービスを起動(既に起動していた場合には再起動)します。


[root@localhost ~]# /etc/init.d/clamd start
Starting clamd (via systemctl):                            [  OK  ]
[root@localhost ~]# ps axZ|grep clamd
system_u:system_r:antivirus_t:s0 14727 ?       Ssl    0:00 clamd

うまく動作しない場合には、/var/log/clamd以下にログがありますので、参照して修正してください。だいたい、スキャン対象のディレクトリ・ファイルへのアクセスがSELinuxで拒否されているケースが多いため、SELinuxのログと比較しながら必要なタイプを追加していきます。

5. ClamAV+fanotifyのテスト

clamav/clamdでオンアクセススキャンが出来ることを確認します。

1. /home/test1以下に、テスト用の無害なウィルス(EICAR)をコピーします。


[root@localhost ~]# cp /tmp/eicar.txt /home/test1

2. /var/log/messagesにEICARを見つけた旨のログが出力されます。

[root@localhost clamav]# tail -2 /var/log/clamav/clamd.log
Sun Aug 10 23:19:32 2014 -> ScanOnAccess: Max file size limited to 5242880 bytes
Sun Aug 10 23:19:44 2014 -> ScanOnAccess: /home/test1/eicar.txt: Eicar-Test-Signature FOUND

セキュリティ系連載案内

CM

こちらで小学生の勉強支援サイトをオープンしました。算数のプリント(都度、自動生成)が無料でダウンロードできます。コンテンツは未だ少ないですが、徐々に増やしていきます。

セミナー情報1

2021/09/13 18:30から、OSSセキュリティ技術の会 第九回勉強会を行います。

7/30にリリースされたKeycloak 15で、FAPI(Financial-Grade API)、CIBA(Client Initiated Backchannel Authentication)に対応しました(Certificateはまだですが…)。またDevice Flowにも対応しています。これを記念し、KeycloakのFAPI,CIBAの主要開発者もお招きして、「KeycloakのFAPI CIBA 対応記念の巻」と題して勉強会を行います。

Connpassのこちらがプログラム内容と申し込みの詳細になります。奮ってご参加下さい。

セミナー情報2

コンピュータセキュリティシンポジウム(CSS)2021併設のワークショップ、 OSSセキュリティ技術ワークショップ(OWS) 2021の企画講演セッション及び、 一般論文セッションの発表募集をさせていただきます。

今年もオンラインでの開催となり、OWSトラックの一般論文セッションの論文募集(申込締め切り: 2021年08月02日(月))と企画セッションを行いますので,ご投稿とご参加よろしくお願いいたします。

https://www.iwsec.org/ows/2021/


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