👌

GuardDuty Malware Protection for Amazon S3 を試してみた

2024/06/12に公開
3

S3のマルウェア検索がしたい

S3 上のマルウェア検査をしたいと常日頃思っていた皆さん待望の GuardDuty のアップデートがついに来ました!!
(AWS re:Inforce 2024 の Keynote にて発表があり、夜中でしたがかなり盛り上がってました←)

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

https://aws.amazon.com/blogs/aws/introducing-amazon-guardduty-malware-protection-for-amazon-s3/

今まで S3 上のマルウェア検査を行う場合 3rd Party のソリューションを選択する必要があったので、GuardDuty で対応してくれるのは嬉しい人はとても多いのではないかと思います。
私はとっても嬉しいです。

というわけで早速やってみました~

いきなりまとめ

  • オブジェクトを S3 バケットにアップロードした際、EventBridge が動作し、GuardDuty がオブジェクトをダウンロードしスキャンを行いマルウェアなど悪意のあるファイルを検出する
  • アカウント内で GuardDuty のメイン機能が有効になっていない場合でも、Malware Protection for Amazon S3 のみを単体で有効化できる ( 保護プラン内の機能として追加されている )
  • スキャン結果は EventBridge に送信されるため、ユーザ側で処理のカスタマイズが可能
    *GuardDuty のメイン機能を有効にしていない場合ちょっと動作が異なるため注意
  • スキャンしたオブジェクトに対し、GuardDutyMalwareScanStatus というタグの自動付与が可能
    これによってタグベースポリシーによるアクセス制御が可能
  • スキャンできるオブジェクトの最大サイズは 5GB
    *アーカイブファイルもスキャン可能、対象外のオブジェクトの場合はスキャンがスキップされる
  • 12か月の無料プラン中は利用料無料、その後は検査されたオブジェクトサイズとオブジェクト数に対しての課金
  • リージョナルサービスのため、スキャン対象の S3 バケットは有効化する GuardDuty と同一のリージョンのもののみ選択可能
     →複数リージョンの S3 バケットをスキャンする場合各リージョンでの設定が必要
  • 現状マルチアカウント管理(委任されたアカウントでの各アカウント設定の統合管理はできない)
     →アカウントごとに個別で設定を有効化する必要がある

やってみた

有効化手順

  1. GuardDuty のコンソールに行くと保護プランの中に追加されています

  2. 「S3 の Malware Protection を有効化」をクリックしていきます

  3. スキャン対象の S3 バケットを選択します

    *スキャン対象の S3 バケットは本機能を有効化する GuardDuty と同一のリージョン限定となっています
    それ以外のリージョンのバケットは S3 バケットを選択する画面で表示されません

また、検査対象をバケット内のプレフィックスで指定したい場合、最大5つまで選択が可能です

  1. スキャン後のタグ付けの選択

  2. GuardDuty がスキャンを行うための IAM ロールを選択

必要な権限

ポリシー
{
  "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:************: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:************:rule/DO-NOT-DELETE-AmazonGuardDutyMalwareProtectionS3*"
      ]
    },
    {
      "Sid": "AllowPostScanTag",
      "Effect": "Allow",
      "Action": [
        "s3:PutObjectTagging",
        "s3:GetObjectTagging",
        "s3:PutObjectVersionTagging",
        "s3:GetObjectVersionTagging"
      ],
      "Resource": [
        "arn:aws:s3:::ano-bucket-us-east-1/*"
      ]
    },
    {
      "Sid": "AllowEnableS3EventBridgeEvents",
      "Effect": "Allow",
      "Action": [
        "s3:PutBucketNotification",
        "s3:GetBucketNotification"
      ],
      "Resource": [
        "arn:aws:s3:::ano-bucket-us-east-1"
      ]
    },
    {
      "Sid": "AllowPutValidationObject",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::ano-bucket-us-east-1/malware-protection-resource-validation-object"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::ano-bucket-us-east-1"
      ]
    },
    {
      "Sid": "AllowMalwareScan",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": [
        "arn:aws:s3:::ano-bucket-us-east-1/*"
      ]
    },
    {
      "Sid": "AllowDecryptForMalwareScan",
      "Effect": "Allow",
      "Action": [
        "kms:GenerateDataKey",
        "kms:Decrypt"
      ],
      "Resource": "arn:aws:kms:us-east-1:************:key/<key_id>",
      "Condition": {
        "StringLike": {
          "kms:ViaService": "s3.*.amazonaws.com"
        }
      }
    }
  ]
}
信頼関係
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "malware-protection-plan.guardduty.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  1. Malware Protection にタグ付けを行う場合は指定します

  2. 有効にすると保護されたバケットに表示がされます

現時点で委任された管理アカウントでの各アカウントでの設定の有効化などはできませんでした。

検査

とりあえずそれっぽいものをアップロードしてみます

ファイルサイズに依存するとは思いますが体感ではとても速く数秒でスキャンが完了していました

不審ファイル

正常なファイル

5GB 以上のファイル

パスワード付きZipでスキャンがスキップされた?オブジェクト


スキャンがされなかったとスキャンが出来なかったは区別されてタグなしになるんですかね。。?
→再度アップロードしたら正常にタグが付与されていました。ちゃんとクォータを読むとパスワード付きZipは解凍されずに暗号化されたままでスキャンがされるみたいですね。

付与されるスキャン結果のタグは以下のようなものがあるみたいです

  • NO_THREATS_FOUND – 正常なファイル
  • THREATS_FOUND – 悪意のある可能性があるファイル
  • UNSUPPORTED – サイズ制限でスキャンが出来なかったファイル
  • ACCESS_DENIED – アクセス権限がなくスキャンが出来なかったファイル
  • FAILED – スキャンが出来なかったファイル

検出結果

以下のように出力されていました

詳細では検出理由やどのファイルがどの検出ルールで検出されたのかが確認できます。

Zip ファイルはディレクトリの中のどのファイルが検出されたかまで出力されます

また検出ソースについては EC2 の Malware Protection と同様の「Bitdefender」社になっていました。

コスト

https://aws.amazon.com/guardduty/pricing/
※protection plans 内の Malware Protection にあります

東京リージョンでは以下となっていました。

  • 1か月で検査したファイルサイズの GB ごとに $0.79
  • 1か月で検査したオブジェクト数が 1000 個ごとに $0.383

カスタマイズ

以下で記載のように EventBridge ルールにてイベントパターンを作成することで、Lambda などを実行することでそもそも S3 バケットからの削除や通知などユーザ側でカスタマイズできるようになっています。

https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/monitor-with-eventbridge-s3-malware-protection.html

GuardDuty で S3 バケット上のマルウェアスキャンが出来るようになりました

GuardDuty Malware Protection for Amazon S3 を実際にやってみた流れや検出結果、コストについてまとめてみました。

何度も書きますが GuardDuty で S3 バケット上のマルウェアスキャンが出来るようになった(ネイティブサービスで対応できるようになった)のはとても嬉しいですね。

検索結果のタグ付与、および EventBridge からのカスタマイズ性というところでかなり素敵なサービスなのではないかと思っています。

ただ注意点としては既存のオブジェクトについては検査対象ではない点でしょうか、こちらは別の S3 バケットにコピーするなどユーザ側での別の対処が必要になるものと思います。

この記事が誰かの助けになれば幸いです。

参考

OLH トップページ
https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/gdu-malware-protection-s3.html

Quota
https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/malware-protection-s3-quotas-guardduty.html

臼田さんの嬉しいがあふれるブログ
https://dev.classmethod.jp/articles/release-guardduty-s3-malware-protection/

Hayaoさんの Keynote まとめメモ
https://qiita.com/hayao_k/items/f69db74b40779c84c34b

Discussion

okenakokenak

確認したところ、東京リージョンのS3バケットも選択できるようでした。
(おそらくGuardDutyをバージニア北部リージョンで見てるからでは?)

AnoAno

ご指摘ありがとうございます!!再度確認したらその通りでした。
内容アップデートします!