Cloud One File Storage SecurityでスキャンするS3バケットに他のイベント通知を設定したい

2024.02.15

こんにちは、シマです。
皆さんはCloud One File Storage Security(以降C1FSS)を使っていますか?C1FSSは、トレンドマイクロ社が提供するセキュリティサービスの1つで、Amazon S3等のファイルに対してマルウェアスキャン機能を提供してくれます。そんなC1FSSの構築はC1FSS管理コンソール経由で、CloudFormationのスタックを作成するだけで簡単に構築できます。
今回はC1FSS構築における例外ケースとして、スキャンするS3バケットに他の要件でイベント通知を設定するケースのご紹介をします。

今回の構成

今回の構成は以下のようになります。

通常の構成ではS3のイベント通知をトリガーとして構成図内下枠のC1FSSのみで構成します。しかし、他の要件で必要な処理としてS3のイベント通知設定をする場合は、設定の制約によりそれができません。
※各イベント通知に指定できる送信先は1つだけ
そのため、他の要件で必要な処理の中でC1FSSの処理を呼び出す構成としています。

前提

「他の要件で必要な処理」は実装済みで、以下記事の「AWSアカウントの登録」まで完了していること

構築

C1FSSのストレージ登録

C1FSSの管理画面で「Add Storage」をクリックします。
リージョンを選択し、「Lanch Stack」をクリックします。
表示されるCloudFormationでパラメータの設定をします。「S3BucketToScan」には、スキャン対象のバケット名を指定し、「TriggerWithObjectCreatedEvent」では「false」を指定し、スタックの作成をします。
スタック作成完了後、出力タブ最下部にある「StorageStackManagementRoleARN」の値をコピーして、C1FSS管理画面のStep3にペーストし、「Submit」ボタンを押下します。

処理の追加

必要な処理の追加は2点です。1点目はイベントメッセージ構造をS3イベントメッセージ構造に加工すること、2点目はC1FSSのStorage登録処理により作成されたBucketListenerLambdaを呼び出すことです。

今回の構成ではS3イベントからSQSを経由しているため、そのままイベントメッセージをBucketListenerLambdaへ引数として渡すことができません。そのため、イベントメッセージ構造を加工します。その後、それを引数にBucketListenerLambdaを呼び出すように処理を修正します。BucketListenerLambdaの関数名は「C1FSSのストレージ登録」にて作成したCloudFormationの出力に表示されているので、そちらを参照します。

また、実行ロールに権限「lambda:InvokeFunction」がない場合は追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:ap-northeast-1:[AWSアカウントID]:function:Storage-TM-FileStorageSecurit-BucketListenerLambda-XXXXX"
        }
    ]
}

今回試してみたサンプルコードは以下に記載します。

lambda_function.py
import json
import boto3

def otherProcessing():
    print("other TEST message")

def c1fss(event):
    for record in event['Records']:
        if "body" in record:
            response = boto3.client('lambda').invoke(
                FunctionName = 'Storage-TM-FileStorageSecurit-BucketListenerLambda-XXXXXX',
                InvocationType='RequestResponse',
                Payload=record['body']
            )

def lambda_handler(event, context):
# c1fssLambda呼び出し
    c1fss(event)

# 他の要件で必要な処理
    otherProcessing()
    
    return {
        'statusCode': 200
    }

試してみた

対象S3バケットへ無害なテキストファイルと、有害なファイルとしてEicarテストファイルを格納してオブジェクトのタグが正常に付与されるかを確認しました。それぞれのケースにおいて、想定通りのタグが付与されていることが確認できました。下図はEicarテストファイルに付与されたタグです。

最後に

今回はC1FSS構築における例外ケースとして、スキャンするS3バケットに他の要件でイベント通知の設定が必要なケースのご紹介をしました。オプションの変更だけではなく、既存処理への対応が必要なところがポイントになると思います。

本記事がどなたかのお役に立てれば幸いです。