Cloud One File Storage Securityで検出した不正ファイルをAWS Security Hub経由でメール通知する

Cloud One File Storage Securityで検出した不正ファイルをAWS Security Hub経由でメール通知する

Clock Icon2024.09.20

はじめに

本記事では、Cloud One File Storage Security(以下、C1FSS)で不正なファイルを検出した際に、AWS Security Hub経由でメール通知を行う方法について解説します。

C1FSSの導入は、AWS CloudFormationテンプレートが提供されているため、比較的容易に構築できます。

arch-aws-flow-cm-hirai引用元

ファイルがスキャンされると、スキャン用S3バケット内のオブジェクトのタグに検出結果(正常または不正)が記録されます。
詳細な処理の流れは、以下のドキュメントにまとめられています。

https://cloudone.trendmicro.com/docs/jp/file-storage-security/arch-overview-aws/

本記事では、上記の基本構成に加えて、不正なファイルを検出した際に検出結果をAWS Security Hubに送信し、Amazon EventBridgeルール経由でメール通知する仕組みの導入方法を解説します。

本システムの構成は以下の通りです

  1. スキャン用S3バケットでファイルのスキャンを実行
  2. スキャン結果をLambda関数に送信
  3. Lambda関数が結果を分析し、不正ファイルと判定された場合のみAWS Security Hubに検出結果を送信
  4. Security Hubに送信された検出結果をトリガーとして、Amazon EventBridgeルールが起動
  5. EventBridgeルールに基づき、Amazon SNSを介してメールで通知を送信

cm-hirai-screenshot 2024-09-12 10.48.45

前提条件

Security Hubの統合は利用できない

AWS Security Hubの「統合」機能から「結果を受け入れる」を選択すると、Trend Cloud One サービスからAWS Security Hubにセキュリティイベントと評価を送信できます。

cm-hirai-screenshot 2024-09-12 10.10.23

しかしながら、現時点では、Trend Cloud One Container Securityのランタイムイベントのみがこの統合機能をサポートしています。

https://cloudone.trendmicro.com/docs/jp/integrations/security-hub/

C1FSSはこの統合機能をサポートしていないため、Security Hubの標準的な統合方法では実現できません。

Lambda関数を作成

本実装では、C1FSSのプラグインとして提供されている、FSSマルウェア検出結果をAWS Security Hubに送信するLambda関数を利用します。

https://github.com/trendmicro/cloudone-filestorage-plugins/tree/master/post-scan-actions/aws-nodejs-securityhub-integration

AWS CloudShellを利用して、C1FSSのプラグイン用リポジトリをダウンロードし、Lambda関数用のコードをZIP形式で圧縮します。

$ git clone https://github.com/trendmicro/cloudone-filestorage-plugins.git

$ cd cloudone-filestorage-plugins/post-scan-actions/aws-nodejs-securityhub-integration
$ npm --version
10.5.0
$ npm run package

新しいS3バケットを作成し、圧縮したZIPファイルをアップロードします。

$ aws s3 mb s3://cm-hirai-cloudone-securityhub
$ aws s3 cp bundle.zip s3://cm-hirai-cloudone-securityhub/

C1FSSのプラグイン用リポジトリに含まれるCloudFormationテンプレート(template.yaml)を使用して、新しいスタックを作成します。

  • stack-name:スタック名は何でもよいです。
  • snsScanResultTopicArn: C1FSS導入時にCloudFormationで作成されたSNSトピックのARNに置き換えてください。
  • LambdaZipBucket: Lambda関数のコードを含むZIPファイルを保存したS3バケットの名前です。
  • LambdaZipKey: S3バケット内のZIPファイルのオブジェクトキー名です。
$ aws cloudformation create-stack \
  --stack-name fss-security-hub-integration \
  --template-body file://template.yaml \
  --parameters \
    ParameterKey=snsScanResultTopicArn,ParameterValue=arn:aws:sns:ap-northeast-1:012345678901:Storage-TM-FileStorageSecurity-ScanResultTopic-6iKvNvXcr05o \
    ParameterKey=LambdaZipBucket,ParameterValue=cm-hirai-cloudone-securityhub \
    ParameterKey=LambdaZipKey,ParameterValue=bundle.zip \
  --capabilities CAPABILITY_IAM

このCloudFormationスタックで作成されるリソースは、以下の通り、スキャン結果をトリガーとして起動するLambda関数です。

  • Lambda関数
  • Lambda関数のIAMポリシーとIAMロール
  • Lambda関数のリソースベースポリシー
  • 既存のSNSトピックのサブスクリプションにLambda関数を追加

スタックの作成が完了したら、Lambda関数のコードがデプロイされるため、ZIPファイルを保存したS3バケットは不要となります。必要に応じて削除しましょう。

ファイルをアップロードしてみる

EICARテストファイル(ウイルススキャンのテスト用ファイル)をAWS CloudShellを使用してスキャン用S3バケットにアップロードします。

$ curl -O https://secure.eicar.org/eicar.com
$ aws s3 cp eicar.com s3://cm-hirai-c1fss

アップロード後、Security Hubの検出結果画面に以下のように表示されました。

cm-hirai-screenshot 2024-09-12 10.09.20

参考として、正常なファイルをアップロードした場合、Security Hubへの送信は行われません。
これにより、不正なファイルの検出時のみ通知が行われることが確認できます。

EventBridgeルールを作成

EventBridgeルールを作成する前に、Security Hubから送信されるイベントの例を以下に示します。
この情報は、後続のEventBridgeルールの設定に役立ちます。

{
	"version": "0",
	"id": "9f05b441-114a-fb53-09e5-1992a4358043",
	"detail-type": "Security Hub Findings - Imported",
	"source": "aws.securityhub",
	"account": "012345678901",
	"time": "2024-09-11T23:33:40Z",
	"region": "ap-northeast-1",
	"resources": [
		"arn:aws:securityhub:ap-northeast-1:012345678901:product/012345678901/default/012345678901/2398e98a-c4bf-4f0b-91c5-1a786263b723"
	],
	"detail": {
		"findings": [
			{
				"ProductArn": "arn:aws:securityhub:ap-northeast-1:012345678901:product/012345678901/default",
				"Types": [
					"Unusual Behaviors/Data"
				],
				"Description": "Malware found!",
				"SchemaVersion": "2018-10-08",
				"ProductName": "Default",
				"GeneratorId": "FSS",
				"CreatedAt": "2024-09-11T23:33:28.594Z",
				"RecordState": "ACTIVE",
				"Title": "S3 Object had malware detected by FSS.",
				"Workflow": {
					"Status": "NEW"
				},
				"Severity": {
					"Normalized": 70,
					"Label": "HIGH"
				},
				"UpdatedAt": "2024-09-11T23:33:28.594Z",
				"CompanyName": "Personal",
				"FindingProviderFields": {
					"Types": [
						"Unusual Behaviors/Data"
					],
					"Severity": {
						"Normalized": 70,
						"Label": "HIGH"
					}
				},
				"WorkflowState": "NEW",
				"ProductFields": {
					"aws/securityhub/FindingId": "arn:aws:securityhub:ap-northeast-1:012345678901:product/012345678901/default/012345678901/2398e98a-c4bf-4f0b-91c5-1a786263b723",
					"aws/securityhub/ProductName": "Default",
					"aws/securityhub/CompanyName": "Personal"
				},
				"AwsAccountId": "012345678901",
				"Region": "ap-northeast-1",
				"Malware": [
					{
						"Path": "eicar.com",
						"Type": "POTENTIALLY_UNWANTED",
						"State": "OBSERVED",
						"Name": "Eicar_test_file"
					}
				],
				"Id": "012345678901/2398e98a-c4bf-4f0b-91c5-1a786263b723",
				"Resources": [
					{
						"Type": "AwsS3Object",
						"Id": "eicar.com"
					},
					{
						"Type": "AwsS3Bucket",
						"Id": "cm-hirai-c1fss"
					}
				],
				"ProcessedAt": "2024-09-11T23:33:31.200Z"
			}
		]
	}
}

また、先ほど作成したLambda関数のコードを確認すると、 SecurityHubに送信する検出結果として、GeneratorIdSeverityなどの重要な値が設定されていることがわかります。
使用されているランタイムバージョンが最新であることも確認できました。

post-scan-actions/aws-nodejs-securityhub-integration/lambda/index.js
~中略~
const publishToSecurityHub = async (securityhub, securityHubArn, accountId, malwareName, bucket, key) => {
  const date = new Date().toISOString()
  const params = {
    Findings: [
      {
        AwsAccountId: accountId,
        CreatedAt: date,
        Description: "Malware found!",
        GeneratorId: "FSS",
        Id: `${accountId}/${uuidV4()}`,
        ProductArn: securityHubArn,
        SchemaVersion: "2018-10-08",
        Resources: [
          {
            Id: key,
            Type: "AwsS3Object"
          },
          {
            Id: bucket,
            Type: "AwsS3Bucket"
          },
        ],
        Malware: [
          {
            Name: malwareName,
            Path: key,
            State: "OBSERVED",
            Type: "POTENTIALLY_UNWANTED"
          }
        ],
        Severity: {
          Label: "HIGH"
        },
        Title: "S3 Object had malware detected by FSS.",
        Types: [
          "Unusual Behaviors/Data"
        ],
        UpdatedAt: date
      }
    ]
  }

これらの情報をもとに、Amazon EventBridgeルールを作成します。
このルールにより、特定の条件を満たすSecurity Hubの検出結果をトリガーとして通知を送信できます。

EventBridgeルールのイベントパターンは以下のように設定します。

イベントパターン
{
  "source": ["aws.securityhub"],
  "detail-type": ["Security Hub Findings - Imported"],
  "detail": {
    "findings": {
      "Severity": {
        "Label": ["HIGH"]
      },
      "RecordState": ["ACTIVE"],
      "GeneratorId": ["FSS"],
      "Workflow": {
        "Status": ["NEW"]
      }
    }
  }
}

EventBridgeルールのターゲットとして、先ほど作成したSNSトピックを指定します。また、通知メッセージの内容をカスタマイズするために、以下のように入力パスと入力テンプレートを設定します。

入力パス
{
  "TITLE": "$.detail.findings[0].Title"
  "PROCESSED_AT": "$.detail.findings[0].ProcessedAt",
  "AWS_ACCOUNT_ID": "$.detail.findings[0].AwsAccountId",
  "REGION": "$.detail.findings[0].Region",
  "S3_BUCKET": "$.detail.findings[0].Resources[1].Id",
  "S3_KEY": "$.detail.findings[0].Resources[0].Id",
}
入力テンプレート
{
  "タイトル": <TITLE>,
  "検出結果時間": <PROCESSED_AT>,
  "アカウントID": <AWS_ACCOUNT_ID>,
  "リージョン名": <REGION>,
  "S3バケット名": <S3_BUCKET>,
  "キー名": <S3_KEY>
}

設定が完了したら、動作確認するために、再度AWS CloudShellを使用して不正なファイル(EICARテストファイル)をアップロードします。

$ curl -O https://secure.eicar.org/eicar.com
$ aws s3 cp eicar.com s3://cm-hirai-c1fss

ファイルのアップロード後、数秒でメール通知が届きました。以下は受信したメールの内容です。

cm-hirai-screenshot 2024-09-12 11.17.00

まとめ

本記事では、Cloud One File Storage Security(C1FSS)で検出した不正ファイルをAWS Security Hub経由でメール通知する方法を解説しました。この実装により、以下のメリットが得られます。

  1. 不正ファイルの検出をリアルタイムで通知
  2. AWS Security Hubを活用した集中管理
  3. Amazon EventBridgeによる柔軟な通知ルールの設定

参考になれば幸いです。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.