現在位置: ホーム / ゲストブログ / ClamAVでのfanotifyの有効化

ClamAVでのfanotifyの有効化

本記事は面様より寄稿を頂きました。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 ~]# cat /tmp/eicar.txt
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
[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

 

著者について

面 和毅:OSS のセキュリティコミュニテイで活動中。

各種お問い合わせ

サイオスOSSよろず相談室(1)

問い合わせボタン

最新の情報
わかっておきたいセキュリティ: 第4回 IRMA (Incident Response Malware Analysis) 2017年03月29日
わかっておきたいセキュリティ: 第3回 マルウェア解析サンドボックス「Cuckoo」との連携 その2 2017年02月22日
[第14回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その4 2017年02月08日
[第13回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その3 2017年02月01日
[第12回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その2 2017年01月25日
[第11回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 システム要件において検討すべき点 その1 2017年01月18日
Python人材育成の支援を目的としたPythonエンジニア育成推進協会の活動とは? 2016年12月21日
わかっておきたいセキュリティ: 第2回 マルウェア解析サンドボックス「Cuckoo」との連携 2016年12月14日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第3回 オープンソースライセンスの使い方をわかっておきたい 2016年12月08日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第2回 色々なオープンソースライセンスをわかっておきたい 2016年11月30日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第1回 著作権とライセンスをわかっておきたい 2016年11月17日
わかっておきたいセキュリティ: 第1回 マルウェア解析サンドボックス「Cuckoo」 2016年11月02日
[第10回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』 Linuxサーバーシステム導入前の検討~ RHELを知る ~ 2016年10月26日
[第9回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』 Linuxサーバーシステム導入前の検討~ Ubuntu Serverを知る ~ 2016年10月19日
[第8回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』  Linuxサーバーシステム導入前の検討~ SUSEを知る ~ 2016年10月12日
[第7回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』~「初心者でもわかる、Linuxサーバーシステム活用者が知っておくべきポイント」(後編) 2016年08月09日
[第6回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』~「初心者でもわかる、Linuxサーバーシステム活用者が知っておくべきポイント」(前編) 2016年08月02日
[第5回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』~「ミッションクリティカルシステムとオープンソース・Linux」(後編) 2016年06月22日
[第4回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』~「ミッションクリティカルシステムとオープンソース・Linux」(前編) 2016年06月16日
[第3回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』~「CEOが知っておくべきオープンソース革新」(後編)~ 2016年05月25日
最新の情報 - もっと...