はじめに
この記事では、Java(JEEアプリケーション)でファイルのアンチウイルススキャンを実装する方法の一例を紹介します。現在のコンピュータ環境、特にWindowsオペレーティングシステムでは、ウイルスやトロイの木馬をはじめとするさまざまなマルウェアやスパイウェアが大きな問題となっています。
Javaで開発するアプリケーションに、外部からファイルをアップロードできるようにするという要件がある場合、セキュリティリスクが生じる可能性があります。ここで言うアップロードとは、HTTPプロトコルなり他の方法なりを使って、何らかの形で企業のファイアウォール内に外部のファイルを送れるようにすることを指します。こうした要件はエンタープライズアプリケーションでは非常によくあるもので、しかもJavaは最も広く使われているWeb開発プラットフォームの1つです。にもかかわらず、このように大きく口を開けたセキュリティリスクが往々にして見過ごされているのは、残念なことです。
Java Development Kit(JDK)には、アンチウイルススキャンのための機能は標準装備されていません。その理由として大きいのは、Javaはプログラム言語であり、ウイルススキャンのパッケージを備えていないということです。しかも、アンチウイルスソフトウェアはSunの専門外ですし、同社のビジネスモデルにも含まれていません。ウイルス対策のソフトウェア(あるいはJavaパッケージ)を開発することや、さらに重要な、維持やメンテナンスを続けていくことは、Sunにとってかなりの重荷です。ウイルスは常に進化を続けていくので、ウイルス定義を最新の状態に維持していくのは骨の折れる作業です。ウイルスの検出と対処を行うための製品は、McAfee、Symantec、Zone Labsなどの大企業が開発し、多大なリソースを投入してそのメンテナンスにあたっています。
アプリケーション環境
Javaでファイルのウイルススキャンを実装するには、サードパーティ製のパッケージを利用する必要があります。この記事では、Java APIを備えたSymantec Scan Engine(SSE)パッケージを使うことにします。このパッケージは、TCP/IPサーバーとして動作するアプリケーションです。プログラミングインターフェイスが用意されており、コンテンツのスキャン技術をJavaアプリケーションに組み込むことができます。この記事ではSymantec Scan Engine 5.1を使用します。この製品には、UNIX版とWindows版の両方があります。
他社製のアンチウイルスパッケージを使用する場合は、どんなAPIが用意されているかは各自で調べてください。もっとも、基本的なアプローチは似ているはずです。また、ここで紹介する実装方法は、使用するJEEテクノロジは問わず、最近のMVCフレームワーク(StrutsやSpringなど)に対応しています。
アーキテクチャは次のようになります。まず、SSEを常時稼動するサーバーマシンが必要です。アプリケーションサーバーをホストするマシンと同じにすることもできますが、エンタープライズ環境の場合は、別のマシンにすることをお勧めします。また、ファイアウォールでデフォルトポートを開けておき、スキャンエンジンと通信できるようにしておく必要があります。ファイルスキャンを行う必要があるすべてのJEEアプリケーションは、デフォルトポートを通じてSSEサーバーマシンと通信できます。なお、別々のアプリケーションサーバーで稼動している複数のアプリケーションが同じスキャンサーバーを共用することもできます。詳細については、SymantecのWebサイトにある、Symantec Scan Engine(SSE)のインストールガイドを参照してください。
スキャンが必要な外部ファイルを、プログラミングインターフェイス(デフォルトポートを使用するJava API)を使用してSSEに送信すると、そのファイルに対する他の操作を行う前に、SSEから結果コードが戻ります。たとえば、Webメール型のアプリケーションで、外部ユーザーが添付ファイルとしてファイルをアップロードしたとします。この場合、アプリケーションは、SSEのAPIを呼び出し、OKかNGかを示すリターンコードに基づいて、アップロードの結果を判断し、その電子メールを実際に送信してよいかどうかを決定します。Yahooメールのアカウントをお持ちの方なら、Norton Antivirusですべての添付ファイルがスキャンされるのを見たことがあるかもしれません(Javaを使った実装ではありませんが)。
サーバーへのScan Engineのインストールの詳細については、Symantecのサイトにある、Symantec Scan Engine(SSE)実装ガイドを参照してください。
SSEについて頭に入れておくべきポイントを以下にまとめます。
- SSEをインストールする前に、サーバーにJava 2 SE Runtime(JRE)5.0 Update 6.0以降をインストールする必要があります。
- インストール後に、Symantec Scan Engineデーモンが稼動していることを確認してください。UNIX版の場合、UNIXのコマンドプロンプトで次のコマンドを入力します。
- 5358 ? 0:00 symscan
- 5359 ? 0:00 symscan
- 常に最新のウイルス定義を適用しておくことが最も重要な責務です。最新のデータがインストールされていないと、スキャン全体の実効性がなくなります。Symantec製品では、LiveUpdate機能によって、最新のファイル定義が自動的にダウンロードされます。ホストサーバーがSymantecの更新サービスに接続できるようにファイアウォールのルールを設定しておいてください。
ps -ea | grep sym.
/etc/init.d/symscan restart