セキュリティこんにちは。SREチームの吉澤です。本番環境に導入しました。その結果、私たちの要件はほぼ全て満たされたうえに、従来比で大幅なコスト削減を実現できました。S3について日本語で書かれた記事はまだ少ないですが、S3に対するウイルススキャンが求められるケースでは、導入を検討する価値があるソフトです。S3の概要、私たちが本番環境に導入してみてわかったメリットやデメリット、そしてこのソフトが適した状況をご紹介します。背景S3に対するウイルススキャンが必要な理由アンドパッドは、ご利用いただいている企業のユーザーからアップロードされたファイルに対して、ウイルススキャンを実行しています。マルウェア(ウイルスを含む悪意があるファイル全般)である可能性が高いと判断した場合は、ファイルを削除したうえで、アップロードした方に連絡しています。このように対応している理由は、あるユーザーが意図せずにマルウェアを含むファイルをアップロードしてしまった場合に、他のユーザーがそのファイルをダウンロードし、マルウェアを実行してしまうことを防ぐためです。S3のバケット(以下、S3バケット)上に保存しています。そのため、S3バケットへのファイル追加を契機として、ウイルススキャンを実行しています。2.0で公開されているオープンソースソフトウェア(OSS)のbucket-antivirus-functionに対して、アンドパッドでの要件に基づく修正を加えて使っていました。このソフトは、Lambda関数で、ClamAVというOSSのウイルススキャンエンジンを実行します。このソフトを導入した当初は問題なかったのですが、年月の経過に伴って、以下の2点が問題になり始めました。S3がアンドパッドの要件に最も適していました。そこで開発環境で十分な動作検証および性能テストを実施したのち、2024年1月から本番環境に導入しました。S3へのリプレースが完了しています。S3の概要と、その基本的な仕組みを紹介します。Security(以下、CSS社)が提供するアンチウイルスソフトです。その特長は、S3に対するウイルススキャンに求められる機能はほぼすべて網羅されていると言って良いくらいの多機能性です。Marketplace上で購入し、自分の所有するAWSアカウント内にインストールして利用します。Service(ECS)上で動作する管理画面(後述するConsole)で行うことができ、いずれも非常に容易です。ウイルススキャンもECS上で実行し、スキャン待ちのファイル数に応じてオートスケールします。ウイルススキャンエンジンは、デフォルトではOSSのエンジン(ClamAV)を使用します。追加料金を支払うことで、商用製品のエンジン(SophosまたはCrowdStrike)の利用や、OSSと商用製品のエンジンの併用が可能です。このソフトはS3だけでなく、EBS、EFS、FSx、WorkDocsに対するスキャンもサポートしています。以下では私たちが利用したことのある、S3のスキャンに関する機能のみ解説します。Fargateで動作します。ECS上で動作するタスク(コンテナ)には、ConsoleとAgentの2種類があります。Consoleとは、Webブラウザでアクセスできる管理画面のことです。AmazonのインストールはCloudFormationで行いますが、それ以降の設定変更はすべてConsoleを通して行うことができます。Consoleタスクは、常に1個動作します。Overviewから抜粋した、Consoleへのログイン直後に表示されるDashboard画面の一例です。Agentとは、ウイルススキャンを実行するコンテナ(ECSタスク)のことです。Agentがあります。Agentタスクは、スキャン待ちのファイル数に応じてオートスケールします。Agentのみを解説します。Agentのことを指します。Detailsに書かれた以下のいずれかのネットワーク構成を選択できます。Deploymentは、インストールが容易な代わりに、ConsoleやAgentをパブリックサブネットに配置するネットワーク構成です。Balancer(ALB)を置かず、管理者はCSS社の管理するドメイン名を通してConsoleにアクセスします。S3を短期間だけ試したいといった場合に適しています。Gatewayを用いることで、ConsoleやAgentをプライベートサブネットに配置するネットワーク構成です。Option)を採用しています。Option)のネットワーク構成図です。Deploymentでは、Consoleへの外部からのアクセスをVPN経由に限定し、Agentへの外部からのアクセスをすべて防ぐことができます。そのため、本番環境ではこのネットワーク構成を推奨します。スキャンの実行スキャンの実行の流れを以下に示します。S3は、以下のいずれかの方法でS3バケットへのファイルの追加・更新を検出します。いずれの方法を用いるかは、S3バケットごとに設定できます。S3はこのようなコンフリクトを自動検出し、EventBridgeへの切り替えを促すダイアログを表示するEventBridgeスキャン対象に設定されたS3バケットに対して、EventBridgeへの通知を有効化する前述のコンフリクトを回避できる代わりに、EventBridgeのコストがかかるいずれかの方法で通知されたイベントは、SNSトピックを経由して、SQSキューに蓄積されます。List(後述)と比較します。スキャン対象と判断すると、そのファイルをS3バケットからダウンロードして、スキャンを実行します。このAgentタスクは、SQSキュー内に溜まったメッセージ数*1がしきい値(デフォルトは1,000)以上になるとスケールアップし、しきい値未満になるとスケールインします。これにより、追加されたファイルがいつまでもスキャンされない、という状況を防ぐことができます。オートスケールの設定(Agentタスクの最大数、最小数、しきい値)は、その環境で求められる要件に基づいて、ユーザー自身で調整できます。ファイルのアップロード完了からスキャン完了までにかかる時間を短くしたい場合は、Agentタスク数の最小値を大きくしたり、しきい値を低くしたりします。S3の動作に必要なAWSサービス(ECSなど)の利用費に加えて、このソフトのライセンス費がかかります。ライセンス費は、AWSからの毎月の請求書に含まれます。このソフトの価格体系は、1ヶ月間にスキャンしたファイルの合計サイズ(以下、合計スキャンサイズ)に基づいて決まるという、非常にシンプルなものです。ライセンス費がかかります。商用製品のエンジン(SophosまたはCrowdStrike)を利用するためには、$0.10/GBの追加料金が必要です。インストールから最初の30日はトライアル期間として、商用製品のエンジンも含めて、100GBまで無料で利用できます。S3をセットアップしたECSクラスタごとに請求されます。スキャン対象のS3バケットやリージョンの数には依存しません。account)の数にも依存しません。2024年1月に値上げがあったため、それよりも過去に書かれた記事には古い価格が記載されている可能性がありますので、ご注意ください。S3を本番環境に導入して実感した、主なメリットを示します。S3の公式ドキュメントは、今回検討したウイルススキャンソフトのなかで最も充実していました。ドキュメント内の検索機能の動作も快適です。そのため、個人的にはこの点を最初のメリットとして推したいです。事前検討で必要な情報はほぼすべて、この公式ドキュメントから得ることができました。開発環境での動作検証中にも、この公式ドキュメントを検索して疑問点を解決できたことが多々ありました。Marketplaceでのsubscribe後にCloudFormationテンプレートが表示され、このテンプレートからスタックを作成するだけでインストールは完了します。インストール先のネットワーク設定(VPCやサブネットなど)は事前に決めておく必要があります。ConsoleやAgentのアップグレードは、Console上から実行できます。アップグレード可能な場合は、Consoleの画面右上のベルマークに赤いバッジがついており、それをクリックすると以下の図のようなUpgradeボタンが表示されます。このボタンをクリックすると、ConsoleがCloudFormationスタックを更新し、ConsoleとAgentが最新版にアップグレードされます。Deployment)を選択できます。インストール時の設定で、Consoleに接続可能な送信元IPアドレスを制限できます*2。これは、顧客のデータに対するウイルススキャンを行いたい私たちにとって重要なポイントでした。Mirror機能を利用することで、Agentがシグネチャをダウンロードする先を、インターネット上のデータベースから自分のAWSアカウント内のS3バケットに変更できます。これらはセキュリティ向上に加え、通信コスト削減にもなります。スキャン対象のS3バケットおよびパスの柔軟な設定どのS3バケットをスキャン対象にするかは、Consoleから簡単に設定できます。Listはスキャン対象から除外するパスのリストのことです。Listは併用できないという制限があります。そのため、どちらのリストを使うかを事前に考えたうえで、S3バケット内のパスを設計する必要があります。Listと同等の機能を追加していました。そのため、この機能は導入の大きな後押しになりました。S3は、ClamAVでスキャンできるファイルのサイズ上限を2GB(2,000,000,000バイト)に制限しています。available)。Sophosエンジンでは、195GBまでのファイルをスキャン可能です*4。Scanningという機能を有効化すると、EC2インスタンスを用いることで、最大5TBのファイルをスキャン可能になります。S3の特徴的な機能として、ClamAVとSophosを併用し、2GB以下のファイルはClamAVでスキャンし、2GBを超えるファイルはSophosでスキャンさせることができます。これにより、Sophosにかかるライセンス費($0.10/月)を節約しつつ、巨大なファイルにも対応できます。自分でLambda関数を実装する必要はありますが、スキャン結果をSlackなどのチャットツールに通知できます。これにより、ウイルスを含むファイルのアップロードを短時間で発見し、対応できます。ウイルスの検出以外の条件(例えばスキャンの失敗)でも、メッセージを通知できます。Notifications)。file)を発見した場合の動作を削除(Delete)、他のS3バケットに移動(Quarantine)、タグを付与(Keep)の3種類から選択できます。これは全S3バケットに共通の設定であり、特定のS3バケットだけ動作を変えることはできません。アンドパッドの場合は、ファイルを削除するだけでなく、データベース上のレコードも削除しなければならないS3バケットがあったため、やむを得ずKeepを設定しました。DeleteやQuarantineを選択できる状況なら、感染ファイルに関するトイルを大きく削減できます。他にも以下のような機能を備えています。これらはアンドパッドでは未検証のため、詳しい説明は割愛します。S3にはいくつかデメリットもありますが、これらは対処可能なものと考えています。以下に、アンドパッドでの対処方法も含めて示します。S3のライセンス費は、このソフトの動作に必要なAWSリソースの利用費より高額です。スキャンされるファイル数やファイルサイズの急増により、このライセンス費が気付かないうちに急増する可能性があります。これは導入を進める際に社内でも指摘された、大きなリスクの1つでした。このリスクに対処するため、アンドパッドでは、合計スキャンサイズの急増に気づくためのアラートを設定しました。S3は、1日単位で、各S3バケットの合計スキャンサイズを表示する機能を持っています。そこで、この表示の元となるデータをDynamoDBテーブルから取得し、CloudWatchのカスタムメトリクスとして出力するLambda関数を実装しました。これにより、合計スキャンサイズに対してアラートを設定できるようになりました。アンドパッドでは、上記のアラートが発生した場合の対応手順を整備しました。アラートが発生した場合、その急増したファイルに対するスキャンが実際に必要なものかを調査し、必要なものであればライセンス費の見積もりを見直します。なければスキャン対象のS3バケットやパスを見直します。S3の多機能さの裏返しではありますが、CloudFormationおよびConsoleによって自動的に作成されるAWSリソースが多数あります。有効化していない機能に関するリソースの一部も、今後その機能を有効化した場合のために作成されます。このようにリソースが多いため、動作の理解が難しいというデメリットがあります。アンチウイルスソフトはファイルを扱う重要なシステムのため、動作を理解できないことには、安心して導入できません。作成されるリソースを把握していないと、気づかないうちに特定のAWSリソースの利用費が上がっていて驚く、ということもありえます。そのため、このソフトが作成するAWSリソースを事前に詳しく調べておくことを推奨します。CloudFormationによって作成されるAWSリソースの一覧は、AWSマネジメントコンソール上で確認できます。NotesからダウンロードできるCloudFormationテンプレートを精読しました。このページには過去のバージョンのテンプレートも置かれており、アップグレード時の差分確認に役立ちました。Budgetsの請求アラームを作成しています。S3には日本向けの営業や国内代理店はありません。ドキュメントは英語版しかなく、サポートとのやり取り(メールまたは通話)も英語のみです。現時点では、日本語で書かれた解説記事もほとんどありません。英語のドキュメントが充実していたことに加えて、Consoleが非常に使いやすかったため、日本語のドキュメントがなくてもアンドパッドではほとんど問題になりませんでした。してもドキュメントでは解決できない問題もありましたが、その際はCSS社のサポートが親切に対応してくれて解決できました。S3が適した状況を以下に示します。オートスケールが必要な場合ユーザーからアップロードされるファイルをスキャンするような場合は、ユーザーの利用時間帯に応じて、単位時間あたりにアップロードされるファイル数やファイルサイズも増減します。このような場合に、ファイルのアップロード完了からスキャン完了までにかかる時間を短縮するためには、スキャンの同時実行数のオートスケールが必要です。LambdaやECSはこのようなオートスケールが可能です。ECSを用いる方法は、Lambdaを用いる方法よりデプロイが複雑になるというデメリットがあります。S3は、前述のようにインストールおよびアップグレードが容易であり、このデメリットを解決しています。スキャン対象のファイル数および合計スキャンサイズが大きい場合スキャン対象のファイル数やファイルサイズの増加によってスキャンの実行時間が長くなると、LambdaよりもECSのほうがコスト面で有利になります。S3のライセンス費を考慮すると、Lambdaでスキャンする方法のほうが安くなる可能性もあります。そのため、事前の見積もりが重要です。アンドパッドでは、これまでLambdaでスキャンする方法を採用していたため、1ヶ月あたりの合計スキャンサイズとLambdaのコストを事前に比較できました。S3のAWSリソース利用費を調べることで、このソフトの導入によるコスト削減効果を事前に見積もりました。スキャン対象の変更が起こり得る場合ウイルススキャンを考慮せずに設計されてある程度育ったサービスの場合、1個のS3バケット内にスキャンが必要なファイルとそうでないファイルが混在しているかもしれません。スキャンが必要ないファイルに対してスキャンを実行すると、その分だけ余計にAWSリソース利用費やアンチウイルスソフトのライセンス費がかかります。Listという機能があり、Console上で簡単にスキャン対象のパスを絞ることができます。S3バケット内にスキャンが必要なファイルとそうでないファイルが混在していても、この機能を用いて柔軟に対応できます。今後サービスの開発が進むにつれて、S3バケットが複数のリージョンや複数のAWSアカウントに作られるかもしれません。S3はこのような場合の拡張性も備えており、1個のECSクラスタ上で動作するConsoleから、複数のリージョンや複数のAWSアカウントにあるS3バケットを管理できます。私たちが本番環境に導入した経験から、その具体的なメリットやデメリット、そしてこの記事で挙げたデメリットへの対応方法をご説明しました。S3は、特にいまLambdaでウイルススキャンを実行していて、Lambdaの実行コストが高いと感じている方に強くおすすめしたいソフトです。この記事がその検討や導入の参考になれば幸いです。アンドパッドでは、「幸せを築く人を、幸せに。」というミッションの実現のため、一緒に働く仲間を大募集しています。このような改善活動を進めているSREチームにご興味がありましたら、以下のページからご応募ください。カジュアル面談も実施しています。S3と連携させる(iret.media)*1:具体的には、CloudWatchのApproximateNumberOfMessagesVisibleメトリクスとApproximateNumberOfMessagesNotVisibleメトリクスの和。*2:ただし、インストール時の設定ではこの送信元IPアドレスを1個しか指定できないという制限があります。複数のIPアドレスを許可したい場合は、インストール後にセキュリティグループのインバウンドルールの追加が必要です。*3:残念ながら、インターネットに出るトラフィックを完全になくすことはできません。Gatewayは引き続き必要です。*4:Sophosエンジンでスキャンできるのは、Fargateのエフェメラルストレージのサイズ-5GBまでです。15GBを超えるファイルをスキャンしたい場合は、Fargateのエフェメラルストレージ(デフォルトは20GB)の増量が必要で、これはECSのコスト全体に影響します。そのため、スキャン対象のファイルには、可能なら15GB以下のサイズ上限を設定すべきです。こんにちは、SWEのあかりです。Hubコントロールの有効無効をコード管理するのは予想のN倍大変だった話こんにちは。SREチームの吉澤です。こんにちは、SWEのあかりです。