V1ESのログを、SNS + Amazon Data Firehose経由でS3に送信してみた

V1ESのログを、SNS + Amazon Data Firehose経由でS3に送信してみた

2025.09.26

こんにちは!クラウド事業本部の吉田です。

Vision One使っていますか?

Endpoint Security(Server & Workload Protection)(以降V1ES)のログの保管期限は、ライセンスによりますが最長1年となります。

[Trend Vision One ] Vision One で保存できるログとデータの保持期間について

ログ保管要件によって1年以上保存する必要がある場合は、どこかにログ転送して保管する必要があります。

今回は、SNS + Amazon Data Firehose経由でS3にV1ESをログを送信する方法についてまとめてみました。

構成図

vscode-drop-1758851096229-5fcwicuso95.png

前提

下記のV1ESとAWSの初期構築は完了している前提とします。
完了していない場合は、参考ブログを参照して作業を完了してください。

事前準備

V1ES上の設定の前に、AWS環境上でログ転送のために必要なリソースを作成していきます。
通信の流れと逆の方向で、リソースを作成していきます。

  1. V1ESログ保存S3作成
  2. Amazon Data Firehose配信ストリーム作成
  3. SNS作成
  4. V1ESがSNSトピックにアクセスするためのIAMユーザー作成

V1ESログ保存S3作成

V1ESのログを保存するS3を作成します。
こちらは、デフォルトの設定で作成します。
今回は、v1es-log-test-vrdsyywという名前で作成します。

Amazon Data Firehose配信ストリーム作成

送信先がV1ESログ保存S3であるAmazon Data Firehose配信ストリームを作成します。
送信先以外は、デフォルト値で設定します。
デフォルト値の部分は、要件に合わせて適宜設定値を変更してください。

  • ソースと送信先を選択
    • ソース
      • 「Direct PUT」
    • 送信先
      • S3
  • Firehose ストリーム名
    • 任意の名前を設定してください
    • 今回はv1es-log-test-firehoseという名前で作成します
  • レコードを変換および転換
    • すべてデフォルト
  • 送信先の設定
    • S3バケット
      • 先ほど作成したV1ESログ保存S3バケットを指定します
    • それ以外はデフォルト
  • 詳細設定
    • サービスアクセス
      • IAMロールを作成または更新(デフォルト値)
    • それ以外はデフォルト

vscode-drop-1758781899666-xss8ha1dqn.png

vscode-drop-1758781914301-759j7d5h7og.png

vscode-drop-1758781983424-imseug7u8lf.png

サービスアクセスロールを自動作成するオプションを選択した場合、IAMロールの作成のラグがあるためかAmazon Data Firehose配信ストリームの作成時に下記のエラーが発生する可能性があります。

			
			Firehose is unable to assume role arn:aws:iam::アカウントID:role/service-role/KinesisFirehoseServiceRole-vles-1og-ap-northeast-1-1758676543060. Please check the role provided.

		

vscode-drop-1758850110895-qkej2edggyi.png

その場合は、しばらく待ってから再度作成するようにすると、Amazon Data Firehose配信ストリームが作成できます。

作成されたIAMロールにアタッチされているIAMポリシーの内容は、下記の通りとなります。

自動作成されたIAMポリシー
			
			{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "glue:GetTable",
                "glue:GetTableVersion",
                "glue:GetTableVersions"
            ],
            "Resource": [
                "arn:aws:glue:ap-northeast-1:AWSアカウントID:catalog",
                "arn:aws:glue:ap-northeast-1:AWSアカウントID:database/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%",
                "arn:aws:glue:ap-northeast-1:AWSアカウントID:table/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%"
            ]
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "kafka:GetBootstrapBrokers",
                "kafka:DescribeCluster",
                "kafka:DescribeClusterV2",
                "kafka-cluster:Connect"
            ],
            "Resource": "arn:aws:kafka:ap-northeast-1:AWSアカウントID:cluster/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:DescribeTopic",
                "kafka-cluster:DescribeTopicDynamicConfiguration",
                "kafka-cluster:ReadData"
            ],
            "Resource": "arn:aws:kafka:ap-northeast-1:AWSアカウントID:topic/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:DescribeGroup"
            ],
            "Resource": "arn:aws:kafka:ap-northeast-1:AWSアカウントID:group/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%/*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::v1es-log-test-vrdsyyw",
                "arn:aws:s3:::v1es-log-test-vrdsyyw/*"
            ]
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:GetFunctionConfiguration"
            ],
            "Resource": "arn:aws:lambda:ap-northeast-1:AWSアカウントID:function:%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:ap-northeast-1:AWSアカウントID:key/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%"
            ],
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "s3.ap-northeast-1.amazonaws.com"
                },
                "StringLike": {
                    "kms:EncryptionContext:aws:s3:arn": [
                        "arn:aws:s3:::%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%/*",
                        "arn:aws:s3:::%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%"
                    ]
                }
            }
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:ap-northeast-1:AWSアカウントID:log-group:/aws/kinesisfirehose/v1es-log-test-firehose:log-stream:*",
                "arn:aws:logs:ap-northeast-1:AWSアカウントID:log-group:%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%:log-stream:*"
            ]
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "kinesis:DescribeStream",
                "kinesis:GetShardIterator",
                "kinesis:GetRecords",
                "kinesis:ListShards"
            ],
            "Resource": "arn:aws:kinesis:ap-northeast-1:AWSアカウントID:stream/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:ap-northeast-1:AWSアカウントID:key/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%"
            ],
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "kinesis.ap-northeast-1.amazonaws.com"
                },
                "StringLike": {
                    "kms:EncryptionContext:aws:kinesis:arn": "arn:aws:kinesis:ap-northeast-1:AWSアカウントID:stream/%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%"
                }
            }
        }
    ]
}

		

利用するリソースに関しては、「%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%」の部分が実際のリソース名に置き換わる形となっております。
IAMロールとIAMポリシーを自前で用意する場合は、この自動作成されたIAMポリシーの内容を参考にしてください。

SNS作成

次にSNSを作成します。

SNSを作成する前に、SNSが利用するIAMロールを作成します。
まず下記の内容のIAMポリシーを作成します。

SNS用IAMポリシー
			
			{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "firehose:DescribeDeliveryStream",
                "firehose:ListDeliveryStreams",
                "firehose:ListTagsForDeliveryStream",
                "firehose:PutRecord",
                "firehose:PutRecordBatch"
            ],
            "Resource": [
                "arn:aws:firehose:ap-northeast-1:AWSアカウントID:deliverystream/v1es-log-test-firehose"
            ],
            "Effect": "Allow"
        }
    ]
}

		

参考:Amazon SNS トピックへ Firehose 配信ストリームをサブスクライブする - Amazon Simple Notification Service

上記のIAMポリシーをアタッチしたIAMロールを作成します。
今回は、v1es-log-test-sns-roleという名前で作成します。

信頼ポリシーも、下記の内容で設定してください。

SNS用IAMロールの信頼ポリシー
			
			{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "sns.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

		

IAMロールが作成できましたら、次はSNSトピックを作成します。
タイプはスタンダードで、それ以外はデフォルトで作成しました。
トピック名は、v1es-log-test-sns-topicです。

vscode-drop-1758850153500-zgdr47hag8.png

vscode-drop-1758850161665-uots092jo9.png

作成したSNSトピックにサブスクリプションを設定します。

  • SNSトピック
    • 作成したSNSトピック
  • プロトコル
    • Amazon Kinesis Data Firehose
  • エンドポイント
    • Amazon Data FirehoseのArn
  • サブスクリプションロールの ARN
    • 作成したSNS用のIAMロールのArn

vscode-drop-1758850185686-q2b8p7npz3i.png

ここまで設定できましたら、SNS→Amazon Data Firehose→S3で疎通ができるか確認しましょう。

作成したトピックの詳細画面に移動すると、「メッセージの発行」というボタンがあります。
クリックしますと、テストメッセージの作成画面に移りますので、適当な内容を入力してテストメッセージを送信します。

vscode-drop-1758850214902-c2910dtbqn4.png

vscode-drop-1758850220992-f6bt7lp2hra.png

しばらく待ちますとS3にログファイルが配置されています。

vscode-drop-1758850233110-i4f6gcbnh3j.png

ログファイルの内容は、下記の通りです。
(わかりやすくするためにフォーマットしています。本来は下記の内容は1行で記載されています)

			
			{
    "Type": "Notification",
    "MessageId": "3b7b4a8c-77ea-5e87-b42b-2bc13b3480f2",
    "TopicArn": "arn:aws:sns:ap-northeast-1:AWSアカウントID:v1es-log-test-sns-topic",
    "Subject": "test",
    "Message": "test",
    "Timestamp": "2025-09-24T01:34:22.290Z",
    "UnsubscribeURL": "XXXXXXXX"
}

		

設定したテストメッセージが記載されています。
これで、SNS→Amazon Data Firehose→S3までは問題なく疎通ができることが確認できました。

V1ESがSNSトピックにアクセスするためのIAMユーザー作成

最後の事前準備となります。
V1ESがSNSトピックにアクセスするためのIAMユーザーを作成します。

下記の内容のIAMポリシーを作成し、IAMユーザーにアタッチしてください。

IAMユーザーにアタッチするIAMポリシー
			
			{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sns:Publish"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:sns:ap-northeast-1:108782087350:v1es-log-test-sns-topic"
        }
    ]
}

		

IAMユーザーを作成した後は、アクセスキーを発行します。

本作業

ここからVision Oneのコンソール上の作業となります。

「CLOUD SECURITY」→「Server & Workload Protection」をクリックします。

vscode-drop-1758850278835-vuqnv9zwpgb.png

画面左上のServer & Workload Protection Managerを、対象のAWSアカウントを管理しているProduct Instanceに切り替えます。

vscode-drop-1758850291999-7kv0dgq5kml.png

「管理」→「システム設定」→「イベントの転送」の順にクリックします。
「Amazon SNS」セクションで、下記の内容で設定します。

  • Amazon Simple Notification Serviceにイベントを公開
    • 有効化
  • アクセスキー - SNSトピックにアクセスするためのAWSユーザのアクセスキー
    • V1ESがSNSトピックにアクセスするためのIAMユーザーのアクセスキー
  • 秘密鍵 - SNSトピックにアクセスするためのAWSユーザの秘密鍵
    • V1ESがSNSトピックにアクセスするためのIAMユーザーのシークレットキー
  • SNSトピックARN
    • SNSトピックのArn
  • 転送するイベントの種類
    • 転送したいイベントを適宜設定

vscode-drop-1758850303296-lhkmti121mr.png

動作確認

設定ができましたら、「資格情報のテストと通知の送信」をクリックして動作確認をします。

vscode-drop-1758850320044-6uj2fizexy.png

クリックすると下記の内容のポップが表示されます

			
			Amazon SNSの資格情報が確認されました。次のイベントタイプでテスト通知が送信されました:「TestSNS」

		

vscode-drop-1758850348988-5vqq24qxo79.png

こちらもしばらく待ちますと、S3にログファイルが配置されています。
ログファイルの内容を確認すると、ポップの内容通りにEventTypeが「TestSNS」のイベントが記載されています。

			
			{
    "Type": "Notification",
    "MessageId": "9ee2dce4-4696-56c8-b1a4-bda917ba78e6",
    "TopicArn": "arn:aws:sns:ap-northeast-1:XXXXXXXX:v1es-log-test-sns-topic",
    "Message": "{\"EventType\":\"TestSNS\"}",
    "Timestamp": "2025-09-24T01:52:44.839Z",
    "UnsubscribeURL": "XXXXXXXX"
}

		

では、次にEICARファイルを配置して、「不正プログラム対策イベント」のイベントを転送してみましょう。
EICARファイルのテストの方法は、下記のブログを参照してください。

Cloud One Workload Security(Deep Security)がRocky Linux OSに対応したのでインストールしてみた#EICARテストファイルを使って検知させてみる

S3に配置されたログファイルを確認します。
EventTypeが「AntiMalwareEvent」のイベントが記録されており、EICARファイルを検知していることがわかります。

			
			{
    "Type": "Notification",
    "MessageId": "07d67e13-f809-5258-9033-1f5eab5b7883",
    "TopicArn": "arn:aws:sns:ap-northeast-1:XXXXXXX:v1es-log-test-sns-topic",
    "Message": "[{\"ATSEDetectionLevel\":0,\"CloudOneAccountID\":\"XXXXXXXX\",\"EngineType\":XXXXXXXX,\"EngineVersion\":\"XXXXXXXX\",\"ErrorCode\":0,\"EventType\":\"AntiMalwareEvent\",\"FileSHA1\":\"XXXXXXXX\",\"HostAgentGUID\":\"XXXXXXXX\",\"HostAgentVersion\":\"XXXXXXXX\",\"HostCloudInstanceTags\":{\"Name\":\"v1es-test-dsa-server\"},\"HostCloudType\":\"amazon\",\"HostGroupID\":39,\"HostGroupName\":\"v1es-test-private-subnet (subnet-03be7c811c4ae2fe4)\",\"HostGUID\":\"XXXXXXXX\",\"HostID\":2,\"HostInstanceID\":\"XXXXXXXX\",\"HostLastIPUsed\":\"XXXXXXXX\",\"Hostname\":\"XXXXXXXX (v1es-test-dsa-server) [i-0c75d96f62fef0944]\",\"HostOS\":\"Amazon Linux 2023 (64 bit) (6.1.150-174.273.amzn2023.x86_64)\",\"HostOwnerID\":\"XXXXXXXX\",\"HostSecurityPolicyID\":34,\"HostSecurityPolicyName\":\"Vision One Endpoint Security Policy\",\"InfectedFilePath\":\"/root/eicar.com.txt\",\"LogDate\":\"2025-09-24T01:57:11.000Z\",\"MajorVirusType\":2,\"MalwareName\":\"Eicar_test_file\",\"MalwareType\":1,\"ModificationTime\":\"2025-09-24T01:57:10.902Z\",\"Origin\":0,\"PatternVersion\":\"XXXXXXXX\",\"Protocol\":0,\"ProcessPid\":XXXXXXXX,\"ProcessImagePath\":\"/usr/bin/curl\",\"Reason\":\"Default Real-Time Scan Configuration\",\"ScanAction1\":4,\"ScanAction2\":3,\"ScanResultAction1\":-81,\"ScanResultAction2\":0,\"ScanType\":0,\"TenantGUID\":\"XXXXXXXX\",\"TenantID\":XXXXXXXX,\"TenantName\":\"XXXXXXXX\",\"UniqueID\":\"XXXXXXXX\",\"EventID\":0,\"Tags\":\"\",\"OriginString\":\"Agent\",\"MajorVirusTypeString\":\"Virus\",\"ScanResultString\":\"Quarantined\",\"ScanTypeString\":\"Real Time\"},{\"ActionBy\":\"システム\",\"Debug\":\"\",\"CloudOneAccountID\":\"XXXXXXXX\",\"EventType\":\"SystemEvent\",\"LogDate\":\"2025-09-24T02:01:47.696Z\",\"ManagerNodeName\":\"hbp00122s-929\",\"ManagerNodeID\":26392,\"Number\":710,\"Origin\":0,\"Severity\":1,\"TargetID\":2,\"TargetName\":\"XXXXXXXX (v1es-test-dsa-server) [XXXXXXXX]\",\"TargetType\":\"Host\",\"TenantGUID\":\"XXXXXXXX\",\"TenantID\":XXXXXXXX,\"TenantName\":\"XXXXXXXX\",\"Title\":\"Events Retrieved\",\"UniqueID\":\"XXXXXXXX\",\"EventID\":0,\"Tags\":\"\",\"OriginString\":\"Agent\",\"Description\":\"Description Omitted\",\"SeverityString\":\"Info\"}]",
    "Timestamp": "2025-09-24T02:01:54.204Z",
    "UnsubscribeURL": "XXXXXXXX"
}

		

さいごに

V1ESのログをS3に送信し、長期保管する方法についてまとめました。
お役に立てれば嬉しいです。

以上、クラウド事業本部の吉田でした!

この記事をシェアする

FacebookHatena blogX

関連記事