S3バケットは多くの組織で重要なデータを保管するオブジェクトストレージですが、意図しないマルウェアのアップロードは大きなリスクとなり得ます。
AWSのGuardDuty Malware Protection for S3を有効にすることで、アップロードされたオブジェクトのマルウェアスキャンを自動化し、セキュリティを大幅に強化できます。
本記事では、S3バケットにGuardDuty Malware Protectionを設定し、EventBridge、SNSを組み合わせてスキャン結果を即座にSlackチャンネルに通知する仕組みを構築する手順を解説します。
アーキテクチャ

構築
1. GuardDuty Malware Protection for S3の有効化
まずは、対象のS3バケットでマルウェア保護を有効にします。

この設定により、指定されたバケットに新しいオブジェクトがアップロードされると、自動的にGuardDutyによるマルウェアスキャンが開始されます。
2. SNSトピックとサブスクリプションの作成
スキャン結果の通知先となるSNSトピックを作成し、Eメール通知(Slackチャンネルメールアドレス)を設定します。



3. EventBridge用IAMロールの作成
EventBridgeがSNSトピックへメッセージを発行するために必要なIAMロールを作成します。


これにより、EventBridgeが指定したSNSトピックに対してのみ、安全に通知を送信できるようになります。
4. EventBridgeルールの設定
GuardDutyのスキャン結果イベントをトリガーに、SNSへ通知するためのEventBridgeルールを作成します。これが今回の設定の肝です。
4.1. 基本設定

4.2. イベントパターン
GuardDutyが発行するマルウェアスキャン結果イベントを捕捉します。特に、マルウェア検出時やスキャン失敗時など、アクションが必要なステータスのみをフィルタリングします。

4.3. ターゲット設定
検出したEventの送信先ターゲットにSNSトピックを選択します。

4.4. インプットトランスフォーマーの設定
通知メールの可読性を上げるため、イベントのJSONデータから必要な情報だけを抽出・整形します。
入力パス
{ "account_id": "$.account", "event_time": "$.time", "region": "$.region", "resource_type": "$.detail.resourceType", "s3_bucket_name": "$.detail.s3ObjectDetails.bucketName", "s3_etag": "$.detail.s3ObjectDetails.eTag", "s3_object_key": "$.detail.s3ObjectDetails.objectKey", "scan_result_status": "$.detail.scanResultDetails.scanResultStatus", "scan_status": "$.detail.scanStatus", "threat_name": "$.detail.scanResultDetails.threats[0].name"}入力テンプレート
メール本文を生成します。パスで定義した変数を<変数名>形式で埋め込みます。
"ご担当者様"
"マルウェアスキャン結果をご報告いたします。"
"・イベント時刻: "
"・アカウントID: "
"・リージョン: "
"・S3バケット: "
"・オブジェクトキー: "
"・リソースタイプ: "
"・脅威名: "
"・スキャン結果ステータス: "
"・スキャンステータス: "
"以上、よろしくお願いいたします。"

4.5. タグの設定

4.6. ルールの作成

5. 検知テストの実施
設定が正しく機能するか、業界標準のマルウェアテストファイルを使用して検証します。
- CloudShellまたはローカル環境でテストファイルを作成します。
eicar.com.txtというファイル名で以下の内容を保存します。これはマルウェアではなく、アンチウイルスソフトが「マルウェア」として検知するように設計された安全なテキストファイルです。X5O!P%@AP[4PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* - S3バケットへファイルをアップロード 作成した
eicar.com.txtを、マルウェア保護を有効にしたS3バケットにアップロードします。 - アラートメールの確認 アップロード後、しばらくするとGuardDutyがファイルをスキャンし、EventBridgeがSNSを介して通知メールを送信します。 Slackチャンネルを確認すると、以下のような内容のアラートメールが届いているはずです。

これで、S3バケットへのマルウェアアップロードに対する自動検知と即時通知の仕組みが完成しました!🎉
まとめ
GuardDuty Malware Protection for S3は、S3オブジェクトレベルでのセキュリティを劇的に向上させる強力な機能です。
今回はGuardDuty、EventBridge、SNSというAWSのマネージドサービスを連携させることで、
コードを書くことなく高度なセキュリティ監視システムを構築できました。
この設定を応用すれば、通知をLambda関数に送って隔離や削除などの自動対処を行うことも可能です。
また、S3バケットポリシーでタグベースのアクセスコントロール(TBAC)を設定することも可能です。
皆さんのS3バケットのセキュリティ対策の参考にいただければと思います。