AWS

Amazon GuardDuty Malware Protection for Amazon S3でマルウェア検知後に隔離し削除する

hisadon

はじめに

こんにちは。hisadonです。
先日、S3に対するネイティブなマルウェア検出と保護の機能である「Amazon GuardDuty Malware Protection for Amazon S3」がリリースされました。
リリースされた機能を用いて、今回はマルウェア検出後に隔離し削除する方法をご紹介したいと思います。

実装の推しポイント

  1. 検出後にマルウェアを特定のAmazon S3へ自動で隔離する
  2. 検出したマルウェアは自動で削除する

AWS 構成イメージ

実装に向けての前提

  1. 「Amazon GuardDuty Malware Protection for Amazon S3」を有効にしており、テスト対象のS3バケットを指定済みであること
  2. 隔離用のAmazon S3を事前に用意していること

実装の流れ

  1. AWS Lambda を作成する
  2. S3イベント通知の設定する
  3. AWS CloudShell にてMalwareをアップロードしてテストする

設定手順1(AWS Lambdaを作成する)

1.関数の作成を実施し、以下を指定します。
- オプション:一から作成
- 関数名:自由につけちゃってOK
- ランタイム:Python 3.12
- 他はそのままで「関数の作成」でOK

2.以下のPythonコードを記述します。
※ コード内で変更が必要な箇所はありません。

import json
import boto3
import os
import urllib.parse
import time

s3 = boto3.client('s3')

def lambda_handler(event, context):
    # イベントからバケット名とオブジェクトキーを取得
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])
    
    # 移動先バケット名を環境変数から取得
    destination_bucket = os.environ.get('DESTINATION_BUCKET')
    if not destination_bucket:
        raise ValueError("Destination bucket not set in environment variables")
    
    # タグ付けが完了するまで30秒待機
    time.sleep(30)
    
    # オブジェクトのタグを取得
    response = s3.get_object_tagging(Bucket=bucket, Key=key)
    tags = response['TagSet']
    
    # タグをチェックして移動
    for tag in tags:
        if tag['Key'] == 'GuardDutyMalwareScanStatus' and tag['Value'] == 'THREATS_FOUND':
            # オブジェクトを別のバケットにコピー
            copy_source = {'Bucket': bucket, 'Key': key}
            s3.copy_object(Bucket=destination_bucket, Key=key, CopySource=copy_source)
            
            # 元のオブジェクトを削除
            s3.delete_object(Bucket=bucket, Key=key)
            break
    
    return {
        'statusCode': 200,
        'body': json.dumps('Lambda function executed successfully')
    }

3.タイムアウトをデフォルトの「3秒」から「1分」に変更しておきます。

4.環境変数を編集し、キーに「DESTINATION_BUCKET」、値に「隔離先のS3バケット名」を記述し保存します。

5.AWS Lambdaの初期ロールでは権限が足りない為、以下のIAMポリシーを作成し、ロールに追加します。
※ ポリシー内にある「source-s3-bucket」にはMalwareを設置予定のS3バケット名を入力し、「destination-s3-bucket」には隔離先のS3バケット名を入力してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SourceS3Bucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectTagging",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::source-s3-bucket/*"
            ]
        },
        {
            "Sid": "DestinationS3Bucket",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectTagging"
            ],
            "Resource": [
                "arn:aws:s3:::destination-s3-bucket/*"
            ]
        }
    ]
}

設定手順2(S3イベント通知の設定する)

1.Malwareを配置予定のAmazon S3を開いてください。

2. タブにある「プロパティ」にある「イベント通知」の箇所の「イベント通知を作成」を選択します。

3. イベント名は適当に入力し、イベントタイプにある「すべてのオブジェクト作成イベント」を選択します。画面を下にスクロールしていき、送信先には先ほど作成したAWS Lambdaを指定しておきます。

設定手順3(AWS CloudShell にてMalwareをアップロードしてテストする)

1. AWS CloudShellを起動してください。

2. 以下を入力して、S3にマルウェアを配置します
※「target-s3-bucket」にはマルウェアを配置したいS3バケット名に直して入力してください。

$ S3=target-s3-bucket
$ curl https://secure.eicar.org/eicar.com -o eicar.com
$ aws s3 cp eicar.com s3://$S3/
upload: ./eicar.com to s3://target-s3-bucket/eicar.com

3. Amazon S3に eicar.com が配置されている事を確認します。

4. eicar.com を開きタグに「THREATS_FOUND」がついていたら Amazon Guardduty が機能している状態です。

5. 30秒ほど経つと隔離先にeicar.comがコピーされていること、元々のAmazon S3からeicar.comが削除されている事を確認します。

まとめ

マルウェアの隔離と削除を自動実装してみました。
自動実装後に通知処理も組み込めるとより良くなりそうです。
この記事が皆様のセキュリティ対応に役立つことを願っています。

AUTHOR
hisadon
hisadon
記事URLをコピーしました