AQ Tech Blog

Amazon GuardDutyのMalware Protection for Amazon S3でS3のマルウェアスキャンができるようになりました

作成者: toshiki.imamura|2024年07月26日

 

はじめに

こんにちは。
クラウドインテグレーション部の今村です。

今回は Amazon GuardDutyのMalware Protection for Amazon S3が公開され、簡単にS3のマルウェアスキャンができるようになったので試していきたいと思います。

S3のマルウェアスキャンについて

これまでS3のマルウェアスキャンについて、AWS内で完結できるサービスは提供されていませんでした。
そのためS3のマルウェアスキャンを行いたい場合、TrendMicro社などのサードパーティー製品を利用することが多かったです。

類似サービスとして「Amazon GuardDuty Malware Protection」がありますが、こちらは対象EBSとしており、S3のスキャンには対応していません。
また、「Amazon GuardDuty S3 Protection」は、S3全体の脅威となる設定やイベントの検知が目的であり、マルウェアの検出が主な目的ではありませんでした。
そのため、現状ではAWSのサービスのみでS3のマルウェアスキャンをすることができませんでした。

Amazon GuardDuty Malware Protection for Amazon S3について

このような背景の中、今回発表された、Amazon GuardDuty Malware Protection for Amazon S3の機能がマルウェア検知に特化した機能となります。
リージョナルマネージドサービスです。
S3バケットに新しくアップロードされたオブジェクトをスキャンし、潜在的なマルウェア、ウイルス、その他の疑わしいアップロードを検出してくれます。
スキャンされたオブジェクトはスキャン結果を示すタグが付与されます。
スキャンの状況や異常を示すタグが付与された場合、CloudWatchへのメトリクスで確認可能です。

また、検知したマルウェアはオブジェクトのタグベースの管理により、マルウェアのオブジェクトへのアクセス権を制限することが可能です。
これによりマルウェアの無効化と調査のための実質的な隔離を行います。

注意点

注意点としては、マルウェアのオブジェクトそのものを削除しているわけではないことです。
実質的な隔離という表現を使用しましたが、同一バケット内に保管されている状態です。
あくまでアクセス権ベースでの分離を行います。

スキャンできるオブジェクトサイズには上限があります。
5GB以上のオブジェクトはスキャンされず、AWSサービスクォータによるサイズの緩和はできません。
パスワード無しで圧縮されたファイルについても5GBの制限は適用されます。
加えて、圧縮ファイルはファイル数1000ファイル以下かつ深度5までがスキャン対象で、こちらもAWSサービスクォータで緩和できません。
通常のマルウェアスキャンと同様に、パスワード付きで圧縮されたファイルのスキャンは行いません。

S3レプリケーションを設定している場合、スキャン結果を確認してからレプリケーションを行うといったことも対応していません。
ほかにもストレージクラスの条件など、スキャンする条件がありますので詳細は以下のドキュメントを確認ください。
Quotas in Malware Protection for S3

また、見落としてなければドキュメントに明確に記載がないため、以下には注意が必要です。

  • マルウェア検知のパターンファイルの更新間隔については開示していない
  • 既存オブジェクトのスキャンは対応していない

既存オブジェクトの更新については別のバケットを準備し定期コピーするなどして対応ができそうですが、サイズによってはコストがかかるのが難点です。

料金

Amazon GuardDutyのMalware Protection for Amazon S3の料金は以下の通りです。
無料枠の計算は省いて実施しています。

 

東京リージョン

項目 料金
オブジェクト容量/月 1GBあたり0.79ドル
オブジェクト数/月 1,000 オブジェクトあたり$0.282ドル

大阪リージョン

項目 料金
オブジェクト容量/月 1GBあたり0.83ドル
オブジェクト数/月 1,000 オブジェクトあたり$0.297ドル

ハンズオン

それでは実際に設定と検知を行っていきたいと思います。

事前にスキャン対象のS3バケットと、Amazon GuardDuty Malware Protection for Amazon S3用のIAMロールの作成が必要です。
IAMロールの権限については後述します。
マネジメントコンソールからAmazon GuardDutyを開き、S3のMalware Protectionを選択することで設定を行うことができます。
本機能は中国リージョンと GovCloud (米国) リージョンを除く、GuardDuty が利用可能なすべてのAWSリージョンで利用可能です。
また、事前に本機能以外のAmazon GuardDutyを有効化などの対応は不要です。

保護されたバケット欄で[有効にする]をクリックすることで設定が可能です。

設定項目と注意点は以下の通りです。

 

  • S3バケットの詳細を入力

    スキャン対象のS3バケットを指定

    執筆時点では同一リージョンの1バケットしか選択できないため、複数バケットを監視対象とする場合都度有効化が必要です。
    特定のプレフィックスで始まるオブジェクトのみ、スキャン対象にする指定が可能です。
    マルウェアスキャンの対象外としたいプレフィックスがある場合は、これにより特定のプレフィックス以外を選択するように設定する必要があります。
    1設定あたり5つまで追加可能なため、バケット構成にもよりますが除外設定として使う場合はちょっと手間がかかりそうです。

  • スキャンされたオブジェクトにタグをつける

    スキャンしたオブジェクトにスキャン結果をタグ付けが可能

    オブジェクトにタグをつけないことも可能ですが、よほどのことがない限りつけておくことが望ましいです。
    後述するS3のタグベースのアクセス管理と組み合わせることで脅威が検出されたり、スキャンをしていないオブジェクトへのアクセスを制限することが可能です。
    スキャン結果は以下の5つに分類されます。

 

タグ名 結果
NO_THREATS_FOUND 脅威検出無し
THREATS_FOUND 脅威の検出有り
UNSUPPORTED サポートされていないタイプのオブジェクト
ACCESS_DENIED アクセス拒否
FAILED スキャンの失敗

 

  • アクセス許可

    必要な権限

    Amazon GuardDuty Malware Protection for Amazon S3のサービスがS3へのスキャンやCloudWatchのメトリクス送信、EventBridgeの連携などのアクションを実行する権限が必要です。
    以下に記載しているような信頼関係とIAMポリシーを関連付けしたIAMロールを選択します。こちらのポリシーはマネジメントコンソール上で設定時にも確認が可能です。
    必要な信頼関係とポリシーを以下に記載します。

 

信頼関係

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "malware-protection-plan.guardduty.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

 

ポリシー

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowManagedRuleToSendS3EventsToGuardDuty",
"Effect": "Allow",
"Action": [
"events:PutRule",
"events:DeleteRule",
"events:PutTargets",
"events:RemoveTargets"
],
"Resource": [
"arn:aws:events:ap-northeast-1:XXXXXXXXXXXX: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:ap-northeast-1:XXXXXXXXXXXX:rule/DO-NOT-DELETE-AmazonGuardDutyMalwareProtectionS3*"
]
},
{
"Sid": "AllowPostScanTag",
"Effect": "Allow",
"Action": [
"s3:PutObjectTagging",
"s3:GetObjectTagging",
"s3:PutObjectVersionTagging",
"s3:GetObjectVersionTagging"
],
"Resource": [
"arn:aws:s3:::<bucket_name>/*"
]
},
{
"Sid": "AllowEnableS3EventBridgeEvents",
"Effect": "Allow",
"Action": [
"s3:PutBucketNotification",
"s3:GetBucketNotification"
],
"Resource": [
"arn:aws:s3:::<bucket_name>"
]
},
{
"Sid": "AllowPutValidationObject",
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::<bucket_name>/malware-protection-resource-validation-object"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucket_name>"
]
},
{
"Sid": "AllowMalwareScan",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": [
"arn:aws:s3:::<bucket_name>/*"
]
},
{
"Sid": "AllowDecryptForMalwareScan",
"Effect": "Allow",
"Action": [
"kms:GenerateDataKey",
"kms:Decrypt"
],
"Resource": "arn:aws:kms:ap-northeast-1:XXXXXXXXXXXX:key/<key_id>",
"Condition": {
"StringLike": {
"kms:ViaService": "s3.*.amazonaws.com"
}
}
}
]
}

 

S3にKMSキーを設定している場合はkms:GenerateDataKeykms:Decrypt権限が必要です。
KMSキーを設定していない場合はKMSの権限設定は不要です。
途中s3:PutObjectがありますが、本設定有効化時に検証のため"malware-protection-resource-validation-object"が対象S3バケットに格納されます。
このオブジェクトを格納するための権限となり、この権限がない場合作成時に警告が発生します。

 

  • Malware ProtectionポリシーIDにタグをつける

    オプション設定

    Amazon GuardDuty Malware Protection for Amazon S3にタグをつけることが可能です。
    コストやリソース管理時のためタグを設定してください。

 

タグによるアクセス制御

設定後スキャンを実施してマルウェアの検出はできましたが、オブジェクトの無効化、隔離はまだできていません。
こちらはS3バケットポリシーで制御します。
以下のようなポリシーをS3バケットポリシーに適用します。
NoReadExceptForCleanのSidで、GuardDutyMalwareProtectionや一部のロール以外の"NO_THREATS_FOUND"ではないオブジェクトへのアクセスを制限します。
また、誤検知発生時にはタグの上書き更新が必要です。
その場合はOnlyGuardDutyScanTagのSidで、特定のロールがオブジェクトのタグを更新できるようにしています。

 

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "NoReadExceptForClean",
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::XXXXXXXXXXXX:root",
"arn:aws:iam::XXXXXXXXXXXX:role/IAM-role-ARN",
"arn:aws:iam::XXXXXXXXXXXX:assumed-role/role-ARN/GuardDutyMalwareProtection"
]
},
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
],
"Condition": {
"StringNotEquals": {
"s3:ExistingObjectTag/GuardDutyMalwareScanStatus": "NO_THREATS_FOUND"
}
}
},
{
"Sid": "OnlyGuardDutyScanTag",
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::XXXXXXXXXXXX:root",
"arn:aws:iam::XXXXXXXXXXXX:role/IAM-role-ARN",
"arn:aws:iam::XXXXXXXXXXXX:assumed-role/role-ARN/GuardDutyMalwareProtection"
]
},
"Action": "s3:PutObjectTagging",
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
]
}
]
}

上記ポリシーは以下のドキュメントにも記載がありますので合わせてご確認ください。
Using tag-based access control (TBAC) with Malware Protection for S3

動作確認

有効化後ステータスがActiveとなれば完了です。
有効化したAmazon GuardDuty Malware Protection for Amazon S3を開くと、設定項目やメトリクスが表示されます。
有効化後、EventBridgeにはDO-NOT-DELETE-AmazonGuardDutyMalwareProtectionS3から始まるリソースが作成されています。

それでは実際に動作検証をしていきます。
まずは脅威がないtestオブジェクトをアップロードし動作を確認していきます。

 

 

アップロード後オブジェクトのタグを確認すると、GuardDutyMalwareScanStatusタグが付与されています。
今回は脅威がないオブジェクトのため値はNO_THREATS_FOUNDです。

続いて、EICARテストファイルを使用してマルウェア検知時の動作を確認します。
EICARテストファイルのアップロード後タグを確認すると、GuardDutyMalwareScanStatusタグが付与され値はTHREATS_FOUNDです。
検知された場合バケットポリシーの設定によりs3:GetObject ができないことがわかります。

 

 

パスワード無しのzipファイルをS3に格納した際の動作も確認します。
パスワード無しzipファイルの中にEICARテストファイルを入れた際にも、想定通り検知しました。

 

 

最後に6GBのファイルを準備してアップロードしてみました。
結果はUNSUPPORTEDタグが付与され、スキャンがスキップされていました。

 

 

CloudWatchのメトリクスも、確認すると検知されていることが確認できます。

 

 

また、THREATS_FOUNDが付与されているオブジェクトのタグを編集しようとすると、権限により編集もできないことがわかります。
もちろんオブジェクトを開こうとするとアクセス拒否となります。

 

まとめ

以上、Amazon GuardDutyのMalware Protection for Amazon S3の紹介とハンズオンでした。
S3のマルウェア対策をAWSのみで完結できるようになったという意味で待望のサービスです。
今後、既存オブジェクトの定期スキャン機能などが追加されたら、より使いやすくなると思います。

設定自体は簡単に行えますが、マルウェア検知後どのような対処をしていくかの設計によって権限設定が変わっていく機能のため、導入時には権限設定を考慮していく必要があります。
また、料金もそれなりにかかるサービスのため、サードパーティー製品とどちらが良いか比較して導入検討をする必要があるサービスです。

参考

GuardDuty Malware Protection for S3

 Quotas in Malware Protection for

S3

 Using tag-based access control (TBAC) with Malware Protection for S3

 Amazon GuardDuty の料金