GuardDuty Malware Protection for S3を試してみた

# 背景・目的
先日、AWS re:Inforce 2024 や、[Amazon GuardDuty を使用した Amazon S3 に新しいオブジェクトをアップロードする際にマルウェアを検出](https://aws.amazon.com/jp/about-aws/whats-new/2024/06/detect-malware-object-uploads-amazon-s3-guardduty/)で、S3のマルウェア検知が発表されました。


# まとめ
下記に特徴を整理します。

|特徴|説明
|:--|:--|
|概要|S3のマルウェア保護は、S3バケットに新しくアップロードされたオブジェクトをスキャンすることで、マルウェアの潜在的な存在を検出する<BR><BR>S3オブジェクトがアップロードされると、GuardDutyは自動的にマルウェアスキャンを開始する<BR><BR>GuardDutyを有効にしなくても利用できる|
|対象|自分のAWSアカウントに属するS3バケットに対して、有効にできる<BR><BR>バケット全体に有効にできる。または、オブジェクトプレフィックスを指定できる<BR>・プレフィックスは最大5妻で指定できる|
|PassRole権限|IAM PassRoleを使用して、GuardDutyがユーザに代わりマルウェアスキャンアクションを実行できる|
|タグ付け|マルウェア防御を有効にするとき、スキャンされたS3オブジェクトのタグ付けを有効にするオプション手順がある<BR><BR>最初にタグ付けを有効にする。後で変更した場合は、GuardDutyはスキャンされたオブジェクトにタグ付けできない|
|主な動作|S3のマルウェア防御を有効にすると、S3バケット専用のマルウェア防御プランリソースが作成される<BR><BR>このリソースは、保護されたリソースの一意の識別子であるマルウェア防御プランIDに関連付けられる<BR><BR>GuardDutyはIAM権限の一つを使用して、EventBrdigeマネージドルールを作成する|
|GuadDutyを有効にした場合|セキュリティ検出結果が表示される。<BR><BR>GuardDuty は、生成された検出結果を修正するための手順を推奨する|
|料金|スキャン費用<BR>S3オブジェクトタグ付けコスト<BR>S3APIのGet、Putコスト|


# 概要
[GuardDuty Malware Protection for S3](https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/gdu-malware-protection-s3.html)を基に整理します

> S3 のマルウェア保護は、選択した Amazon Simple Storage Service (Amazon S3) バケットに新しくアップロードされたオブジェクトをスキャンすることで、マルウェアの潜在的な存在を検出するのに役立ちます。選択したバケットに S3 オブジェクトまたは既存の S3 オブジェクトの新しいバージョンがアップロードされると、GuardDuty は自動的にマルウェア スキャンを開始します。

- S3のマルウェア保護は、S3バケットに新しくアップロードされたオブジェクトをスキャンすることで、マルウェアの潜在的な存在を検出する
- S3オブジェクトがアップロードされると、GuardDutyは自動的にマルウェアスキャンを開始する

> S3 のマルウェア対策を有効にする 2 つのアプローチ
AWS アカウントで GuardDuty サービスが有効になっており、全体的な GuardDuty エクスペリエンスの一部として Malware Protection for S3 を使用する場合、または GuardDuty サービスを有効にせずに Malware Protection for S3 機能を単独で使用する場合、Malware Protection for S3 を有効にできます。Malware Protection for S3 を単独で有効にする場合、GuardDuty のドキュメントでは、Malware Protection for S3 を独立した機能として使用することを指します。


- GuardDutyを有効にしなくても利用できる

> S3 のマルウェア対策を単独で使用する場合の考慮事項
> - GuardDuty セキュリティ検出結果 – 検出器 ID は、リージョン内のアカウントに関連付けられた一意の識別子です。アカウント内の 1 つ以上のリージョンで GuardDuty を有効にすると、GuardDuty を有効にした各リージョンでこのアカウントの検出器 ID が自動的に作成されます。詳細については、概念と用語のドキュメント の検出器を参照してください。
アカウントで S3 のマルウェア防御を個別に有効にすると、そのアカウントには関連付けられた検出 ID がありません。これは、利用できる GuardDuty 機能に影響します。たとえば、S3 マルウェアスキャンでマルウェアの存在が検出されても、GuardDuty のすべての検出結果は検出 ID に関連付けられているため、AWS アカウントで GuardDuty の検出結果は生成されません。

> - スキャンされたオブジェクトが悪意のあるものであるかどうかを確認する – デフォルトでは、GuardDuty はマルウェアスキャンの結果をデフォルトの Amazon EventBridge イベントバスと Amazon CloudWatch 名前空間に公開します。バケットの S3 用マルウェア防御を有効にするときにタグ付けを有効にすると、スキャンされた S3 オブジェクトにスキャン結果を示すタグが付けられます。タグ付けの詳細については、「スキャン結果に基づくオブジェクトのオプションのタグ付け」を参照してください。

## How does Malware Protection for S3 work?
### 概要
> 自分の AWS アカウントに属する Amazon S3 バケットに対して、S3 のマルウェア防御を有効にすることができます。GuardDuty では、この機能をバケット全体に対して有効にすることも、マルウェアスキャンの範囲を特定の オブジェクトプレフィックスに制限して、選択したプレフィックスのいずれかで始まるアップロードされた各オブジェクトを GuardDuty がスキャンするようにすることもできます。プレフィックスは最大 5 つ追加できます。S3 バケットに対してこの機能を有効にすると、そのバケットは保護されたバケットと呼ばれます。

- 自分のAWSアカウントに属するS3バケットに対して、有効にできる
- バケット全体に有効にできる。または、オブジェクトプレフィックスを指定できる
    - プレフィックスは、最大5つまで指定できる

### IAM PassRole 権限
> S3 のマルウェア保護では、IAM PassRole を使用して、GuardDuty がユーザーに代わってマルウェア スキャン アクションを実行できるようにします。これらのアクションには、選択したバケットに新しくアップロードされたオブジェクトの通知、それらのオブジェクトのスキャン、オプションでスキャンされたオブジェクトへのタグの追加が含まれます。これは、この機能を使用して S3 バケットを構成するための前提条件です。
> 既存の IAM ロールを更新するか、この目的のために新しいロールを作成するかを選択できます。複数のバケットに対して S3 のマルウェア防御を有効にする場合は、必要に応じて、既存の IAM ロールを更新して他のバケット名を含めることができます。詳細については、「 前提条件 - IAM PassRole ポリシーの作成または更新」を参照してください。


- IAM PassRoleを使用して、GuardDutyがユーザに代わりマルウェアスキャンアクションを実行できる

### スキャン結果に基づくオブジェクトのオプションのタグ付け
> バケットの S3 のマルウェア防御を有効にするときに、スキャンされた S3 オブジェクトのタグ付けを有効にするオプションの手順があります。IAM PassRole には、スキャン後にオブジェクトにタグを追加する権限がすでに含まれています。ただし、GuardDuty は、セットアップ時にこのオプションを有効にした場合にのみタグを追加します。
オブジェクトをアップロードする前に、このオプションを有効にする必要があります。スキャンが終了すると、GuardDuty はスキャンされた S3 オブジェクトに次のキー:値のペアを持つ定義済みタグを追加します。

> GuardDutyMalwareScanStatus:Potential scan result

> スキャン結果のタグ値として考えられるのはNO_THREATS_FOUND、、、、、THREATS_FOUNDです。これらの値の詳細については、「 UNSUPPORTEDタグ ベースのアクセス制御 (TBAC) の使用」を参照してください。ACCESS_DENIEDFAILED

> タグ付けを有効にすることは、S3 オブジェクトのスキャン結果を知る方法の 1 つです。さらに、これらのタグを使用して、タグベースのアクセス制御 (TBAC) S3 リソース ポリシーを追加し、潜在的に悪意のあるオブジェクトに対してアクションを実行できます。詳細については、「S3 バケット リソースへの TBAC の追加」を参照してください。

> バケットの Malware Protection for S3 を設定するときにタグ付けを有効にすることをお勧めします。オブジェクトがアップロードされ、スキャンが開始される可能性がある後にタグ付けを有効にすると、GuardDuty はスキャンされたオブジェクトにタグを追加できなくなります。関連する S3 オブジェクトのタグ付けコストの詳細については、「 Malware Protection for S3 の料金」を参照してください。


- マルウェア防御を有効にするとき、スキャンされたS3オブジェクトのタグ付けを有効にするオプション手順がある
- 最初にタグ付けを有効にする。後で変更した場合は、GuardDutyはスキャンされたオブジェクトにタグ付けできない

### バケットのS3のマルウェア対策を有効にした後
> S3 のマルウェア防御を有効にすると、選択した S3 バケット専用のマルウェア防御プラン リソースが作成されます。このリソースは、保護されたリソースの一意の識別子であるマルウェア防御プラン ID に関連付けられます。GuardDuty は、IAM 権限の 1 つを使用して、 という名前の EventBridge マネージド ルールを作成し、管理しますDO-NOT-DELETE-AmazonGuardDutyMalwareProtectionS3*。

- S3のマルウェア防御を有効にすると、S3バケット専用のマルウェア防御プランリソースが作成される
- このリソースは、保護されたリソースの一意の識別子であるマルウェア防御プランIDに関連付けられる
- GuardDutyはIAM権限の一つを使用して、EventBrdigeマネージドルールを作成する

> S3 のマルウェア対策は、Amazon EventBridge 通知をリッスンします。選択したバケットまたはプレフィックスの 1 つにオブジェクトがアップロードされると、GuardDuty は AWS PrivateLinkを使用してそのオブジェクトをダウンロードし、同じリージョン内の隔離された環境で読み取り、復号化、スキャンを行います。スキャン中、GuardDuty はダウンロードした S3 オブジェクトをスキャン環境内に一時的に保存します。マルウェアスキャンが完了すると、GuardDuty はオブジェクトのダウンロードされたコピーを削除します。

- S3のマルウェア防御は、EventBridge通知を リッスンする
- オブジェクト（選択したバケット、プレフィックの1つ）がアップロードされると、GuardDutyは PrivateLinkにより、そのオブジェクトをダウンロードし、同じリージョン内の隔離された環境で読み取り、復号化、スキャンする
- スキャン中、GuardDutyはダウンロードしたS3をスキャン内で一時的に保存する
- スキャンが完了すると、GuardDutyはオブジェクトのダウンロードされたコピーを削除する

> GuardDuty は、S3 オブジェクトのスキャン結果イベントを Amazon EventBridge のデフォルトイベントバスに公開します。GuardDuty は、スキャンされたオブジェクトの数やスキャンされたバイト数などのスキャンメトリクスも Amazon CloudWatch に送信します。タグ付けを有効にすると、GuardDuty は定義済みのタグ GuardDutyMalwareScanStatusと潜在的なスキャン結果をタグ値として追加します。

- オブジェクトのスキャン結果イベントをEventBridgeのデフォルトイベントバスに公開する

> GuardDuty サービスが有効になっている場合に S3 のマルウェア保護を使用する (検出 ID)
　マルウェアスキャンによって S3 オブジェクト内に潜在的に悪意のあるファイルが検出された場合は、GuardDuty によって関連する検出結果が生成されます。検出結果の詳細を表示し、推奨される手順を使用して検出結果を修正できます。生成された検出結果は、検出結果をエクスポートする頻度に基づいて、S3 バケットと EventBridge イベント バスにエクスポートされます。


- GuardDuty が有効になっている場合
    - マルウェアスキャンにより、S3オブジェクト内に潜在的に悪意のあるファイルが検出された場合、GuardDutyにより関連する検出結果が生成される
    - 検出結果の詳細を表示し、推奨される手順を使用して結果を修正できる
    - 検出結果は、S3バケットとEventBridgeイベントバスにエクスポートされる

> S3 のマルウェア対策を独立した機能として使用する (検出器 ID なし)
　関連する検出器 ID がないため、GuardDuty は検出結果を生成できません。S3 オブジェクトのマルウェア スキャン ステータスを確認するには、GuardDuty がデフォルトのイベント バスに自動的に公開するスキャン結果を表示します。また、CloudWatch メトリクスを表示して、GuardDuty がスキャンしようとしたオブジェクトとバイトの数を評価することもできます。スキャン結果について通知を受け取るために、CloudWatch アラームを設定できます。S3 オブジェクトのタグ付けを有効にしている場合は、S3 オブジェクトでタグGuardDutyMalwareScanStatusキーとスキャン結果のタグ値を確認して、マルウェア スキャン ステータスを表示することもできます。

- GuardDuty が有効になっていない場合
    - 検出結果を生成できない
    - デフォルトのEventBusに自動的に公開するスキャン結果を表示する
    - CloudWatchメトリクスを表示し、スキャンしようとしたオブジェクトとバイト数を評価できる
    - CloudWatchアラームを設定できる


### S3 のマルウェア防御機能
> 次のリストは、バケットに対して S3 のマルウェア防御を有効にした後に期待できることや実行できることの概要を示しています。
> - スキャン対象を選択– 選択した S3 バケットに関連付けられているすべてのプレフィックスまたは特定のプレフィックス (最大 5 つ) にアップロードされるファイルをスキャンします。
> - アップロードされたオブジェクトの自動スキャン– バケットに対して S3 のマルウェア保護を有効にすると、GuardDuty は自動的にスキャンを開始し、新しくアップロードされたオブジェクト内の潜在的なマルウェアを検出します。
> - コンソール、API/AWS CLI、または AWS CloudFormation を使用して有効にします。S3 のマルウェア保護を有効にするには、優先する方法を選択します。
Terraformなどの Infrastructure as code (IaC) プラットフォームを使用して、S3 のマルウェア対策を有効にすることができます 。詳細については、リソースを参照してください。aws_guardduty_malware_protection_plan。
> - スキャンされた S3 オブジェクトのタグ付けをサポート (オプション) – マルウェア スキャンのたびに、GuardDuty はアップロードされた S3 オブジェクトのスキャン ステータスを示すタグを追加します。このタグを使用して、S3 オブジェクトのタグベースのアクセス制御 (TBAC) を設定できます。たとえば、悪意があると判断され、タグ値が である S3 オブジェクトへのアクセスを制限できますTHREATS_FOUND。
> - Amazon EventBridge 通知– EventBridge ルールを設定すると、S3 マルウェアスキャンのステータスに関する通知が届きます。
メンバーアカウントが自分のアカウントに属する Amazon S3 バケットに対してこの保護を有効にすると、委任された GuardDuty 管理者アカウントに EventBridge 通知が送信されます。

> - CloudWatch メトリクス– GuardDuty コンソールに埋め込まれたメトリクスを表示します。これらのメトリクスには、S3 オブジェクトの詳細が含まれます。

> GuardDuty も有効にすると、S3 オブジェクトに潜在的に悪意のあるファイルが含まれていると識別されたときに、セキュリティ検出結果が表示されます。GuardDuty は、生成された検出結果を修正するための手順を推奨します。


## S3 向けマルウェア対策の価格
> 無料プラン（スキャン費用）
> 各 AWS アカウントには、各リージョンごとに毎月特定の制限までの使用を含む 12 か月間の無料利用枠が付与されます。使用量が指定された制限を超えると、超過した制限の使用料が発生します。指定された制限と料金例の詳細については、 GuardDuty 保護プランの料金をご覧ください。。

> - 既存のすべての AWS アカウントは、2024 年 6 月 11 日から 2025 年 6 月 11 日まで、この機能の 12 か月間の無料利用枠を利用できます。アカウントのこの延長された 12 か月間の無料利用枠は、S3 のマルウェア防御の使用に適用され、他の AWS サービスや GuardDuty の別の機能には適用されません。
既存の AWS アカウントが 2025 年 6 月 11 日以降、またはアカウントの 12 か月間の無料利用枠の終了後に S3 のマルウェア対策の使用を開始すると、関連する使用コストが発生します。
> - 新しい AWS アカウントをお持ちで、12 か月間の無料利用枠が S3 向けマルウェア防御の一般提供開始日 (2024 年 6 月 11 日) 以降に開始される場合、この機能の 12 か月間の無料利用枠期間は、アカウントの 12 か月間の無料利用枠期間と同じになります。

> S3 のマルウェア防御を有効にした後の使用コストについては、「S3 のマルウェア防御の使用状況とコストの表示」を参照してください。

> S3 オブジェクトタグ付けの使用コスト
S3 のマルウェア防御を有効にする場合、スキャンした S3 オブジェクトのタグ付けを有効にするかどうかはオプションです。S3 オブジェクトのタグ付けを有効にすると、関連する使用コストが発生します。コストの詳細については、 管理とインサイト タブを参照してください。Amazon S3 の料金ページ をご覧ください。

> S3 オブジェクトタグ付けの使用コストは無料利用枠プランに含まれていません。

> Amazon S3 API - GET および PUT の使用コスト
GuardDuty が IAM PassRole に基づいて Amazon S3 API を実行すると、使用料が発生します。たとえば、IAM PassRole を引き受けた後、GuardDuty は API を実行して、PutObject選択したバケットにテスト オブジェクトを追加します。これにより、GuardDuty は機能の有効化ステータスを評価できます。

>AWS リージョンでの S3 API 呼び出しの料金については、「 ストレージとリクエスト」タブの「リクエストとデータ取得」を参照してください。Amazon S3 の料金ページ をご覧ください。

- 下記についてコストがかかる
    - スキャン費用
    - S3オブジェクトタグ付けコスト
    - S3APIのGet、Putコスト

[Amazon GuardDuty の料金](https://aws.amazon.com/jp/guardduty/pricing/#GuardDuty_protection_plans)には、スキャン費用は下記のように記載がある。（ap-northeast-1の場合）


- S3オブジェクトスキャン分析
    - GBあたり/月 ：0.79 USD /GB
    - 評価されるオブジェクト数 / 月： 0.282 USD / 1,000個のオブジェクト

## マルウェア保護プランのリソースステータス
[マルウェア保護プランのリソースステータス](https://docs.aws.amazon.com/guardduty/latest/ug/malware-protection-s3-bucket-status-gdu.html)を基に整理しています。

下記の保護ステータスがあります。

| ステータス|説明
|:--|:--|
|Active|S3バケットにS③マルウェア保護が正常に設定された|
|Warning|バケットは保護されていない。一部スキャンが完了していない可能性あり。潜在的な根本原因が1つ以上ある可能性がある|
|Error|バケットは保護されていない。マルウェアスキャンはいずれも完了していない|

## マルウェア保護プランのステータスの詳細のトラブルシューティング
詳細は、[マルウェア保護プランのステータスの詳細のトラブルシューティング](https://docs.aws.amazon.com/guardduty/latest/ug/troubleshoot-s3-malware-protection-status-errors.html)をご確認ください。





# 実践
下記のような構成で検証します

## 前提
> Malware Protection for S3 が S3 オブジェクトをスキャンし、オプションでタグを追加するには、次の必要な権限を含む IAM ロールを作成してアタッチする必要があります。
> - Amazon EventBridge アクションに EventBridge マネージドルールの作成と管理を許可し、Malware Protection for S3 が S3 オブジェクト通知をリッスンできるようにします。
> - Amazon S3 および EventBridge アクションに、このバケット内のすべてのイベントの通知を EventBridge に送信することを許可する
> - Amazon S3 アクションがアップロードされた S3 オブジェクトにアクセスできるようにし、スキャンされた S3 オブジェクトに定義済みのタグ を追加します GuardDutyMalwareScanStatus。オブジェクトプレフィックスを使用する場合は、s3:prefix対象のプレフィックスのみに条件を追加します。これにより、GuardDuty がバケット内のすべての S3 オブジェクトにアクセスできなくなります。
> - サポートされている DSSE-KMS および SSE-KMS 暗号化を使用して、テスト オブジェクトをスキャンしてバケットに配置する前に、KMS キー アクションがオブジェクトにアクセスできるようにします。


Marlware Protection for S3がS3オブジェクトをスキャンし、オプションでタグを追加するための設定を行います。

具体的には、下記の設定を行います。
- EventBridgeアクションに、EventBridgeマネージドルールの作成と管理を許可し、S3オブジェクト通知をリッスンする
- S3,EventBridgeアクションに、このバケット内のすべてのイベント通知をEventBridgeに送信することを許可する
- S3アクションが、アップロードされたS3オブジェクトに、アクセスできるようにし、スキャンされたS3オブジェクトに定義済みアクションを追加する
- サポートされている暗号化（DSSE-KMS、SSE-KMS）を使用し、テストオブジェクトをスキャンしバケットに配置する前に、KSMキーアクションがオブジェクトに、アクセスできるようにする

### S3バケットの用意
事前にバケットを用意しておきます
1. S3に移動します
1. バケットを作成します

### IAMポリシーの作成
::: note info
今回は、KMSは使用しないので、サンプルのバケットポリシーから該当箇所を除いています
:::

1. IAMに移動します
1. ナビゲーションペインで「ポリシー」をクリックします
1. 「ポリシーの作成」をクリックします
1. ポリシータブで「JSON」をクリックします
1. 下記のIAMポリシーを貼り付けます。リージョンやバケット名、アカウントIDは適宜修正してください（詳細は、[こちら](https://docs.aws.amazon.com/guardduty/latest/ug/malware-protection-s3-iam-policy-prerequisite.html)）
    - KMSを使用している方は、ARNを置き換えます。利用してない場合はstatementから削除してください
    ```
    {
        "Version": "2012-10-17",
        "Statement": [{
                "Sid": "AllowManagedRuleToSendS3EventsToGuardDuty",
                "Effect": "Allow",
                "Action": [
                    "events:PutRule",
                    "events:DeleteRule",
                    "events:PutTargets",
                    "events:RemoveTargets"
                ],
                "Resource": [
                    "arn:aws:events:us-east-1:111122223333:rule/DO-NOT-DELETE-AmazonGuardDutyMalwareProtectionS3*"
                ],
                "Condition": {
                    "StringLike": {
                        "events:ManagedBy": "malware-protection-plan.guardduty.amazonaws.com"
                    }
                }
            },
            {
                "Sid": "AllowGuardDutyToMonitorEventBridgeManagedRule",
                "Effect": "Allow",
                "Action": [
                    "events:DescribeRule",
                    "events:ListTargetsByRule"
                ],
                "Resource": [
                    "arn:aws:events:us-east-1:111122223333:rule/DO-NOT-DELETE-AmazonGuardDutyMalwareProtectionS3*"
                ]
            },
            {
                "Sid": "AllowPostScanTag",
                "Effect": "Allow",
                "Action": [
                    "s3:PutObjectTagging",
                    "s3:GetObjectTagging",
                    "s3:PutObjectVersionTagging",
                    "s3:GetObjectVersionTagging"
                ],
                "Resource": [
                    "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
                ]
            },
            {
                "Sid": "AllowEnableS3EventBridgeEvents",
                "Effect": "Allow",
                "Action": [
                    "s3:PutBucketNotification",
                    "s3:GetBucketNotification"
                ],
                "Resource": [
                    "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
                ]
            },
            {
                "Sid": "AllowPutValidationObject",
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject"
                ],
                "Resource": [
                    "arn:aws:s3:::DOC-EXAMPLE-BUCKET/malware-protection-resource-validation-object"
                ]
            },
            {
                "Sid": "AllowCheckBucketOwnership",
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
                ]
            },
            {
               "Sid": "AllowMalwareScan",
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:GetObjectVersion"
                ],
                "Resource": [
                    "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
                ]
            },
            {
                "Sid": "AllowDecryptForMalwareScan",
                "Effect": "Allow",
                "Action": [
                    "kms:GenerateDataKey",
                    "kms:Decrypt"
                ],
                "Resource": "arn:aws:kms:us-east-1:111122223333:key/APKAEIBAERJR2EXAMPLE",
                "Condition": {
                    "StringLike": {
                        "kms:ViaService": "s3.us-east-1.amazonaws.com"
                    }
                }
            }
        ]
    }
    ```
1. 次へをクリックします
1. ポリシー名を入力し、「ポリシーの作成」をクリックします


### ロールの作成
1. ナビゲーションペインで「ロール」を選択します
1. 「ロールを作成」をクリックします
1. 信頼されたエンティティタイプ「カスタム信頼ポリシー」を選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/63fc9da9-2dfa-825d-75c8-462055ff452b.png)

1. 下記の信頼関係ポリシーを貼り付け、「次へ」をクリックします
    ```
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "malware-protection-plan.guardduty.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
    ```

1. 上記で作成したIAMロールを選択し、「次へ」をクリックします
1. ロール名を入力し、「ロールを作成」をクリックします


## GuadDutyがオフの場合
[(オプション) S3 向け GuardDuty マルウェア防御を個別に開始する (コンソールのみ)](https://docs.aws.amazon.com/guardduty/latest/ug/malware-protection-s3-get-started-independent.html)を基に試します。

1. GuardDutyに移動します
1. トップページで「S3のMalware Protection」を選択し、「今すぐ始める」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9f4ae5b6-11e0-9241-f257-53e3583ac453.png)

## バケットのS3のマルウェア対策を有効にする
1. 保護されたバケットで「有効にする」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d8f5d1de-ff17-cacb-18a1-2c534e0285be.png)

1. 下記を入力し、「有効にする」をクリックします
    - ①.バケット名：作成したバケット名を指定
    - ②.プレフィックス：ここではバケット全体を指定
    - ③.スキャンされたオブジェクトにタグを付ける：オブジェクトにタグを付けるを選択
    - ④.アクセス許可＞IAMロール：作成したIAMロールを指定

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fa8e3784-2bb5-c571-2240-dc85c18fcd78.png)

1. 作成されました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/50f9de27-a052-b8c5-0f7e-1c011e708bd0.png)

### S3へファイルをアップロードする
1. 事前にファイルを用意します
    ```
    {"message":"malware-test-file"}
    ```
1. S3にアップロードします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fcb907bb-356f-7a28-5868-fcaee1639716.png)

1. オブジェクトをクリックし、プロパティを選択します。NO_THREATS_FOUNDのタグが付与されていました！
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a21cfab0-a247-c85c-45c8-6673d90a0af2.png)

### GuardDutyを確認する
1. GuardDutyに移動します
1. ナビゲーションペインで「S3 Malware Protection」を選択します
1. 対象のS3バケットをクリックします
1. GuardDutyのモニターで確認します。完了したスキャン数が確認できました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f1ad29ea-3be8-e160-b259-64c6a12c8f10.png)

### CloudWatch メトリクスを確認する
1. CloudWatchに移動します
1. ナビゲーションペインで「メトリクス」＞「すべてのメトリクス」をクリックします
1. 「GuardDuty/MalwareProtection」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e2136f53-38b4-8882-4dd4-a98c69d40ba2.png)
1. 「Malware Protection Plan Id,Resource Name」をクリックします
1. 下記のメトリクス名をクリックします。InfectedScanCountが表示されてないので一安心といったところでしょうか
    - CompletedScanBytes
    - CompletedScanCount
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c1f7d046-da6b-420e-7c52-682e8cf4eebf.png)

# 考察
今回は、先日発表された「GuardDuty Malware Protection for S3」を試してみました。
外部からデータを取得する場合や、ユーザがファイルをアップロードするようなシステムでは、使い所はありそうだと思いました。
今後は、下記のようなケースを試してみようと思います。
- Landingバケットにファイルをアップロードし、マルウェア検査をパスしたファイルのみアクセスさせるようにバケットポリシーを構成する
- EventBridgeをトリガーにファイルを移動させる

# 参考
https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/gdu-malware-protection-s3.html

https://aws.amazon.com/jp/about-aws/whats-new/2024/06/detect-malware-object-uploads-amazon-s3-guardduty/

https://aws.amazon.com/jp/guardduty/pricing/#GuardDuty_protection_plans