アンチウイルスソフト Antivirus for Amazon S3 を本番環境に導入してみてわかったメリット・デメリット

こんにちは。SREチームの吉澤です。

アンドパッドでは最近、AWSのS3バケット上のファイルをスキャンするために、アンチウイルスソフト Antivirus for Amazon S3 を本番環境に導入しました。その結果、私たちの要件はほぼ全て満たされたうえに、従来比で大幅なコスト削減を実現できました。

Antivirus for Amazon S3について日本語で書かれた記事はまだ少ないですが、S3に対するウイルススキャンが求められるケースでは、導入を検討する価値があるソフトです。

そこで、今回はこのAntivirus for Amazon S3の概要、私たちが本番環境に導入してみてわかったメリットやデメリット、そしてこのソフトが適した状況をご紹介します。

背景

S3に対するウイルススキャンが必要な理由

アンドパッドは、ご利用いただいている企業のユーザーからアップロードされたファイルに対して、ウイルススキャンを実行しています。そして、マルウェア(ウイルスを含む悪意があるファイル全般)である可能性が高いと判断した場合は、ファイルを削除したうえで、アップロードした方に連絡しています。

このように対応している理由は、あるユーザーが意図せずにマルウェアを含むファイルをアップロードしてしまった場合に、他のユーザーがそのファイルをダウンロードし、マルウェアを実行してしまうことを防ぐためです。

アンドパッドはAmazon Web Services(AWS)上でサービスを提供しており、このサービスに関連するファイルは主にAmazon S3のバケット(以下、S3バケット)上に保存しています。そのため、S3バケットへのファイル追加を契機として、ウイルススキャンを実行しています。

Antivirus for Amazon S3の導入前に利用していたソフト

Antivirus for Amazon S3の導入前は、Apache License 2.0で公開されているオープンソースソフトウェア(OSS)のbucket-antivirus-functionに対して、アンドパッドでの要件に基づく修正を加えて使っていました。

このソフトは、Lambda関数で、ClamAVというOSSのウイルススキャンエンジンを実行します。このソフトを導入した当初は問題なかったのですが、年月の経過に伴って、以下の2点が問題になり始めました。

  • bucket-antivirus-functionの開発が終了し、LambdaランタイムやClamAVのアップグレードに伴う対応を自分たち自身で行う必要が生じた
  • アンドパッドのサービス成長に伴い、扱うファイルの総数や合計サイズが増えた結果、Lambdaの実行コストが増加した

これらの問題を解決するために、乗り換え先として複数のOSSや商用製品を検討した結果、Antivirus for Amazon S3がアンドパッドの要件に最も適していました。そこで開発環境で十分な動作検証および性能テストを実施したのち、2024年1月から本番環境に導入しました。現在は、旧システムからAntivirus for Amazon S3へのリプレースが完了しています。

Antivirus for Amazon S3の紹介

Antivirus for amazon S3の概要と、その基本的な仕組みを紹介します。

概要

Antivirus for Amazon S3は、アメリカのCloud Storage Security(以下、CSS社)が提供するアンチウイルスソフトです。その特長は、S3に対するウイルススキャンに求められる機能はほぼすべて網羅されていると言って良いくらいの多機能性です。

このソフトはAWS Marketplace上で購入し、自分の所有するAWSアカウント内にインストールして利用します。インストールはCloudFormationで行い、インストール後の設定はAmazon Elastic Container Service(ECS)上で動作する管理画面(後述するConsole)で行うことができ、いずれも非常に容易です。ウイルススキャンもECS上で実行し、スキャン待ちのファイル数に応じてオートスケールします。

ウイルススキャンエンジンは、デフォルトではOSSのエンジン(ClamAV)を使用します。追加料金を支払うことで、商用製品のエンジン(SophosまたはCrowdStrike)の利用や、OSSと商用製品のエンジンの併用が可能です。

このソフトはS3だけでなく、EBS、EFS、FSx、WorkDocsに対するスキャンもサポートしています。しかし、以下では私たちが利用したことのある、S3のスキャンに関する機能のみ解説します。

ConsoleとAgent

Antivirus for Amazon S3の主要機能は、ECS on Fargateで動作します。ECS上で動作するタスク(コンテナ)には、ConsoleとAgentの2種類があります。

Consoleとは、Webブラウザでアクセスできる管理画面のことです。Antivirus for AmazonのインストールはCloudFormationで行いますが、それ以降の設定変更はすべてConsoleを通して行うことができます。Consoleタスクは、常に1個動作します。

以下は、Console Overviewから抜粋した、Consoleへのログイン直後に表示されるDashboard画面の一例です。

ConsoleのDashboard画面の一例

一方、Agentとは、ウイルススキャンを実行するコンテナ(ECSタスク)のことです。Antivirus for Amazon S3には、S3イベント(ファイル追加など)に基づいて動作するEvent Agentと、API経由でウイルススキャンを実行するAPI Agentがあります。Agentタスクは、スキャン待ちのファイル数に応じてオートスケールします。

この記事ではEvent Agentのみを解説します。そのため、以下でAgentと記載した箇所は、すべてEvent Agentのことを指します。

ネットワーク構成

インストール時に、公式ドキュメントのDeployment Detailsに書かれた以下のいずれかのネットワーク構成を選択できます。

  • Standard Deployment
  • Private Deployment
    • Public Load Balancer Option
    • Private Load Balancer Option

Standard Deploymentは、インストールが容易な代わりに、ConsoleやAgentをパブリックサブネットに配置するネットワーク構成です。Consoleの前段にApplication Load Balancer(ALB)を置かず、管理者はCSS社の管理するドメイン名を通してConsoleにアクセスします。開発環境などで、Antivirus for Amazon S3を短期間だけ試したいといった場合に適しています。

Private Deploymentは、自分のAWSアカウント上のRoute 53やALB、NAT Gatewayを用いることで、ConsoleやAgentをプライベートサブネットに配置するネットワーク構成です。アンドパッドでは、さらに、VPN経由でのみALBへのアクセスを許可する構成(Private Load Balancer Option)を採用しています。

以下は、Deployment Detailsから抜粋した、Private Deployment(Private Load Balancer Option)のネットワーク構成図です。

Private Deployment(Private Load Balancer Option)のネットワーク構成図

このようにPrivate Deploymentでは、Consoleへの外部からのアクセスをVPN経由に限定し、Agentへの外部からのアクセスをすべて防ぐことができます。そのため、本番環境ではこのネットワーク構成を推奨します。

スキャンの実行

スキャンの実行の流れを以下に示します。

スキャンの実行の流れ

Antivirus for Amazon S3は、以下のいずれかの方法でS3バケットへのファイルの追加・更新を検出します。いずれの方法を用いるかは、S3バケットごとに設定できます。

  • イベント通知
    • スキャン対象に設定されたS3バケットに対して、すべてのオブジェクト作成イベント(s3:ObjectCreated:*)に対するイベント通知を作成する
    • S3には、1つのイベントは1つのイベント通知リスナーにしか送信できないという制限がある(参考:Conflicted buckets)。そのため、他の目的で作られたイベント通知が存在する場合はコンフリクトが発生し、ファイルの追加・更新を正しく検出できない
    • Antivirus for Amazon S3はこのようなコンフリクトを自動検出し、EventBridgeへの切り替えを促すダイアログを表示する
  • EventBridge
    • スキャン対象に設定されたS3バケットに対して、EventBridgeへの通知を有効化する
    • 前述のコンフリクトを回避できる代わりに、EventBridgeのコストがかかる

いずれかの方法で通知されたイベントは、SNSトピックを経由して、SQSキューに蓄積されます。AgentタスクはこのSQSキューからイベントを取得し、そのファイルのキーをScan ListおよびSkip List(後述)と比較します。そして、スキャン対象と判断すると、そのファイルをS3バケットからダウンロードして、スキャンを実行します。

このAgentタスクは、SQSキュー内に溜まったメッセージ数*1がしきい値(デフォルトは1,000)以上になるとスケールアップし、しきい値未満になるとスケールインします。これにより、追加されたファイルがいつまでもスキャンされない、という状況を防ぐことができます。

また、オートスケールの設定(Agentタスクの最大数、最小数、しきい値)は、その環境で求められる要件に基づいて、ユーザー自身で調整できます。例えば、ファイルのアップロード完了からスキャン完了までにかかる時間を短くしたい場合は、Agentタスク数の最小値を大きくしたり、しきい値を低くしたりします。

価格

Antivirus for Amazon S3の動作に必要なAWSサービス(ECSなど)の利用費に加えて、このソフトのライセンス費がかかります。ライセンス費は、AWSからの毎月の請求書に含まれます。

このソフトの価格体系は、1ヶ月間にスキャンしたファイルの合計サイズ(以下、合計スキャンサイズ)に基づいて決まるという、非常にシンプルなものです。1ヶ月間の合計スキャンサイズ100GBまでは $99/月 の定額で利用でき、100GBを超えた分については $0.80/GB のライセンス費がかかります。また、商用製品のエンジン(SophosまたはCrowdStrike)を利用するためには、$0.10/GBの追加料金が必要です。インストールから最初の30日はトライアル期間として、商用製品のエンジンも含めて、100GBまで無料で利用できます。

このライセンス費は、Antivirus for Amazon S3をセットアップしたECSクラスタごとに請求されます。スキャン対象のS3バケットやリージョンの数には依存しません。また、Antivirus for Amazon S3は複数のAWSアカウント上のS3バケットをスキャンできるのですが、ライセンス費は連携先のAWSアカウント(Linked account)の数にも依存しません。

最新の価格はAWS Marketplace: Antivirus for Amazon S3 - PAYG with 30 DAY FREE TRIALの "Pricing Information" をご参照ください。2024年1月に値上げがあったため、それよりも過去に書かれた記事には古い価格が記載されている可能性がありますので、ご注意ください。

Antivirus for Amazon S3のメリット

以下に、私たちがAntivirus for Amazon S3を本番環境に導入して実感した、主なメリットを示します。

豊富な公式ドキュメント

help.cloudstoragesec.com

Antivirus for Amazon S3の公式ドキュメントは、今回検討したウイルススキャンソフトのなかで最も充実していました。ドキュメント内の検索機能の動作も快適です。そのため、個人的にはこの点を最初のメリットとして推したいです。

事前検討で必要な情報はほぼすべて、この公式ドキュメントから得ることができました。また、開発環境での動作検証中にも、この公式ドキュメントを検索して疑問点を解決できたことが多々ありました。

インストールおよびアップグレードの容易さ

AWS Marketplaceでのsubscribe後にCloudFormationテンプレートが表示され、このテンプレートからスタックを作成するだけでインストールは完了します。ただし、インストール先のネットワーク設定(VPCやサブネットなど)は事前に決めておく必要があります。

また、ConsoleやAgentのアップグレードは、Console上から実行できます。アップグレード可能な場合は、Consoleの画面右上のベルマークに赤いバッジがついており、それをクリックすると以下の図のようなUpgradeボタンが表示されます。このボタンをクリックすると、ConsoleがCloudFormationスタックを更新し、ConsoleとAgentが最新版にアップグレードされます。

ConsoleとAgentにアップグレードがある場合の表示

セキュリティを重視したネットワーク構成

前述の通り、インストール時に、セキュリティを重視したネットワーク構成(Private Deployment)を選択できます。また、インストール時の設定で、Consoleに接続可能な送信元IPアドレスを制限できます*2。これは、顧客のデータに対するウイルススキャンを行いたい私たちにとって重要なポイントでした。

また、Private Mirror機能を利用することで、Agentがシグネチャをダウンロードする先を、インターネット上のデータベースから自分のAWSアカウント内のS3バケットに変更できます。

さらに、VPCエンドポイントを作成することで、NAT Gatewayを通ってインターネットに出るトラフィックを*3減らすことができます(参考:Deployment Details)。これらはセキュリティ向上に加え、通信コスト削減にもなります。

スキャン対象のS3バケットおよびパスの柔軟な設定

どのS3バケットをスキャン対象にするかは、Consoleから簡単に設定できます。

また、S3バケット内のどのパス(プレフィックス)をスキャン対象にするかも、Console上のScan ListおよびSkip Listという機能で簡単に設定できます(参考:Scan and Skip Lists)。Scan Listはスキャン対象とするパスのリスト、Skip Listはスキャン対象から除外するパスのリストのことです。

ただし、1個のS3バケットに対して、Scan ListとSkip Listは併用できないという制限があります。そのため、どちらのリストを使うかを事前に考えたうえで、S3バケット内のパスを設計する必要があります。

アンドパッドでは、過去にbucket-antivirus-functionを修正して、Skip Listと同等の機能を追加していました。そのため、この機能は導入の大きな後押しになりました。

巨大なファイルへの対応

Antivirus for Amazon S3は、ClamAVでスキャンできるファイルのサイズ上限を2GB(2,000,000,000バイト)に制限しています。これは、ClamAV側の推奨値によるものと思われます(参考:ClamAV® blog: ClamAV 1.2.0 release candidate now available)。

Sophosエンジンでは、195GBまでのファイルをスキャン可能です*4。また、Extra Large File Scanningという機能を有効化すると、EC2インスタンスを用いることで、最大5TBのファイルをスキャン可能になります。

Antivirus for Amazon S3の特徴的な機能として、ClamAVとSophosを併用し、2GB以下のファイルはClamAVでスキャンし、2GBを超えるファイルはSophosでスキャンさせることができます。これにより、Sophosにかかるライセンス費($0.10/月)を節約しつつ、巨大なファイルにも対応できます。

スキャン結果のSlackなどへの通知

自分でLambda関数を実装する必要はありますが、スキャン結果をSlackなどのチャットツールに通知できます。これにより、ウイルスを含むファイルのアップロードを短時間で発見し、対応できます。

また、ウイルスの検出以外の条件(例えばスキャンの失敗)でも、メッセージを通知できます。この条件は、Console上で詳しく設定できます(参考:Proactive Notifications)。

感染ファイルの自動削除

Antivirus for Amazon S3では、ウイルスやマルウェアを含む感染ファイル(infected file)を発見した場合の動作を削除(Delete)、他のS3バケットに移動(Quarantine)、タグを付与(Keep)の3種類から選択できます。これは全S3バケットに共通の設定であり、特定のS3バケットだけ動作を変えることはできません。

アンドパッドの場合は、ファイルを削除するだけでなく、データベース上のレコードも削除しなければならないS3バケットがあったため、やむを得ずKeepを設定しました。しかし、DeleteやQuarantineを選択できる状況なら、感染ファイルに関するトイルを大きく削減できます。

その他の便利な機能

他にも以下のような機能を備えています。これらはアンドパッドでは未検証のため、詳しい説明は割愛します。

Antivirus for Amazon S3のデメリット

Antivirus for Amazon S3にはいくつかデメリットもありますが、これらは対処可能なものと考えています。以下に、アンドパッドでの対処方法も含めて示します。

ライセンス費の急増のリスク

Antivirus for Amazon S3のライセンス費は、このソフトの動作に必要なAWSリソースの利用費より高額です。スキャンされるファイル数やファイルサイズの急増により、このライセンス費が気付かないうちに急増する可能性があります。これは導入を進める際に社内でも指摘された、大きなリスクの1つでした。

このリスクに対処するため、アンドパッドでは、合計スキャンサイズの急増に気づくためのアラートを設定しました。Antivirus for Amazon S3は、1日単位で、各S3バケットの合計スキャンサイズを表示する機能を持っています。そこで、この表示の元となるデータをDynamoDBテーブルから取得し、CloudWatchのカスタムメトリクスとして出力するLambda関数を実装しました。これにより、合計スキャンサイズに対してアラートを設定できるようになりました。

また、アンドパッドでは、上記のアラートが発生した場合の対応手順を整備しました。アラートが発生した場合、その急増したファイルに対するスキャンが実際に必要なものかを調査し、必要なものであればライセンス費の見積もりを見直します。そうでなければスキャン対象のS3バケットやパスを見直します。

自動的に作成されるAWSリソースの多さ

Antivirus for Amazon S3の多機能さの裏返しではありますが、CloudFormationおよびConsoleによって自動的に作成されるAWSリソースが多数あります。有効化していない機能に関するリソースの一部も、今後その機能を有効化した場合のために作成されます。このようにリソースが多いため、動作の理解が難しいというデメリットがあります。

アンチウイルスソフトはファイルを扱う重要なシステムのため、動作を理解できないことには、安心して導入できません。また、作成されるリソースを把握していないと、気づかないうちに特定のAWSリソースの利用費が上がっていて驚く、ということもありえます。そのため、このソフトが作成するAWSリソースを事前に詳しく調べておくことを推奨します。

CloudFormationによって作成されるAWSリソースの一覧は、AWSマネジメントコンソール上で確認できます。しかし、この一覧には詳しい説明が表示されないため、私の場合はRelease NotesからダウンロードできるCloudFormationテンプレートを精読しました。このページには過去のバージョンのテンプレートも置かれており、アップグレード時の差分確認に役立ちました。

また、Antivirus for Amazon S3は、CloudFormationおよびConsoleによって作成されたリソースに独自のタグを設定する機能を持っています(参考:System Tags)。アンドパッドではこの機能を使ってAWSのコスト配分タグを設定し、そのタグに対するAWS Budgetsの請求アラームを作成しています。

日本語のドキュメントやサポートの不足

Antivirus for Amazon S3には日本向けの営業や国内代理店はありません。ドキュメントは英語版しかなく、サポートとのやり取り(メールまたは通話)も英語のみです。また、現時点では、日本語で書かれた解説記事もほとんどありません。

しかし、英語のドキュメントが充実していたことに加えて、Consoleが非常に使いやすかったため、日本語のドキュメントがなくてもアンドパッドではほとんど問題になりませんでした。どうしてもドキュメントでは解決できない問題もありましたが、その際はCSS社のサポートが親切に対応してくれて解決できました。

Antivirus for Amazon S3が適した状況

私たちが考える、Antivirus for Amazon S3が適した状況を以下に示します。

オートスケールが必要な場合

ユーザーからアップロードされるファイルをスキャンするような場合は、ユーザーの利用時間帯に応じて、単位時間あたりにアップロードされるファイル数やファイルサイズも増減します。

このような場合に、ファイルのアップロード完了からスキャン完了までにかかる時間を短縮するためには、スキャンの同時実行数のオートスケールが必要です。LambdaやECSはこのようなオートスケールが可能です。

ECSを用いる方法は、Lambdaを用いる方法よりデプロイが複雑になるというデメリットがあります。しかし、Antivirus for Amazon S3は、前述のようにインストールおよびアップグレードが容易であり、このデメリットを解決しています。

スキャン対象のファイル数および合計スキャンサイズが大きい場合

スキャン対象のファイル数やファイルサイズの増加によってスキャンの実行時間が長くなると、LambdaよりもECSのほうがコスト面で有利になります。

しかし、1ヶ月あたりの合計スキャンサイズが小さい場合は、Antivirus for Amazon S3のライセンス費を考慮すると、Lambdaでスキャンする方法のほうが安くなる可能性もあります。そのため、事前の見積もりが重要です。

アンドパッドでは、これまでLambdaでスキャンする方法を採用していたため、1ヶ月あたりの合計スキャンサイズとLambdaのコストを事前に比較できました。このデータに加えて、開発環境でAntivirus for Amazon S3のAWSリソース利用費を調べることで、このソフトの導入によるコスト削減効果を事前に見積もりました。

スキャン対象の変更が起こり得る場合

ウイルススキャンを考慮せずに設計されてある程度育ったサービスの場合、1個のS3バケット内にスキャンが必要なファイルとそうでないファイルが混在しているかもしれません。スキャンが必要ないファイルに対してスキャンを実行すると、その分だけ余計にAWSリソース利用費やアンチウイルスソフトのライセンス費がかかります。

Antivirus for Amazon S3には前述のScan ListおよびSkip Listという機能があり、Console上で簡単にスキャン対象のパスを絞ることができます。S3バケット内にスキャンが必要なファイルとそうでないファイルが混在していても、この機能を用いて柔軟に対応できます。

また、今後サービスの開発が進むにつれて、S3バケットが複数のリージョンや複数のAWSアカウントに作られるかもしれません。

Antivirus for Amazon S3はこのような場合の拡張性も備えており、1個のECSクラスタ上で動作するConsoleから、複数のリージョンや複数のAWSアカウントにあるS3バケットを管理できます。

まとめ

この記事では、AWSのS3バケット上のファイルをスキャンできるアンチウイルスソフト Antivirus for Amazon S3 をご紹介しました。また、私たちが本番環境に導入した経験から、その具体的なメリットやデメリット、そしてこの記事で挙げたデメリットへの対応方法をご説明しました。

Antivirus for Amazon S3は、特にいまLambdaでウイルススキャンを実行していて、Lambdaの実行コストが高いと感じている方に強くおすすめしたいソフトです。この記事がその検討や導入の参考になれば幸いです。

アンドパッドでは、「幸せを築く人を、幸せに。」というミッションの実現のため、一緒に働く仲間を大募集しています。このような改善活動を進めているSREチームにご興味がありましたら、以下のページからご応募ください。カジュアル面談も実施しています。

engineer.andpad.co.jp

参考:Antivirus for Amazon S3に関するブログ記事

*1:具体的には、CloudWatchのApproximateNumberOfMessagesVisibleメトリクスとApproximateNumberOfMessagesNotVisibleメトリクスの和。

*2:ただし、インストール時の設定ではこの送信元IPアドレスを1個しか指定できないという制限があります。複数のIPアドレスを許可したい場合は、インストール後にセキュリティグループのインバウンドルールの追加が必要です。

*3:残念ながら、インターネットに出るトラフィックを完全になくすことはできません。VPCエンドポイントに対応していない一部のサービス(AWS Marketplaceなど)のために、NAT Gatewayは引き続き必要です。

*4:Sophosエンジンでスキャンできるのは、Fargateのエフェメラルストレージのサイズ-5GBまでです。15GBを超えるファイルをスキャンしたい場合は、Fargateのエフェメラルストレージ(デフォルトは20GB)の増量が必要で、これはECSのコスト全体に影響します。そのため、スキャン対象のファイルには、可能なら15GB以下のサイズ上限を設定すべきです。