AWS(EC2)で無料ウィルス対策

ウィルス対策

Amazon Linux でアンチウィルスソフトを利用するための手順に関して説明します。
以前から Clam AntiVirus を利用していたのですが、先日から Amazon リポジトリにも追加されたようなので、これを利用します。

はじめに

ゴールデンウィークはいかがお過ごしだったでしょうか。
私は娘と実家がある福島に帰省していたのですが、鼻の調子がちょっと変です。鼻血は出ませんでしたが鼻水に血が混じってたかも ( 北上して、東京ではほぼ終わった花粉にまたやられた可能性あり )。

実家の駐車場には昨年除染された土が積み上げられたままでした。


話変わって、近々では会社のNASに不具合が発生(継続中)するなどして、技術情報の更新が滞り気味ですが (--; 、EC2のアップデートの際に アンチウィルスソフトの絡みでちょっと問題があったりしたので、Amazon Linux でのアンチウィルスソフト導入に関して、ちょっと書いてみます。
アンチウィルスソフトは Clam AntiVirus を利用します。

ちなみに写真はいつも利用させて頂いている 写真素材ぱくたそ 様のものを利用させて頂きました。
素材探しに行ったら、「ゾンビ写真素材」 が表示されたので、ビビった & 笑った。
フォントは 暗黒工房 様のを利用させて頂きました。

Clam AntiVirus

Clam AntiVirus はオープンソースのアンチウィルスソフトウェアです。
GPLライセンスで提供されており、Linuxサーバを導入する場合のアンチウィルスソフトウェアとして利用される事が多く、導入に関する記事はネット上で多くみる事ができます。

弊社でも EC2 (Amazon Linux) にて導入していたりしたのですが、先日 Amazon の yum リポジトリでも提供が開始されたようです。

$ yum list | grep clam
clamav.x86_64                       0.98.1-1.3.amzn1               @amzn-updates
clamav-data.noarch                  0.98.1-1.3.amzn1               @amzn-updates
clamav-filesystem.noarch            0.98.1-1.3.amzn1               @amzn-updates
clamav-lib.x86_64                   0.98.1-1.3.amzn1               @amzn-updates
clamav-server.x86_64                0.98.1-1.3.amzn1               @amzn-updates
clamav-update.x86_64                0.98.1-1.3.amzn1               @amzn-updates
clamav-data-empty.noarch            0.98.1-1.3.amzn1               amzn-updates
clamav-devel.x86_64                 0.98.1-1.3.amzn1               amzn-updates
clamav-lib.i686                     0.98.1-1.3.amzn1               amzn-updates
clamav-milter.x86_64                0.98.1-1.3.amzn1               amzn-updates
clamav-milter-sysvinit.noarch       0.98.1-1.3.amzn1               amzn-updates
clamav-scanner.noarch               0.98.1-1.3.amzn1               amzn-updates
clamav-scanner-sysvinit.noarch      0.98.1-1.3.amzn1               amzn-updates
clamav-server-sysvinit.noarch       0.98.1-1.3.amzn1               amzn-updates

それまで epel リポジトリ のものを利用していたのですが、Amazonリポジトリで提供されたことで、yum update 時に依存関係の問題でアップデートが失敗するという問題が発生してしまいました。→ Amazon リポジトリを利用するように変更してみる事にしました。
以下手順を示します。

2014/3 のパッケージリスト には存在していない

yum リポジトリの設定を変更する

複数のリポジトリでコンフリクトが発生する問題

amazon リポジトリでClam AntiVirus 提供が行われた後、最初のアップデート ( yum update ) 時にパッケージの依存関係で問題が生じてアップデートができませんでした。
元々 epel リポジトリのものを導入しているため、構成が変更になっている Amazon リポジトリに更新しようとして問題が発生したようです。

Clam AntiVirus に関しては、以前 CentOS でも複数のリポジトリ間でコンフリクトが発生し、パッケージアップデートが行われた際に以下のような問題が発生した事があります。

  • アップデートが失敗する
  • アップデートは行われるが、ウィルスチェックができなくなる ( プロセスが起動しない )
  • 定義ファイルが最新のものに更新されなくなる

問題の原因

CentOS の場合、Clam AntiVirus はyum リポジトリとしてよく利用される epel, rpmforge の双方で提供されているのですが、epel でインストールした Clam AntiVirus が rpmforge の yum でアップデートされるといった事が起こります。
以下のような場合に発生します。
yum package conflict

  • 導入時
    epel のみ利用、あるいは、epel のバージョン > rpmforge のバージョン
  • アップデート時
    rpmforge のバージョン > epel のバージョン

この場合でも問題なく動作すれば構わないのですが、epel と rpmforge では Clam AntiVirus 用の ユーザが異なっており(clam と clamav)、 別リポジトリで更新がなされてしまうとパーミッションの問題が発生し、正常に動作しない状態になってしまいます。
こういった問題が発生しないように、Clam AntiVirus の更新は単一のリポジトリから行われるように設定を行います。

対策

問題回避のために、インストール元以外のリポジトリに対し、Clam AntiVirus を除外するための設定を行います。

  1. yumのリポジトリ設定ファイルを編集します。
    /etc/yum.repos.d に移動し、epel のリポジトリ設定ファイルを見つけます。
    $ cd /etc/yum.repos.d
    $ ls -la
    -rw-r--r--  1 root root  738  4月  8 15:57 amzn-main.repo
    -rw-r--r--  1 root root  387  4月  8 15:57 amzn-nosrc.repo
    -rw-r--r--  1 root root  756  4月  8 15:57 amzn-preview.repo
    -rw-r--r--  1 root root  756  4月  8 15:57 amzn-updates.repo
    -rw-r--r--  1 root root 1056  3月  1  2013 epel-testing.repo
    -rw-r--r--  1 root root  999  5月 12 10:53 epel.repo
    
    epel.repo がリポジトリ設定ファイルになります。
  2. epel.repo を編集します。
    $ sudo vi /etc/yum.repos.d/epel.repo
    
    編集内容 ( 抜粋 )
    exclude 設定を行い Clam AntiVirus を対象外にします。
    以下設定では正規表現を利用し clamで始まるパッケージを除外しています。
    ※enabled=0 にしてepel を利用しないように設定する方法等もありますが、何かの機会でenbaled=1 に設定したまま忘れるといった事があったため、今はexcludeで除外するようにしています。
    ※excludeではなく、priorities プラグイン ( yum-plugin-priorities ) を利用する方法が最もスマートかもしれません。
    [epel]
    name=Extra Packages for Enterprise Linux 6 - $basearch
    #baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
    mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
    failovermethod=priority
    enabled=1
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
    exclude=clam*
    
  3. 念のため除外設定が効いているか確認するのをお勧めします。
    $ yum list | grep clam
    

epel からインストールした Clam AntiVirus を削除する

epel からインストールした Clam AntiVirus がある場合アンインストールします。
設定ファイル等は必要に応じてバックアップして下さい。

$ sudo yum remove clam*

また、定義データ等が存在する場合、削除されずに残ってパーミッションの問題を引き起こす場合があります。
必要に応じて削除しましょう ( amazon 版に移行して問題が発生した場合に対応する形でOK )。

amazon リポジトリから Clam AntiVirus をインストールする

amazon リポジトリから Clam AntiVirus をインストールします。
幾つかのパッケージがありますが、以下をインストールすれば、これまでCentOS等で clamd をインストールして動作さいていたのと同様の事ができそうです。依存関係にあるパッケージも併せてインストールされます。

$ sudo yum install clamav clamav-scanner-sysvinit clamav-update

ウィルス定義のアップデート

インストールが行えたら、ウィルス定義を更新します。

  1. 定義の更新には freshclam コマンドを利用します。
    $ sudo freshclam
    

    しかし、この時点では以下エラーが出力されて実行に失敗します。

    ERROR: Please edit the example config file /etc/freshclam.conf
    ERROR: Can't open/parse the config file /etc/freshclam.conf
    
  2. /etc/freshclam.conf を編集します。
    $ sudo vi /etc/freshclam.conf
    

    以下 ( 抜粋 ) を編集します

    # Comment or remove the line below.
    # Example            行削除するかコメントにする
    # 以下はコメントを解除
    DatabaseDirectory /var/lib/clamav
    UpdateLogFile /var/log/freshclam.log
    DatabaseOwner clamupdate
    
  3. freshclamを再実行します。いくつかのエラーが出ますが、定義の更新が行われます。
    $ sudo freshclam
    

Clam AntiVirus デーモンを実行する

Clam AntiVirus を起動します。
Clam AntiVirus はデーモンとして実行し、スキャンが必要な場合にはこのデーモンに対してリクエストする形にします。( epel 版の clamd を利用する方法と同様 )

  1. epel リポジトリ版とは起動スクリプトが異なっています。
    $ sudo /etc/rc.d/init.d/clamd.scan start
    

    freshclamと同様最初は設定ファイルを編集していないためにエラーになります。

    clamd.scan を起動中: ERROR: Please edit the example config file /etc/clamd.d/scan.conf
    ERROR: Can't open/parse the config file /etc/clamd.d/scan.conf
                                                               [失敗]
    
  2. 設定ファイルを編集します。
    $ sudo vi /etc/clamd.d/scan.conf
    

    以下内容 ( 抜粋 ) で編集します。

    # Comment or remove the line below.
    # Example        行削除するかコメントにする
    # 以下はコメントを解除
    LocalSocket /var/run/clamd.scan/clamd.sock
    FixStaleSocket yes
    TCPAddr 127.0.0.1
    ExcludePath ^/proc/
    ExcludePath ^/sys/
    User clamscan
    

    ※/proc や /sys ディレクトリは検査対象外とするために ExcludePath にて設定。

    ※User は検査対象によって適宜変更する。 読み取りに root 権限が必要なファイルも検査する場合 root に設定する等。

  3. 起動スクリプトを再実行してみます。
    が、パーミッションが原因でエラーになります。
    $ sudo /etc/rc.d/init.d/clamd.scan start
    clamd.scan を起動中: ERROR: LOCAL: Socket file /var/run/clamd.scan/clamd.sock could not be bound: Permission denied
                                                               [失敗]
    
  4. /var/run/clamd.scan ディレクトリのパーミッションを設定します。
    $ sudo chown clamscan:clamscan /var/run/clamd.scan
    
  5. 起動スクリプトを再々実行してみます。
    $ sudo /etc/rc.d/init.d/clamd.scan start
    clamd.scan を起動中:                                       [  OK  ]
    

ウィルスチェックのテストを行う

(ダミー)ウィルスファイルの用意

ウィルスチェックが行われるか確認するために、ウィルス定義ファイルをを用意します。
テストファイルとしては EICAR にあるテストファイルを利用します。

参考 : EICARテストファイル - Wikipedia

上記ファイルを適当なディレクトリに作成するか、ダウンロードしておきます。

テストファイルの準備ができたら、Clam AntiVirus でウィルスのチェックを行います。
テストを行う場合、二通りの方法があります。

デーモン ( clamd.scan ) を利用する場合

動作中の Clam AntiVirus デーモン ( clamd.scan ) にチェックさせる場合には clamdscan コマンドを利用します。

$ sudo clamdscan <検査先ディレクトリ>
ERROR: Can't parse clamd configuration file /etc/clamd.conf

しかし、設定ファイルがないというエラーが出てしまいました。以下のように設定ファイルを指定して実行してもよいですが、

$ sudo clamdscan --config-file=/etc/clamd.d/scan.conf  <検査先ディレクトリ>

毎回の指定は面倒なので、シンボリックリンクを張る事で回避します。

$ sudo ln -s /etc/clamd.d/scan.conf /etc/clamd.conf 

スキャンを再実行します。

$ clamdscan /tmp
/tmp/virus-test.txt: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Infected files: 1
Total errors: 1
Time: 0.001 sec (0 m 0 s)

ウィルスが発見されました。

デーモンを利用しない場合

デーモンを利用しないでチェックを行う方法もあります。この場合は clamdscan ではなく clamscan を利用します。

$ sudo clamscan <検査先ディレクトリ>

デーモンを利用しない場合でも上記の場合と同様にウィルスの発見が行われます。

clamdscan と clamscan の使い分け

実際に上記二通りの方法を試してみると判りますが、clamscan は clamdscan に比べて相当遅いです。
デーモンが起動している場合、私たちがWindowsで利用しているアンチウィルスソフトと同様、チェックプロセス、及び、ウィルス定義ファイルはメモリ展開されています。
これに対して clamscan を利用する場合には毎回プロセスの起動、及び、定義ファイルの展開を行う必要があると思われるので、これは仕方がない事かと思います。
利用方法によって適切に使い分けましょう。

clamdscan ( デーモン ) を利用すべきケース

  • チェックを定期的に行う必要がある
  • 速度優先

clamscan を利用すべきケース

  • ウィルスチェックはたまにしか行わない
  • 常駐するプロセスをできる限り少なくしたい
  • メモリがカツカツの環境
    とはいえ、clamscan 時には一時的にでもメモリを消費するため、あまりにカツカツだと起動しない可能性も...

個人的には、きちんとウィルスチェックを行うのであれば定期実行は必須と思われるため、clamdscan を利用する方がお勧め。

自動実行の設定

デーモンを利用した実行が可能である事を確認したら、自動実行が行われるように適宜設定しましょう。
詳細に関しては省きます (--; 。

  • デーモンの自動起動設定
    $ sudo chkconfig clamd.scan on
    
  • ウィルス定義更新の自動実行
    freshclam を実行するスクリプトを /etc/cron.xxxx ディレクトリに設置
  • ウィルスチェックの定期実行
    clamdscan を実行するスクリプトを /etc/cron.xxxx ディレクトリに設置

まとめ

Clam AntiVirus を利用する事で EC2 (Amazon Linux サーバ ) 上でウィルスチェックを行う事が可能になります。設定の手間はかかりますが、ソフトウェアの追加コストは発生しません。

ウィルスの検知率に関しては、「商用製品と比べてどうなの?」といった不安もあるかとは思います。
これに関しては、Clam AntiVirus - Wikipedia (英語) - Effectiveness に参考になる記載があります ( 元記事 : Shadowserver Foundation - Stats - VirusYearlyStats )。

これによると、ウィルスチェックソフトに対して2500万以上のテストを実施し、Clam AntiVirus は 76.60%のスコアで、19のソフト中 12位。幾つかの競合製品よりも高いスコアだったとの事です。

この結果をどう受け取るかはそれぞれだとは思いますが、現在何もウィルス対策を行っていないサーバであれば、導入する効果はあると思います。

利用した事がないのであれば、実際にインストールしてウィルススキャンしてみるのもいいのではないでしょうか。
( 直視したくなかったものが見えても責任はとれませんが... )