こんにちは、スタジオ・ウミの新田です。
4月に分社化するということで先月京都で新会社発足会に参加してきたのですが、うちの会社が十数年Drupal一筋でやってきたということに改めてびっくり。移り変わりの激しいWeb業界ではけっこうレアかも?入った頃は私自身シリコンバレー文化にかぶれてたこともあって、「そんなにのんびりしてて大丈夫か?((((;゚Д゚))))」とか思ってたんですけど、不思議と仕事は巡ってくるもので、(それどころか年々案件が大きくなったり、優秀なメンバーが増えて本格的な案件にも手を出せるようになったり!)「ちっちゃいけど全然沈まない船(不思議)」というのが最近の会社へのイメージです。まぁ、ミラクル的なことは何もなくて目の前の仕事をコツコツやってるだけなんですけど (´▽`) '`,、'`,、 これからもいろんな波があると思うけど、弊社の哲学「品質・正直さ・オープンマインド」があればどんな時代もやっていけるだろうと思っておりますよ。新メンバー募集中なので、そんな不思議な会社に興味があるエンジニアやPMの方はぜひ応募してみてくださいね。
さて、最近とある案件でClamAVという無料ウィルス対策ソフトををDrupalに導入したので、今回はその方法を紹介したいと思います。
ClamAVとは?
ClamAVとは、オープンソースのウイルス対策ソフトウェアで、以下のような特徴を持っています。
- オープンソースなので、無料で使用できる
- Linuxの代表的なディストリビューションだけでなく、Windows、 macOS、FreeBSDで利用できる
- 何百万ものウイルス、ワーム、トロイの木馬、およびその他のマルウェアを検出できる
- さまざまな形式のファイルをサポートしている(サポートしてる全フォーマットはこちら)
- .com、.exeなどのWindowsの実行可能ファイル
- .html、.pdfなどの特殊ファイル
- .zipや.tarなどのアーカイブファイル(高圧縮ファイル爆弾も検知できる)
- ほぼすべてのフォーマットのメールファイル
- コマンドラインから実行できるほか、サーバーに常駐させてTCP/IP通信もしくはUnixSocketを通じて実行できる(そのため、リモートサーバーからも実行できる)
- ウィルスの定義はDBに保存され、頻繁に更新される
- 軽量で高速なスキャンエンジンを備えており、システムの負荷を最小限に抑えながらスキャンを実行できる
オープンソースのウィルス対策ソフトウェアの中ではかなり有名(というかデファクトスタンダード?)らしいです。
Drupal + ClamAVでできること
DrupalのClamAVモジュールを使用すると、ローカルもしくはリモートのClamAVと連携して、Drupalにアップロードされるファイルのウィルスチェックを行うことができます。
例えば、CKEditorにアップロードしたファイルがウィルスに感染していた場合は、このようにエラーメッセージが表示され、ファイルがブロックされます。
また、ブロックされたファイルはこのようにログに記録されます。
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
freshclam
とclamd
のサービスを起動
ときどき手動でファイルを確認するならこれだけでいいのですが、Drupalで使用する場合は、以下の手順でfreshclam
とclamd
のサービスを起動させる必要があります。
まず、freshclam
を起動させます。これにより1日複数回ウィルスのデータベースが自動更新されます。
sudo systemctl start clamav-freshclam
次にclamd
というサービスを起動させます。clamd
はファイルスキャン用のデーモン(常駐プログラム)です。DrupalではこれにTCP/IPもしくはUnixSocketでファイルを転送することでファイルのスキャンを行うことができます。1ファイルあたり10秒以上かかるコマンド実行と違い、デーモンを使う場合マルチスレッドで高速にファイルをスキャンすることができるため、Drupalではこちらが推奨されています。
clamd
を起動する場合は、デーモンへの接続方法を設定する必要があります。今回はTCPで接続するので、/etc/clamd.d/scan.conf
(CentOSの場合)で以下のコメントアウトをはずします。(コメントアウトしたままだと、デーモン起動時にエラーになるのでご注意ください。)リモート接続する場合など、TCPSocket
やTCPAddr
の値は適宜書き換えてください。
FixStaleSocket yes
TCPSocket 3310
TCPAddr 127.0.0.1
デーモンを起動します。
systemctl start clamd@scan
念の為freshclam
とclamd
が起動しているか確認します。
$ 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
で設定した値と一致していることを確認してください。
これでDrupal側の設定は完了です。
動作確認
DrupalのファイルフィールドやCKEditorで、さきほどのEICARテストファイルをアップロードしてみます。A virus has been detected in the file. The file will be deleted.
というエラーが出れば成功です。
というわけで、ClamAVを導入する方法の紹介でした。
募集しています
スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。