
V1ESのログを、SNS + Amazon Data Firehose経由でS3に送信してみた
こんにちは!クラウド事業本部の吉田です。
Vision One使っていますか?
Endpoint Security(Server & Workload Protection)(以降V1ES)のログの保管期限は、ライセンスによりますが最長1年となります。
[Trend Vision One ] Vision One で保存できるログとデータの保持期間について
ログ保管要件によって1年以上保存する必要がある場合は、どこかにログ転送して保管する必要があります。
今回は、SNS + Amazon Data Firehose経由でS3にV1ESをログを送信する方法についてまとめてみました。
構成図
前提
下記のV1ESとAWSの初期構築は完了している前提とします。
完了していない場合は、参考ブログを参照して作業を完了してください。
- V1ESとAWSの連携
- VPCとEC2の構築
- EC2へのV1ESエージェントのインストール
事前準備
V1ES上の設定の前に、AWS環境上でログ転送のために必要なリソースを作成していきます。
通信の流れと逆の方向で、リソースを作成していきます。
- V1ESログ保存S3作成
- Amazon Data Firehose配信ストリーム作成
- SNS作成
- 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バケットを指定します
- それ以外はデフォルト
- S3バケット
- 詳細設定
- サービスアクセス
- IAMロールを作成または更新(デフォルト値)
- それ以外はデフォルト
- サービスアクセス
サービスアクセスロールを自動作成するオプションを選択した場合、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.
その場合は、しばらく待ってから再度作成するようにすると、Amazon Data Firehose配信ストリームが作成できます。
作成された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ポリシーを作成します。
{
"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
という名前で作成します。
信頼ポリシーも、下記の内容で設定してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"sns.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
IAMロールが作成できましたら、次はSNSトピックを作成します。
タイプはスタンダードで、それ以外はデフォルトで作成しました。
トピック名は、v1es-log-test-sns-topic
です。
作成したSNSトピックにサブスクリプションを設定します。
- SNSトピック
- 作成したSNSトピック
- プロトコル
- Amazon Kinesis Data Firehose
- エンドポイント
- Amazon Data FirehoseのArn
- サブスクリプションロールの ARN
- 作成したSNS用のIAMロールのArn
ここまで設定できましたら、SNS→Amazon Data Firehose→S3で疎通ができるか確認しましょう。
作成したトピックの詳細画面に移動すると、「メッセージの発行」というボタンがあります。
クリックしますと、テストメッセージの作成画面に移りますので、適当な内容を入力してテストメッセージを送信します。
しばらく待ちますとS3にログファイルが配置されています。
ログファイルの内容は、下記の通りです。
(わかりやすくするためにフォーマットしています。本来は下記の内容は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ユーザーにアタッチしてください。
{
"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」をクリックします。
画面左上のServer & Workload Protection Managerを、対象のAWSアカウントを管理しているProduct Instanceに切り替えます。
「管理」→「システム設定」→「イベントの転送」の順にクリックします。
「Amazon SNS」セクションで、下記の内容で設定します。
- Amazon Simple Notification Serviceにイベントを公開
- 有効化
- アクセスキー - SNSトピックにアクセスするためのAWSユーザのアクセスキー
- V1ESがSNSトピックにアクセスするためのIAMユーザーのアクセスキー
- 秘密鍵 - SNSトピックにアクセスするためのAWSユーザの秘密鍵
- V1ESがSNSトピックにアクセスするためのIAMユーザーのシークレットキー
- SNSトピックARN
- SNSトピックのArn
- 転送するイベントの種類
- 転送したいイベントを適宜設定
動作確認
設定ができましたら、「資格情報のテストと通知の送信」をクリックして動作確認をします。
クリックすると下記の内容のポップが表示されます
Amazon SNSの資格情報が確認されました。次のイベントタイプでテスト通知が送信されました:「TestSNS」
こちらもしばらく待ちますと、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に送信し、長期保管する方法についてまとめました。
お役に立てれば嬉しいです。
以上、クラウド事業本部の吉田でした!