Node.js + ClamAVを使って、アップロードされたコンテンツをウイルススキャンする。

  • 8
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Amazon Web Service登場以降、クラウドのストレージがどんどん安くなって、ファイルをアップロード/共有するWebサイトも作りやすくなってきました。

ユーザが任意のファイルをサービスにアップロード・共有が出来るようになってくると、サービス運用として気になるのは、アップロード・共有されたコンテンツが適正なものかどうか、ですね。

ここでは、ClamAVというオープンソースのウイルススキャンツールを使ってスキャンする方法をご紹介します。
ここではシンプルにNode.jsからclamAVを呼び出すところを紹介します。このコードを参考に、アップロードされたファイルをスキャンし、ファイルが汚染されているようなら共有しないようにすると良いです。
実行環境はCentOS 7です。

ClamAVをインストールする。

ClamAVはyumでインストールできます。

ClamAVのインストール
# 拡張リポジトリをインストールします。
yum -y install epel-release
# clamavをインストールします。
yum --enablerepo=epel -y install clamav clamav-update 
# コンフィグファイルを有効化します。
sed -i -e "s/^Example/#Example/" /etc/freshclam.conf
# パターンファイルをアップデートします。
freshclam

お手軽ですね。

Node.jsからclamavを呼び出す。

clamscanという、clamavを呼び出すnpmパッケージがあるので、インストールします。

npmパッケージのセットアップ
# npmパッケージを初期化します。すでに実行済みであれば必要ありません。
npm init
# ・・・・色々聞かれるので、パッケージ化のための情報を入力します。
# clamscanをインストールします。
npm install --save clamscan

あとは、自分たちで作るアプリケーションからファイルスキャンをかけます。

index.js
var clam = require('clamscan')({preference: 'clamscan'});
clam.is_infected(/* スキャンするファイルパス */ process.argv[2], function(err, file, is_infected) {
    if(err) {
        throw err;
    }
    if(is_infected) {
        console.log("ファイルは汚染されています。");
    } else {
        console.log("ファイルはクリーンです。");
    }
});

上記例では、スキャンするファイルパスにコマンドライン引数(process.argv[2])を指定していますが、アップロードされたファイルをチェックする場合は、アップロードされたtempファイルに対してチェックをかけ、汚染されていた場合は即削除してユーザに通知するとよいでしょう。

いかがでしたか?意外と簡単にファイルのウイルススキャンを書けることが出来るとご理解いただけたと思います。
アップロードを伴うサービスを提供するときは、是非参考にしてみてください。