はじめに
AWSマネージドサービスのNFSサーバーである EFS
に対してECS Fargate+ClamAVでマルウェアスキャンを定期実行する方法を共有します。
要件として「マルウェア対策を導入すること」というのがよくあります。EFSを使っているケースで、安価にマルウェア対策したい場合の参考になれば幸いです。
概要
現時点でAWSによるEFSのマルウェア対策の機能は提供されていません。
- サードパーティー製品の導入などのコストをかけたくない
→ OSSのClamAVとサーバーレスのコンテナで定期スキャンしよう!
想定ケース
Webシステムでアップロードされたファイルの保存先としてEFSを使用
要件
- EFS上のファイルを定期スキャンしたい(週1回、フルスキャンなど)
- 安価に対応したい。過剰な対策コストはかけられない
対応検討
- 万一、EFSにマルウェアが保存されても、それだけでは悪用されないと割り切る
- エンドポイント側とサーバー側で責任共有/分担する
-
サーバー側では定期的なフルスキャンのみ対応する
- エンドポイント側でリアルタイムスキャンできなかった未知のマルウェアは、サーバー保存時のスキャンでも対応できない可能性が高い
- サーバー側では定期的にフルスキャンすることでカバーする。(時間が経ち、未知→既知になれば対応できる)
具体策
- 安価に対応したいため、OSSの
ClamAV
を使用する - docker版があるため、サーバーレスのコンテナで動かす
- 制限の少ない ECS Fargate を選択
- ECSタスク定義で、EFSマウントを設定
- コンテナでウイルスデータベース更新(
freshclam
)とスキャン(clamscan
)を実行する - 定期実行するため、ECSタスクスケジューリングを使用
ClamAVについて
オープンソース(GPLv2)のウイルス対策ツールキット。Cisco Systems, Incによって提供されている。
構成要素
- EFS
- ECS Fargate+タスクスケジューリング
- ClamAV(Docker Hub / clamav/clamav:1.2)
構成図
ClamAVコンテナの用意
- Dockerfile
FROM clamav/clamav:1.2 COPY scan.sh / RUN chmod +x /scan.sh RUN mkdir -p /data CMD /scan.sh
- scan.sh
#!/bin/sh freshclam clamscan -v -r /data
- 参考:docker-compose.yml (ローカル検証用)
services: clamav: build: .
AWS設定
手順(詳細は省略)
- 前提:EFS 作成、アクセスポイント設定済み
- CodeCommit リポジトリ作成 (Git)
- ECR リポジトリ作成 (コンテナイメージ管理)
- ECS タスク定義作成
- ECS タスクスケジューリング設定
留意事項
- メモリは2GB以上必須
- 1GBメモリでは clamscanの実行中に
Killed
で停止した - AWS Cloud9の場合、t3.small (1GBメモリ) ではハングアップ状態になった。t3.mediumで動くことを確認
- 1GBメモリでは clamscanの実行中に