こんにちは。
クラウドインテグレーション部の今村です。
今回は Amazon GuardDutyのMalware Protection for Amazon 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の機能がマルウェア検知に特化した機能となります。
リージョナルマネージドサービスです。
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を有効化などの対応は不要です。
保護されたバケット欄で[有効にする]をクリックすることで設定が可能です。
設定項目と注意点は以下の通りです。
タグ名 | 結果 |
---|---|
NO_THREATS_FOUND | 脅威検出無し |
THREATS_FOUND | 脅威の検出有り |
UNSUPPORTED | サポートされていないタイプのオブジェクト |
ACCESS_DENIED | アクセス拒否 |
FAILED | スキャンの失敗 |
{
"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:GenerateDataKey
とkms:Decrypt
権限が必要です。
KMSキーを設定していない場合はKMSの権限設定は不要です。
途中s3:PutObject
がありますが、本設定有効化時に検証のため"malware-protection-resource-validation-object"が対象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
Using tag-based access control (TBAC) with Malware Protection for S3