Sophos SAVDIでウイルス検索をしてみた

2016.10.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Sophos SAV Dynamic Interface (SAVDI) をご紹介します。
SAVDIはファイルをアップロードするようなシステムと相性の良いウイルスチェック用APIです。

ファイルアップローダー

ファイルアップローダーについて考えます。
ユーザがWEB画面からファイルを指定すると、EC2を経由してs3にファイルをPUTします。
悪意のあるファイルをアップロードされないために何が出来るでしょうか。

1

Anti-Virusでの検査

ファイルの検査といえば、アンチウイルスソフトが思い浮かびます。
Sophos Anti-Virusを使って、検査する方法を考えます。
一般的にアンチウイルスソフトには、オンアクセス検索とオンデマンド検索があります。

オンアクセス検索

オンアクセスで検査する場合、ファイルをアップロードするとリアルタイムで検査が実行されます。
欠点として、検査結果による処理分岐が難しいです。
SAVDIでは検査結果を戻り値で判断し、アプリケーションの処理分岐に役立てる事が出来ます。

オンデマンド検索

ファイルアップロード時にsavscanコマンドを実行します。
欠点として、検査ごとに定義ファイルを読み込むためタイムロスが大きくなります。
SAVDIではデーモン/サービスが常駐するため、高速なスキャンが可能です。

SAVDIでのウイルスチェック

SAVDIはデーモンとして常駐します。
アプリケーションは、ソケットベースのインターフェースを通してデーモンと通信します。
検査結果によってデーモンからの戻り値が異なるためアプリケーション側で処理分岐を簡単に行う事ができます。
アプリケーションの言語は、特に制限はありません。
SAVDIと通信ができればOKです。

正常なファイルのアップロード時

ユーザーがファイルをアップロードすると、アプリケーションはSAVDIに検索を依頼します。
SAVDIの戻り値からファイルが正常であると判断出来る場合はs3にPUTします。

2

ウイルスアップロード時

SAVDIに検索を依頼する所までは同じです。
SAVDIの戻り値からファイルが異常であると判断した場合は、エラーメッセージを表示します。
アプリケーションでファイルを削除することも可能です。

3

SAVDIのセットアップ

Antivirus for Linuxのインストール

SAVDIを利用するには、Antivirusが必要です。
Amazon Linuxに Sophos Antivirus for Linuxをインストールしました。
検証に利用したバージョンは、9.12.1です。

SAVDIのインストール

tarファイルを展開し、インストーラを実行します。

$ tar xvf savdi-23-linux-64bit.tar
$ cd savdi-install/
$ sudo ./savdi_install.sh

検証時のバージョンは 2.3.0です。

$ savdid -V
SAV Dynamic Interface 2.3.0
Copyright 2000-2015 Sophos Limited. All rights reserved
$

起動

SAVDIを起動します。

$ savdid -c /usr/local/savdi/savdid.conf
$ ps -ef | grep savdi
root      3523  3416  0 01:32 pts/0    00:00:04 savdid -c /usr/local/savdi/savdid.conf

スクリプトの実行

pythonとSAVDIで検索を行うスクリプトを作成しました。

正常なファイルの検索

引数に検索対象を指定し実行します。

$ python sssp_name.py /var/log/messages
OK (0000) The function call succeeded
$

EICARファイルの検索

アンチウイルスの応答をテストできるEICARファイルを指定すると、検知されます。

$ python sssp_name.py /tmp/eicar
Virus: EICAR-AV-Test in /tmp/eicar
OK (0203) Virus found during virus scan
$

SAVDI停止時の挙動

SAVDIが停止している時に実行すると、検索出来ません。

$ python sssp_name.py /var/log/messages
Can't connect
$

WEBページの作成

簡易的なファイルアップローダーを作ってみました。

httpdのインストール

$ yum install -y httpd
$ vi /etc/httpd/conf/httpd.conf
先頭のシャープを削除
--------
  AddHandler cgi-script .cgi
--------
$ service httpd start

画像一時配置ディレクトリの作成

$ mkdir /var/www/tmp
$ chown apache:apache tmp/

アップローダの配置

$ tree /var/www/ -I 'error|icons'
/var/www/
├── cgi-bin
│   ├── sssp_name.py
│   ├── sssp_utils.py
│   └── upload.cgi
├── html
│   └── index.html
└── tmp

それぞれのコードは以下に配置しました。

s3アップローダ

トップページはこんな感じです。
index.htmlでファイルを選択し、送信するとupload.cgiが呼び出されます。
upload.cgi内でsssp_name.pyを呼び出します。
sssp_name.pyはSAVDIと通信し検索を行います。

4-1

通常のテキストファイルをアップロードすると、検索後にs3にアップロードします。

5

AWSマネージドコンソールからs3バケットを見ると、ファイルがアップロードされたことがわかります。

6

EICARファイルをアップロードすると、エラーメッセージを表示します。
s3バケットへのアップロードは行いません。

7

終わりに

Sophos SAV Dynamic Interface (SAVDI) を紹介しました。
SAVDIはファイルをアップロードするようなシステムと相性の良いウイルスチェック用APIです。
デーモン/サービスが常駐するため、高速なスキャンが可能です。
また、検索結果に応じてアプリケーションの処理を分岐できます。
ファイルをアップロードし何かしらの処理を与えるようなアプリケーションを作成する場合、Fitすると思います。

参考