「Linux にアンチウイルスは要らない」という意見は広く行き渡っており、元の意味においては正しいものです。Linux のシステムファイルに感染するウイルスはほぼ存在しません。サーバー上での ClamAV の仕事は別物であり、こう言い表せます。あなたのサイトを通じてアップロードされたものを見つけよ、と。何よりまず web shell です。
正確には何を探しているのか
web shell は、ブラウザ経由でコマンドを実行できるようにする小さな PHP ファイルです。アップロードフォームや脆弱なプラグイン、あるいは推測された管理者パスワード経由でやって来て、アップロード用ディレクトリの画像の中に居座り、何か月もそこで暮らします。ファイアウォールも Fail2ban もそれを見ません。そこへのリクエストはサイトへの普通のリクエストに見えるからです。
そのほかに ClamAV が見つけるもの:
- 利用者がアップロードし、あなたのサーバーからさらに配られている悪意あるファイル——プロバイダーからの手紙はたいていこれについてです;
- メールの添付。サーバーがメールを扱っている場合;
- ファイル置き場にある Windows 用のマルウェア——サーバー自身には関係ありませんが、そのファイルをダウンロードした従業員が被害を受けます。
限界については先に言っておきます。ClamAV は侵入を防ぎませんし、自分で侵入を検知することもありません。それが検知するのは痕跡です。既存のテーマファイルの末尾に巧妙に足された裏口は、シグネチャ型のスキャナをすり抜けます——そのためにこそファイルの完全性監視があるのです。
インストールと、意味のある唯一の設定
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
二つ目のコマンドのほうが一つ目より重要です。freshclam はシグネチャ更新のサービスであり、それが動いていなければ ClamAV は役立たずになりながら、走査成功の報告だけは続けます。データベースの新しさはこう確認します。
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
一週間より古いデータベースは仕組みが壊れている印です。よくある原因は外向き接続の遮断か、freshclam が root で手動実行され、その後は権限のせいでサービスが自分のファイルへ書けなくなっていることです。
メモリ:常駐デーモンか一回きりの実行か
使い方は二つあり、その選択は意識的であるべきです。
clamd は常駐するデーモンで、データベースをメモリに保持します。応答は速いのですが、RAM を一ギガバイトほど占めます。一、二ギガバイトの VPS ではそれは許容できません。デーモンがデータベースと PHP-FPM を押しのけ、サーバーは目に見える理由なく這い始めます。診断は free -m と swap が動いているかどうかで行います。
もう一つの選択肢はスケジュールで走らせる clamscan です。遅い(実行のたびにデータベースを読み込むので一分ほど)代わりに、走査中だけ働きます。
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
-i フラグは見つかったものだけを表示します。無ければ出力は数十万行に達します。
ディスクではなくディレクトリを走査する
非力なサーバーでのディスク全体の走査は何時間もかかり負荷を生みます。だからこそ夜間に回され、そのうち完全に切られてしまいます。実務的なのは、実際に外から変わる場所を走査することです。
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
この一行では三つが重要です。ionice と nice がサイトへの影響を取り除きます。--remove ではなく --move——ファイルは削除ではなく隔離へ移ります。誤検知は起こりますし、誤って消された顧客のファイルはどこからも戻ってきません。そして走査するディレクトリは、ルートではなくファイルがアップロードされる場所です。
web shell 向けのシグネチャ
ClamAV の標準データベースは PHP の裏口に弱いものです。主にメールのトラフィックへ向けられているからです。Linux Malware Detect(maldet)はこの点で目に見えて優れています。まさに web shell を中心に組まれた独自のシグネチャ集を持ち、ClamAV が入っていればそのエンジンで走査します。実務でよく使われる組み合わせは、エンジンと更新可能なデータベースとしての ClamAV、専門的なシグネチャの供給源としての maldet です。
見つけたらどうするか
見つかった web shell は調査の終わりではなく始まりです。アップロード用ディレクトリにファイルがあるということは、そこへ書けた人がいるということであり、ファイルを消してもその能力は消えません。
- すぐに消さないでください——控えを取り、そのファイルの変更時刻を記録します。
- その時刻を手がかりに、Web サーバーのログでどのリクエストがそれを置いたのかを探します。それが脆弱性です。
- 隣人を探してください。裏口が一つだけ残されることはほとんどありません。
- 同じ期間にディスク上で他に何が変わったか、新しい cron ジョブや SSH の鍵が現れていないかを確認します。
誤検知について別途ひとこと。テンプレートのライブラリや圧縮された JavaScript がシグネチャに一致することがあります。だからこそ削除ではなく隔離なのであり、だからこそ見つかる限りの第三者シグネチャ集を片端から足すな、という助言になるのです。半分がノイズであるレポートへの信頼は一週間で消え、人々はそれを読まなくなります。
スキャナの実務的な価値は、その結果が目に入ることにあります。前回の走査はいつ走ったか、データベースはどれだけ古いか、何が見つかったか。それは一行ですが、その不在は入れてあるアンチウイルスを単なるチェック印に変えてしまいます。その一行がどう見えるかは下のデモページで。