Amazon GuardDuty Malware Protection for Amazon S3を使おう
マルウェア対策がしたい
皆さんも常日頃からAWS環境のマルウェア対策がしたいとお考えだと思います。
私もそう思います。なので今回はAmazon GuardDuty Malware Protection for Amazon S3を使ってみました。
Amazon S3のマルウェア対策のアイディア
パッと思いつくのが4つの方法です。
- EC2で一回処理したものをS3バケットへ返す
- Lambdaなどを使ってスキャンする(ClamAVとか)
- サードパーティのサービスを使う(Trend MicroのVison Oneとか)
- Amazon GuardDuty Malware Protection for Amazon S3を使う
この中で上の2つは自力でいろんなものを解決しなければならないのでできれば避けたいです。
実際問題この方法で解決するのはかなり運用上手間が大きいです。(ウイルス定義DBの更新など)
そうなった場合に3番ではどうでしょうか。例としてTrend MicroのVision OneをあげましたがAWSのサービス内で閉じずにMarketplaceや代理店からの購入が必要でした。
できればAWSのサービスだけで完結してくれると嬉しいです。そうなったときにAmazon GuardDuty Malware Protection for Amazon S3を使ってみましょう。
GuardDutyの類似機能との比較
Amazon GuardDutyにはもともとMalware Protectionの機能がありました。しかしEBSを対象としたものでS3を対象としたものではありませんでした。
また、S3 Protectionという機能はありましたが、こちらはS3バケットに対しての不正なアクセスなどの振る舞いを検知するもので保存されているオブジェクトそのものに対しての保護ではありませんでした。
Amazon GuardDuty Malware Protection for Amazon S3では対象となるS3バケットのオブジェクトをスキャンしてくれるサービスです。
マルウェアのスキャン実行し、結果をタグとして付与します。タグがつくのでそのタグを元にバケットポリシーでアクセスを制御したり、EventBridge+Lambdaで削除などもできます。
注意点としては他のGuardDutyの機能と同様に検知はしてくれますが、その後の対応については自分で対応する必要があります。
コスト
記事を書いている時点のap-northeast-1での価格は以下のとおりです。
課金対象 | コスト(USD) |
---|---|
評価されるオブジェクト1000個 | 0.282 |
評価オブジェクトの合計容量1GB | 0.1185 |
例えばスキャン対象のオブジェクトが50MBのファイル1000個だった場合、6.207USDかかります。
Trend Vision Oneの場合、年間スキャン対象のオブジェクト50万個あたり5000Credits(1Creditsは1.05USDなので5250USD)かかります。これはオブジェクトのサイズによらずこの価格なので場合によってはこちらを選んだほうがコスト的に有利になる可能性もあります。
Amazon GuardDuty Malware Protection for Amazon S3を使用するうえでの注意事項
スキャンできるバケット、オブジェクトには条件があります。[1]
この記事を書いている時点ではこのクオータは緩和申請をすることができるものではないので、もしこの条件に当てはまるようなオブジェクトをスキャンするような場合には注意が必要です。
- 設定できるバケットは25個まで
- オブジェクトのサイズが5GB未満
- アーカイブされているファイルの場合、深度が5未満
- アーカイブされているファイルの場合、入っているファイルが1000個未満
また、これ以外の制約としては以下に注意が必要です。[2]
- 暗号化zipファイルなどはスキャンできない(タグ GuardDutyMalwareScanStatus:UNSUPPORTED が付与される)
- ストレージタイプとしてミリ秒アクセスが可能な汎用バケットに限られます。また、Amazon S3 on Outpostsは対象外です。
- マルウェアスキャンはPUTイベントによって発火するので既存のバケットに設定した場合、設定前に置かれていたオブジェクトはそのままではマルウェアスキャンが実行されません。
コストや設定できるバケット数の制限などからCloudTrailのログを出力するバケットのようにスキャンが不要と考えられるバケットに対しては有効化しなくても良いのではないかと考えています。
設定してみた
注意事項
むやみにマルウェアをアップロードする行為は日本国内において以下の法律に違反する可能性があります。
不正指令電磁的記録に関する罪(刑法19条の2)
電子計算機損壊等業務妨害罪(刑法234条の2)
EICARテストファイルを用いて確認しますが、基本的に本物のマルウェアを実験であげてみるのはやめておいたほうが良いです。
下準備
WindowsやmacOSなど普段使用しているOSから普通にアップロードしようとすると大抵の場合マルウェア検知機能によってEICARテストファイルが駆除されてしまうと思います。
今回はCloudShellを使用してアップロードしました。
実際にアップロードすると
実験用オブジェクトとしていくつか準備しました。
- eicar.com, eicar.txt: eicarテストファイル
- contamination.xlsx: eicarテストファイルが混入したエクセルファイル
- 単純にzipファイルの中にeicar.comを入れただけです。
- encrypted.zip: eicar.comを暗号化zipにしたもの
- key.png, da01.xlsx: 無害な画像、エクセルファイル
スキャン結果
検出エンジンはAWS独自のエンジンとBitdefender社のものを使用してるようです。シグネチャファイルもほかと同じなら15分ごとに更新されていそうです。[3]
検知されたオブジェクトの場合
検知されたオブジェクト(eicar.com, eicar.txt, contamination.xlsx)の場合、タグにGuardDutyMalwareScanStatus:THREATS_FOUNDが付与されます。
検知されなかったオブジェクトの場合
検知されなかったオブジェクト(key.png, da01.xlsx)の場合、タグにGuardDutyMalwareScanStatus:NO_THREATS_FOUNDが付与されます。
スキャンできなかったオブジェクトの場合
検知されなかったオブジェクト(excrypted.zip)の場合、タグにGuardDutyMalwareScanStatus:UNSUPPORTEDが付与されます。
隔離するEventBridge+Lambdaを作る
このままだと同じバケットに残り続けてしまうので隔離用バケットを用意してそこに移動させるようにLambdaを作ります。
{
"source": ["aws.s3"],
"detail-type": ["Object Tags Added"],
"detail": {
"bucket": {
"name": ["対象とするS3バケット名"]
}
}
}
import json
import boto3
def lambda_handler(event, context):
DST_BUCKET_NAME = "隔離先S3バケット名"
bucket_name = event['detail']['bucket']['name']
key = event['detail']['object']['key']
s3client = boto3.client('s3')
res = s3client.get_object_tagging(
Bucket=bucket_name,
Key=key
)
for tag in res['TagSet']:
if tag['Key'] == "GuardDutyMalwareScanStatus" and tag['Value'] == "THREATS_FOUND":
s3client.copy_object(Bucket=DST_BUCKET_NAME, Key=key, CopySource={"Bucket": bucket_name, "Key": key}) # もし隔離が不要ならこの行は不要
s3client.delete_object(Bucket=bucket_name, Key=key)
print("隔離対象オブジェクト: ",bucket_name,"\\",key)
まとめ
コストもそれなりに安め(2025/02/01に85%値下げ)なので必要に応じて設定してしまって問題ないのではないかと思いました。
ただし、スキャンするオブジェクトのサイズが大きめだったりするとサードパーティのサービスを利用したほうが安くなることもあると思いますので比較は必要かなと思いました。
用途に合わせて選択が必要なのと、この機能だけでは守れない部分が多くありますので過信しすぎないようにすることが必要です。
Discussion