CentOS 7 ウィルススキャンの導入(ClamAV)

サーバー用途の多いCentOS7でも、その蓄積させたデータにはウィルスが混入する危険があります。
このウィルスを放置することで、利用者に被害が出る可能性がありますので、サーバー運用のCentOS7にもウィルススキャン環境を構築する方法をご紹介いたします。

ウィルススキャンとしては、オープンソースの ClamAV を使用します。
ClamAVは「ファイルスキャン」「メールスキャン」など、様々な状況で利用できるウィルススキャンエンジンです。

ClamAV のインストール

ClamAVは様々な配布方式がありますが、今回は epelリポジトリで提供されているClamAVをインストールしていきます。

epelリポジトリを有効にし、ClamAVをインストールするには以下のコマンドを実行します。

# yum install epel-release
# yum install clamav clamav-data clamav-devel clamav-filesystem clamav-update clamd
clamav
ClamAV本体。各種ツール類
clam-data
ウィルススキャンデータベース
clamav-devel
ClamAVの関連ライブラリやヘッダーファイル
clamav-filesystem
ClamAV動作に必要なユーザー設定やファイル構成のパッケージ
clamav-update
ウィルスデータベースを更新するためのパッケージ
clamd
ClamAVをデーモンとして動作させるパッケージ

インストール後の初期のウィルススキャン

インストールが終わったら、各種設定の前に既存のシステムのウィルススキャンを実施します。

実行前にウィルスデータベースのアップデートを実施します。
※)以前は、freshclamの実行の前に設定ファイルの変更が必要でしたが、CentOS7 epelパッケージでは、すぐにfreshclamが実行できるように設定ファイルが変わっています。

# freshclam
ClamAV update process started at Sat Oct  5 11:12:56 2019
main.cvd is up to date (version: 58, sigs: 4566249, f-level: 60, builder: sigmgr)
daily.cld is up to date (version: 25592, sigs: 1796292, f-level: 63, builder: raynman)
bytecode.cld is up to date (version: 331, sigs: 94, f-level: 63, builder: anvilleg)

ウィルスデータベースの更新が終わったら、以下のコマンドを実行して /var,/home などユーザーデータが入り込む危険のあるディレクトリを検査します。

# clamscan --infected --recursive /var
# clamscan --infected --recursive /home
# clamscan --infected --recursive /opt

実行パラメータに –remove をつけることで、ウィルスを発見したときに自動的に削除することもできますが、重要なファイルだった場合などを考え、 –remove はつけないで結果を確認します。

実行結果の例は次のようになります。

----------- SCAN SUMMARY -----------
Known viruses: 6352093
Engine version: 0.101.4
Scanned directories: 2610
Scanned files: 27190
Infected files: 0
Data scanned: 417.12 MB
Data read: 1378.61 MB (ratio 0.30:1)
Time: 158.312 sec (2 m 38 s)
Known viruses
ウィルスデータベースの定義数
Engine version
ClamAVのバージョン
Scanned directories
検査したディレクトリの数
Scanned files
検査したファイルの数
Infected files
重要: 検出したウィルスの数
Data scanned
スキャンしたファイルの合計
Data read
スキャンしたデータサイズ(圧縮データの展開も含む)
Time
スキャンにかかった時間

重要なのは「Infected files」になります。ここの値が 0 でない場合、ウィルスに感染したファイルがシステム上に存在することになるので、対策が必要です。

検出したファイルを削除するか、バックアップから元のファイルを書き戻して、再度フィルススキャンしてシステムがクリーンな状態であることを確認します。

ウィルスデータベース更新

基本的なウィルススキャンの実行が確認できたので、ウィルスデータベースの更新ができるように設定していきます。

ウィルスデータベース更新の設定 freshclam

ウィルスデータベース更新ツール freshclam の動作を設定します。
設定ファイルは /etc/freshclam.conf になります。

# cp /etc/freshclam.conf /etc/freshclam.conf-org
# vi /etc/freshclam.conf

主に設定していく項目は、以下の内容になります。

Example
Exsampleをコメントアウトします。Exampleがると動作しません。
UpdateLogFile
ログファイルの場所を指定します。例 /var/log/freshclam.log
LogFileMaxSize
ログファイルの最大サイズを指定します。例 2M
LogTime
ログにタイムスタンプを追加します。例 Yes
LogRotae
ログローテーションの指定。例 Yes
DatabaseOwner
データベース所有者の指定。例 root
NotifyClamd
clamdへの更新通知のための設定ファイル指定。例 /etc/clamd.d/scan.con

ウィルスデータベースの更新

設定が完了したら、以下のコマンドで ウィルスデータベースを更新します。

]# freshclam -u root
ClamAV update process started at Sat Oct  5 15:13:58 2019
main.cvd is up to date (version: 58, sigs: 4566249, f-level: 60, builder: sigmgr)
daily.cld is up to date (version: 25592, sigs: 1796292, f-level: 63, builder: raynman)
bytecode.cld is up to date (version: 331, sigs: 94, f-level: 63, builder: anvilleg)

ウィルスデータベースの自動更新:cron

CentOSでは、パッケージ導入時点で freshclam を定期的に実行するスケジュールが登録されます。

# cat /etc/cron.d/clamav-update

## Adjust this line...
MAILTO=root

## It is ok to execute it as root; freshclam drops privileges and becomes
## user 'clamupdate' as soon as possible
0  */3 * * * root /usr/share/clamav/freshclam-sleep

もし、なんからの理由で clamav-update が登録されていない場合には、上記内容を追加することで、3時間毎にウィルスデータベースの更新が実行されます。

ウィルススキャンの動作確認

ウィルスデータベースの更新設定が終わり、最新のウィルスデータベースになったので、ウィルスの検出ができるかを確認します。

テスト用ファイルのダウンロード

ウィルス検出のテストに使用するのは、EICARが開発した「eicar.com」ファイルになります。

# cd /root
# wget http://www.eicar.org/download/eicar.com

ウィルススキャンの実行

# clamscan /root
/root/.mysql_history: OK
/root/.bash_history: OK
/root/org-info.txt: OK
/root/.cshrc: OK
/root/.tcshrc: OK
/root/eicar.com: Eicar-Test-Signature FOUND
/root/.bashrc: OK
/root/mount-kamakura.sh: OK
/root/.bash_profile: OK
/root/.bash_logout: OK

----------- SCAN SUMMARY -----------
Known viruses: 6352093
Engine version: 0.101.4
Scanned directories: 1
Scanned files: 10
Infected files: 1
Data scanned: 0.02 MB
Data read: 0.01 MB (ratio 2.00:1)
Time: 57.204 sec (0 m 57 s)

先ほどダウンロードしたテストファイルが検出されたことを確認できました。
確認が完了したら、忘れずに eicar.com ファイルを削除します。

# rm /root/eicar.com
rm: remove regular file '/root/eicar.com'? y

ウィルススキャンの実行

ここまでの設定で、コマンドラインによるウィルススキャンの実行環境が整いました。

ClamAVのデーモン実行

ここまでの ClamAVは、コマンドラインで実行する方法でした。
コマンドラインで実行する clamscan は、手軽に実行できますが、実行のたびにウィルスデータベースを読み込むため、実行のたびに多くのディスクI/Oとメモリーを必要とします。
また、その作り上、手軽ですがウィルススキャンに多くの時間を必要とします。

常に常駐して必要なときに、素早くウィルススキャンを実行する方法としてClamAVをデーモンとして実行しておく方法があります。
ClamAVをデーモンとして実行しておくことで、Postfixや、そのほかのアプリケーションと連携することもできるようになります。

scan.confの準備

ClamAVをデーモンとして常駐させるためには、clamd@scan の設定を行います。
clamd@scan の設定ファイルは /etc/clamd.d/scan.conf になります。

# cd /etc/clamd.d
# cp scan.conf scan.conf-org
# vi scan.conf

scan.confの設定内容

Example
Exampleがあるとclamdは動作しません。削除するかコメントアウトします。
LocalSocket
/var/run/clamd.scan/clamd.sock を指定します。
FixStaleSocket yes
異常終了時にソケットを削除するかの指定です。yesにします。
User root
実行するユーザーの指定。rootを指定します。

ExcludePathの指定

scan.confでは、スキャンしないディレクトリを指定できます。システムが管理しているディレクトリなどはスキャンする必要がないため、以下のディレクトリを除外するディレクトリとして指定します。

  • ExcludePath ^/proc/
  • ExcludePath ^/sys/
  • ExcludePath ^/dev/

clamd@scanの起動

設定ファイルの準備ができたら、clamd@scan を起動します。
ウィルスデータベースを読み込みますので、起動に時間がかかる場合があります。

# systemctl restart clamd@scan

起動の確認

clamd@scan が起動したら、systemctl コマンドで起動を確認します。

# systemctl status clamd@scan

* [email protected] - Generic clamav scanner daemon
   Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2019-10-05 15:29:54 JST; 25s ago
     Docs: man:clamd(8)
           man:clamd.conf(5)
           https://www.clamav.net/documents/
  Process: 31301 ExecStart=/usr/sbin/clamd -c /etc/clamd.d/%i.conf (code=exited, status=0/SUCCESS)
 Main PID: 31330 (clamd)
   CGroup: /system.slice/system-clamd.slice/[email protected]
           `-31330 /usr/sbin/clamd -c /etc/clamd.d/scan.conf

Oct 05 15:29:51 ik1-405-34989.vs.sakura.ne.jp clamd[31330]: ELF support enabled.
Oct 05 15:29:51 ik1-405-34989.vs.sakura.ne.jp clamd[31330]: Mail files suppor...
Oct 05 15:29:51 ik1-405-34989.vs.sakura.ne.jp clamd[31330]: OLE2 support enab...
Oct 05 15:29:51 ik1-405-34989.vs.sakura.ne.jp clamd[31330]: PDF support enabled.
Oct 05 15:29:51 ik1-405-34989.vs.sakura.ne.jp clamd[31330]: SWF support enabled.
Oct 05 15:29:51 ik1-405-34989.vs.sakura.ne.jp clamd[31330]: HTML support enab...
Oct 05 15:29:51 ik1-405-34989.vs.sakura.ne.jp clamd[31330]: XMLDOCS support e...
Oct 05 15:29:51 ik1-405-34989.vs.sakura.ne.jp clamd[31330]: HWP3 support enab...
Oct 05 15:29:51 ik1-405-34989.vs.sakura.ne.jp clamd[31330]: Self checking eve...
Oct 05 15:29:54 ik1-405-34989.vs.sakura.ne.jp systemd[1]: Started Generic cla...
Hint: Some lines were ellipsized, use -l to show in full.

自動起動の設定

システムが起動したときに自動的に clamd@scanが起動するように設定します。

# systemctl enable clamd@scan

Created symlink from /etc/systemd/system/multi-user.target.wants/[email protected] to /usr/lib/systemd/system/[email protected].

clamd@scanを使用したウィルススキャン

clamd@scan をデーモンで起動した後に、ウィルススキャンを実行するには、「clamdscan」を使用します。

テストファイルの準備

先ほどと同様に、テスト用のファイルを用意します。

# cd /root
# wget http://www.eicar.org/download/eicar.com

clamdscanを使用したウィルススキャン

clamd@scan を使用してウィルススキャンを行います。

# clamdscan /root
/root/eicar.com: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Infected files: 1
Time: 2.309 sec (0 m 2 s)

先ほどと同じように eicar.com が検出されましたが、実行時間が 2秒になり、前回より早く処理が完了していることが確認できました。

デーモン化した環境では、clamdscan (dがついていることに注意) を使用してスキャンを行います。

# which clamdscan
/bin/clamdscan