こんにちは、スタジオ・ウミの新田です。

4月に分社化するということで先月京都で新会社発足会に参加してきたのですが、うちの会社が十数年Drupal一筋でやってきたということに改めてびっくり。移り変わりの激しいWeb業界ではけっこうレアかも?入った頃は私自身シリコンバレー文化にかぶれてたこともあって、「そんなにのんびりしてて大丈夫か?((((;゚Д゚))))」とか思ってたんですけど、不思議と仕事は巡ってくるもので、(それどころか年々案件が大きくなったり、優秀なメンバーが増えて本格的な案件にも手を出せるようになったり!)「ちっちゃいけど全然沈まない船(不思議)」というのが最近の会社へのイメージです。まぁ、ミラクル的なことは何もなくて目の前の仕事をコツコツやってるだけなんですけど (´▽`) '`,、'`,、 これからもいろんな波があると思うけど、弊社の哲学「品質・正直さ・オープンマインド」があればどんな時代もやっていけるだろうと思っておりますよ。新メンバー募集中なので、そんな不思議な会社に興味があるエンジニアやPMの方はぜひ応募してみてくださいね。

さて、最近とある案件でClamAVという無料ウィルス対策ソフトををDrupalに導入したので、今回はその方法を紹介したいと思います。

ClamAVとは?

ClamAVとは、オープンソースのウイルス対策ソフトウェアで、以下のような特徴を持っています。

  • オープンソースなので、無料で使用できる
  • Linuxの代表的なディストリビューションだけでなく、Windows、 macOS、FreeBSDで利用できる
  • 何百万ものウイルス、ワーム、トロイの木馬、およびその他のマルウェアを検出できる
  • さまざまな形式のファイルをサポートしている(サポートしてる全フォーマットはこちら
    • .com、.exeなどのWindowsの実行可能ファイル
    • .html、.pdfなどの特殊ファイル
    • .zipや.tarなどのアーカイブファイル(高圧縮ファイル爆弾も検知できる)
    • ほぼすべてのフォーマットのメールファイル
  • コマンドラインから実行できるほか、サーバーに常駐させてTCP/IP通信もしくはUnixSocketを通じて実行できる(そのため、リモートサーバーからも実行できる)
  • ウィルスの定義はDBに保存され、頻繁に更新される
  • 軽量で高速なスキャンエンジンを備えており、システムの負荷を最小限に抑えながらスキャンを実行できる

オープンソースのウィルス対策ソフトウェアの中ではかなり有名(というかデファクトスタンダード?)らしいです。

Introduction

Drupal + ClamAVでできること

DrupalのClamAVモジュールを使用すると、ローカルもしくはリモートのClamAVと連携して、Drupalにアップロードされるファイルのウィルスチェックを行うことができます。

例えば、CKEditorにアップロードしたファイルがウィルスに感染していた場合は、このようにエラーメッセージが表示され、ファイルがブロックされます。 スクリーンショット 2023-03-16 14.03.08.png (86.8 kB)

また、ブロックされたファイルはこのようにログに記録されます。 error.png (87.1 kB)

DrupalにClamAVを導入する方法

今回はDrupalから同じサーバー上のClamAVにTCPで接続し、ウィルスを検知する方法について紹介します。

ClamAVをインストール

まず、サーバーにClamAVのパッケージをインストールします。(CentOSで確認)

パッケージのインストール

まず以下のコマンドを打ちます。

dnf install -y clamav clamd clamav-update

コマンドが使えるかチェック

この時点でコマンドが使えるようになります。freshclamと打つと、手動でウィルスの定義を更新することができます。

$ sudo freshclam
ClamAV update process started at Tue Mar 14 11:46:19 2023
daily.cvd database is up-to-date (version: 26840, sigs: 2025662, f-level: 90, builder: raynman)
main.cvd database is up-to-date (version: 62, sigs: 6647427, f-level: 90, builder: sigmgr)
bytecode.cvd database is up-to-date (version: 334, sigs: 91, f-level: 90, builder: anvilleg)

次に、ファイルをclamscanコマンドでスキャンしてみます。

以下の文字列を適当なファイル名で保存します。これはEICARテストファイルと呼ばれるもので、ウィルス検知のテストに使える無害なファイルです。

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

上記のファイルをスキャンしてみます。

$ clamscan [ファイル名]

10秒くらいかかりますが、ちゃんと検知されます。

[ファイルパス]: Eicar-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 8657590
Engine version: 0.103.8
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 22.514 sec (0 m 22 s)
Start Date: 2023:03:14 12:03:33
End Date:   2023:03:14 12:03:55

freshclamclamdのサービスを起動

ときどき手動でファイルを確認するならこれだけでいいのですが、Drupalで使用する場合は、以下の手順でfreshclamclamdのサービスを起動させる必要があります。

まず、freshclamを起動させます。これにより1日複数回ウィルスのデータベースが自動更新されます。

sudo systemctl start clamav-freshclam

次にclamdというサービスを起動させます。clamdはファイルスキャン用のデーモン(常駐プログラム)です。DrupalではこれにTCP/IPもしくはUnixSocketでファイルを転送することでファイルのスキャンを行うことができます。1ファイルあたり10秒以上かかるコマンド実行と違い、デーモンを使う場合マルチスレッドで高速にファイルをスキャンすることができるため、Drupalではこちらが推奨されています。 clamdを起動する場合は、デーモンへの接続方法を設定する必要があります。今回はTCPで接続するので、/etc/clamd.d/scan.conf(CentOSの場合)で以下のコメントアウトをはずします。(コメントアウトしたままだと、デーモン起動時にエラーになるのでご注意ください。)リモート接続する場合など、TCPSocketTCPAddrの値は適宜書き換えてください。

FixStaleSocket yes
TCPSocket 3310
TCPAddr 127.0.0.1

デーモンを起動します。

systemctl start clamd@scan

念の為freshclamclamdが起動しているか確認します。

$ systemctl | grep clam

以下のように表示されていればOKです。

clamav-freshclam.service     loaded active running   ClamAV virus database updater
clamd@scan.service           loaded active running   clamd scanner (scan) daemon

このままだとサーバーを再起動したときなどにサービスも落ちたままになってしまうため、OSの起動時に自動的にスタートするようにします。

$ sudo systemctl enable clamav-freshclam
$ sudo systemctl enable clamd@scan

Drupalのモジュールをインストール

次に、Drupal側の設定を行います。 まず、ClamAVモジュールをインストールします。

composer require drupal/clamav
drush en clamav

次にブラウザからadmin/config/media/clamavにアクセスし、Drupal側の設定を確認します。特に、接続情報がさきほどscan.confで設定した値と一致していることを確認してください。

clamav.png (376.4 kB)

これでDrupal側の設定は完了です。

動作確認

DrupalのファイルフィールドやCKEditorで、さきほどのEICARテストファイルをアップロードしてみます。A virus has been detected in the file. The file will be deleted.というエラーが出れば成功です。

というわけで、ClamAVを導入する方法の紹介でした。


共に働く新しい仲間を
募集しています

スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。