Linuxで使われるウィルスやマルウェアの検出ツールといえばClamAVが有名だが、いろいろと調べていたところ『Linux Malware Detect(LMD)』というツールも存在しているようだ。

リアルタイムスキャンにも対応しているようで、見てる限りよさそう。 ライセンスはGNU GPLv2。 ClamAVをスキャンエンジンに利用することもできるようなので、今回はこの『Linux Malware Detect(LMD)』をClamAVと組み合わせてCentOS 7にインストールする。

1. Linux Malware Detectのインストール

インストールは簡単。 まず、以下のコマンドでソース類を取得してくる。

wget http://www.rfxn.com/downloads/maldetect-current.tar.gz

アーカイブを展開し、中にある「install.sh」を実行する。

tar xzvf maldetect-current.tar.gz
cd maldetect-*
./install.sh

これでインストールができてるはずだ。 リアルタイムスキャンを行わせるため、inotify-toolsについてもインストールしておく。

yum install -y inotify-tools

2. ClamAVのインストール・設定

次に、ClamAVのインストールと諸設定を行う。 以下のコマンドでdagリポジトリの導入とClamAVのインストールを行う。

cat << "EOF" > /etc/yum.repos.d/dag.repo
[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el$releasever/en/$basearch/dag/
gpgcheck=0
enabled=0
EOF
yum --enablerepo=dag update && yum --enablerepo=dag install clamd

3. スキャンの設定を行う

次に、スキャン時の設定を行う。 「/usr/local/maldetect/conf.maldet」というファイルができているはずなので、そこで設定を行う。 とりあえず、今回は以下の項目について変更した。

/usr/local/maldetect/conf.maldet(該当箇所変更)
email_alert=1 email_addr=メールアドレス quarantine_hits=1 quarantine_clean=1 quarantine_suspend_user=1 scan_clamscan=1

一応、設定内容としては以下。

  • 「email_alert」でメールアラートの有効化。
  • 「quarantine_hits」で、マルウェア検知時のデフォルト動作を指定(0はアラートのみ、1で隔離とアラート)。
  • 「quarantine_clean」で、文字列ベースのマルウェアに関する記述を削除(0で無効、1で有効)
  • 「quarantine_suspend_user」で、マルウェアとして検知されたファイル所有者アカウントを停止する(0で無効、1で有効)
  • 「scan_clamscan」で、スキャン時にClamAVのバイナリを用いるように定義。

設定完了後、サービスとして動作させるために、一度サービスファイルをいじってやる必要がある。 (なんか、サービスファイルにサンプルPATHが直書きされてるのでそのままだとサービスが上がってこない。先ほどの設定ファイルのパラメータに「default_monitor_mode」って項目あったはずなんだが…)

とりあえず、パラメーターをusersにしておく。

/usr/lib/systemd/system/maldet.service
[Unit] Description=Linux Malware Detect monitoring - maldet After=network.target [Service] ExecStart=/usr/local/maldetect/maldet --monitor users ExecStop=/usr/local/maldetect/maldet --kill-monitor Type=forking PIDFile=/usr/local/maldetect/tmp/inotifywait.pid [Install] WantedBy=multi-user.target

サービスファイル編集後、以下のコマンドでサービスを起動する。

systemctl daemon-reload
systemctl start maldet

このとき、以下のようなエラーが表示される場合がある。

[root@BS-PUB-CENT7-01 ~]# systemctl status maldet
● maldet.service - Linux Malware Detect monitoring - maldet
   Loaded: loaded (/usr/lib/systemd/system/maldet.service; enabled; vendor preset: disabled)
   Active: failed (Result: resources) since 月 2017-01-23 02:49:44 JST; 4s ago
  Process: 31051 ExecStart=/usr/local/maldetect/maldet --monitor users (code=exited, status=0/SUCCESS)

 1月 23 02:49:42 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} added / to inotify monitoring array
 1月 23 02:49:42 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} added /dev/shm to inotify monitoring array
 1月 23 02:49:42 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} added /var/tmp to inotify monitoring array
 1月 23 02:49:42 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} added /tmp to inotify monitoring array
 1月 23 02:49:42 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} starting inotify process on 8 paths, this might take awhile...
 1月 23 02:49:44 BS-PUB-CENT7-01.blacknon.local maldet[31051]: maldet(31051): {mon} no inotify process found, check /usr/local/maldetect/logs/inotify_log for errors.
 1月 23 02:49:44 BS-PUB-CENT7-01.blacknon.local systemd[1]: PID file /usr/local/maldetect/tmp/inotifywait.pid not readable (yet?) after start.
 1月 23 02:49:44 BS-PUB-CENT7-01.blacknon.local systemd[1]: Failed to start Linux Malware Detect monitoring - maldet.
 1月 23 02:49:44 BS-PUB-CENT7-01.blacknon.local systemd[1]: Unit maldet.service entered failed state.
 1月 23 02:49:44 BS-PUB-CENT7-01.blacknon.local systemd[1]: maldet.service failed.

記述のあるようにログファイルを見ると、以下のように「max_user_watches」の値(デフォルトだと8192)が足りないというエラー。

[root@BS-PUB-CENT7-01 ~]# cat /usr/local/maldetect/logs/inotify_log
Setting up watches.  Beware: since -r was given, this may take a while!
Failed to watch /; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via `/proc/sys/fs/inotify/max_user_watches'.

このエラーが表示された場合は、以下のコマンドで現在+再起動後での値を設定してやる。

echo "fs.inotify.max_user_watches = 65535" >> /etc/sysctl.conf
sysctl -p

4. 検出の確認

サービスが無事起動したら、一般ユーザでマルウェア検知のテストを行ってみよう。 一般ユーザで、以下のコマンドを実行してホームディレクトリ配下にウィルスファイルを置いてみよう。

wget https://www.eicar.org/download/eicar.com
wget https://www.eicar.org/download/eicar.com.txt
wget https://www.eicar.org/download/eicar_com.zip
wget https://www.eicar.org/download/eicarcom2.zip
[test@BS-PUB-CENT7-01 ~]$ wget https://www.eicar.org/download/eicar.com
--2017-01-23 03:06:29--  https://www.eicar.org/download/eicar.com
www.eicar.org (www.eicar.org) をDNSに問いあわせています... 213.211.198.62
www.eicar.org (www.eicar.org)|213.211.198.62|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 68 [application/octet-stream]
`eicar.com' に保存中

100%[===================================================================================================================================================================================================&gt;] 68          --.-K/s 時間 0s

2017-01-23 03:06:30 (2.96 MB/s) - `eicar.com' へ保存完了 [68/68]

[test@BS-PUB-CENT7-01 ~]$ wget https://www.eicar.org/download/eicar.com.txt
--2017-01-23 03:06:30--  https://www.eicar.org/download/eicar.com.txt
www.eicar.org (www.eicar.org) をDNSに問いあわせています... 213.211.198.62
www.eicar.org (www.eicar.org)|213.211.198.62|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 68 [application/octet-stream]
`eicar.com.txt' に保存中

100%[===================================================================================================================================================================================================&gt;] 68          --.-K/s 時間 0s

2017-01-23 03:06:31 (3.64 MB/s) - `eicar.com.txt' へ保存完了 [68/68]

[test@BS-PUB-CENT7-01 ~]$ wget https://www.eicar.org/download/eicar_com.zip
--2017-01-23 03:06:31--  https://www.eicar.org/download/eicar_com.zip
www.eicar.org (www.eicar.org) をDNSに問いあわせています... 213.211.198.62
www.eicar.org (www.eicar.org)|213.211.198.62|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 184 [application/octet-stream]
`eicar_com.zip' に保存中

100%[===================================================================================================================================================================================================&gt;] 184         --.-K/s 時間 0s

2017-01-23 03:06:33 (2.94 MB/s) - `eicar_com.zip' へ保存完了 [184/184]

[test@BS-PUB-CENT7-01 ~]$ wget https://www.eicar.org/download/eicarcom2.zip
--2017-01-23 03:06:34--  https://www.eicar.org/download/eicarcom2.zip
www.eicar.org (www.eicar.org) をDNSに問いあわせています... 213.211.198.62
www.eicar.org (www.eicar.org)|213.211.198.62|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 308 [application/octet-stream]
`eicarcom2.zip' に保存中

100%[===================================================================================================================================================================================================&gt;] 308         --.-K/s 時間 0s

2017-01-23 03:06:35 (10.2 MB/s) - `eicarcom2.zip' へ保存完了 [308/308]

[test@BS-PUB-CENT7-01 ~]$ ls -la
合計 32
drwx------. 2 test test 4096  1月 23 03:06 .
drwxr-xr-x. 3 root root   17  1月 23 03:02 ..
-rw-r--r--. 1 test test   18 12月  7 08:19 .bash_logout
-rw-r--r--. 1 test test  193 12月  7 08:19 .bash_profile
-rw-r--r--. 1 test test  231 12月  7 08:19 .bashrc
-rw-rw-r--. 1 test test   68  1月 23 03:06 eicar.com
-rw-rw-r--. 1 test test   68  1月 23 03:06 eicar.com.txt
-rw-rw-r--. 1 test test  184  1月 23 03:06 eicar_com.zip
-rw-rw-r--. 1 test test  308  1月 23 03:06 eicarcom2.zip

しばらくたつと、動作ログ(/usr/local/maldetect/logs/event_log)に以下のような表示がされ、検疫ファイルとして移動される。

 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {hit} malware hit {HEX}EICAR.TEST.10 found for /home/test/eicar.com
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {quar} malware quarantined from '/home/test/eicar.com' to '/usr/local/maldetect/quarantine/eicar.com.1528815'
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {hit} malware hit {HEX}EICAR.TEST.10 found for /home/test/eicar.com.txt
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {quar} malware quarantined from '/home/test/eicar.com.txt' to '/usr/local/maldetect/quarantine/eicar.com.txt.3134717965'
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {hit} malware hit {HEX}EICAR.TEST.10 found for /home/test/eicar_com.zip
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {quar} malware quarantined from '/home/test/eicar_com.zip' to '/usr/local/maldetect/quarantine/eicar_com.zip.1594324099'
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {hit} malware hit {HEX}EICAR.TEST.10 found for /home/test/eicarcom2.zip
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {quar} malware quarantined from '/home/test/eicarcom2.zip' to '/usr/local/maldetect/quarantine/eicarcom2.zip.2080111255'
 1月 23 03:07:06 BS-PUB-CENT7-01 maldet(31879): {mon} scanned 32 new/changed files with clamav engine

なお、この設定だとウィルスが見つかったユーザはロックされるので、suでスイッチもできなくなるので注意。 (自分でやっといてなんだけど、スイッチもできなくなっててちょっと困った。)


参考