收集 AWS VPC 流日志
解析器版本:17.0
本文档介绍了如何使用三种不同的方法将 AWS VPC 流日志注入 Google Security Operations:Amazon S3(文本格式)、Amazon CloudWatch Logs(使用 Kinesis Data Firehose)和 Amazon S3 中的 CSV 格式。AWS VPC 流日志是一项功能,可让您捕获有关进出 VPC 网络接口的 IP 流量的信息。通过此集成,您可以将这些日志发送到 Google SecOps 进行分析和监控。
支持的 AWS VPC 流日志格式
Google SecOps 支持以两种主要文本格式注入 AWS VPC 流日志:
- JSON 格式:
AWS_VPC_FLOW日志类型会解析 JSON 格式的日志。在这种格式中,每个日志条目都包含一个键及其对应的值,使数据具有自描述性。 - CSV 格式:Google SecOps 还提供了一个解析器,用于解析 CSV 格式的 AWS VPC 流日志。此格式仅在标题行中列出字段键一次,后续行仅包含以英文逗号分隔的值。
由于 CSV 格式不包含每个日志条目中的字段键,因此 AWS_VPC_FLOW_CSV 解析器依赖于严格、预定义的值顺序。您的 CSV 文件必须遵循以下字段顺序,才能正确解析:
Version,Account_id,Interface_id,Srcaddr,Dstaddr,Srcport,Dstport,Protocol,Packets,Bytes,Start,End,Action,Log_status,Vpc_id,Subnet_id,Instance_id,Tcp_flags,Type,Pkt_srcaddr,Pkt_dstaddr,Region,Az_id,Sublocation_type,Sublocation_id,Pkt_src_aws_service,Pkt_dst_aws_service,Flow_direction,Traffic_path,Ecs_cluster_arn,Ecs_cluster_name,Ecs_container_instance_arn,Ecs_container_instance_id,Ecs_container_id,Ecs_second_container_id,Ecs_service_name,Ecs_task_definition_arn,Ecs_task_arn,Ecs_task_id
以下是 CSV 日志行示例:
7,369096419186,eni-0520bb5efed19d33a,10.119.32.34,10.119.223.3,51256,16020,6,14,3881,1723542839,1723542871,ACCEPT,OK,vpc-0769a6844ce873a6a,subnet-0cf9b2cb32f49f258,i-088d6080f45f5744f,0,IPv4,10.119.32.34,10.119.223.3,ap-northeast-1,apne1-az4,-,-,-,-,ingress,,-,-,-,-,-,-,-,-,-,-
对于没有可用值的字段,应传递空值(例如 , ,),以在 CSV 行中保持正确的位置顺序。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例。
- 对 AWS 的特权访问权限。
选项 1:使用 AWS S3 配置 AWS VPC 流日志导出(文本格式)
以下部分概述了如何配置 Amazon S3 和 Identity and Access Management 权限,以便导出 VPC 流日志供 Google SecOps 分析。
为 Google SecOps 配置 AWS S3 存储桶和 IAM
- 按照以下用户指南创建 Amazon S3 存储桶:创建存储桶。
- 保存存储桶名称和区域(例如
aws-vpc-flowlogs),以供日后参考。 - 按照此用户指南创建用户:创建 IAM 用户。
- 选择创建的用户。
- 选择安全凭证标签页。
- 点击访问密钥部分中的创建访问密钥。
- 选择第三方服务作为用例。
- 点击下一步。
- 可选:添加说明标签。
- 点击创建访问密钥。
- 点击下载 CSV 文件,保存访问密钥和秘密访问密钥,以供日后参考。
- 点击完成。
- 选择权限标签页。
- 点击权限政策部分中的添加权限。
- 选择添加权限。
- 选择直接附加政策。
- 搜索 AmazonS3FullAccess 政策。
- 选择相应政策。
- 点击下一步。
- 点击添加权限。
创建 VPC 流日志(目标:Amazon S3,文本格式)
- 打开 AWS 控制台 > VPC > 您的 VPC/子网/网络接口,然后选择要记录的范围。
- 依次点击操作 > 创建流日志。
- 提供以下配置详细信息:
- 过滤条件:根据您的政策选择全部(或接受/拒绝)。
- 最大汇总间隔:选择 1 分钟(推荐)或 10 分钟。
- 目标:发送到 Amazon S3 存储桶。
- S3 存储桶 ARN:按以下格式输入在上一部分中创建的存储桶名称:
arn:aws:s3:::<your-bucket>。 - 日志记录格式:选择 AWS 默认格式。
- 日志文件格式:选择文本(纯文本)。
- 可选:除非需要,否则请停用 Hive 兼容前缀和每小时分区。
- 点击创建流日志。
在 Google SecOps 中配置 Feed 以注入 AWS VPC 流日志 (S3 Text)
- 依次前往设置 > 数据管理 > Feed。如果您使用的是仅 SIEM 平台,请依次前往设置 > Feed。
- 点击 + 添加新 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
AWS VPC Flow Logs - S3 (Text))。 - 选择 Amazon S3 V2 作为来源类型。
- 选择 AWS VPC Flow 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- S3 URI:输入 S3 存储桶地址(例如
s3://<your-bucket>/AWSLogs/<account-id>/vpcflowlogs/<region>/)。 - 来源删除选项:根据您的偏好选择删除选项。
- 文件保留时间上限:默认 180 天。
- 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
- Secret Access Key:有权访问 S3 存储桶的用户 Secret。
- 资产命名空间:资产命名空间。
- 注入标签:应用于此 Feed 中事件的标签。
- S3 URI:输入 S3 存储桶地址(例如
- 点击下一步。
- 在最终确定界面中查看新的新闻信息流配置,然后点击提交。
选项 2:使用 Amazon CloudWatch Logs 和 Kinesis Data Firehose 配置 AWS VPC 流日志导出
设置流日志以传输到 CloudWatch 后,此选项会使用 Kinesis Data Firehose 将该日志数据流式传输到您选择的目标位置,从而提供额外的数据导出层。
创建 VPC 流日志(目标:Amazon CloudWatch Logs)
- 打开 AWS 控制台 > VPC > 您的 VPC/子网/网络接口。
- 依次点击操作 > 创建流日志。
- 提供以下配置详细信息:
- 过滤条件:根据您的政策选择全部(或接受/拒绝)。
- 最大汇总间隔:选择 1 分钟(推荐)或 10 分钟。
- Destination:选择 Send to CloudWatch Logs。
- 目标日志组:选择或创建日志组(例如
/aws/vpc/flowlogs)。 - IAM 角色:选择一个可以写入 CloudWatch Logs 的角色。
- 日志记录格式:选择 AWS 默认(版本 2)或自定义(包含其他字段)。
- 点击创建流日志。
在 Google SecOps 中创建 Feed,以获取端点网址和密钥
- 依次前往设置 > 数据管理 > Feed。如果您使用的是仅 SIEM 平台,请依次前往设置 > Feed。
- 点击 + 添加新 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
AWS VPC Flow Logs - CloudWatch via Firehose)。 - 选择 Amazon Data Firehose 作为来源类型。
- 选择 AWS VPC Flow 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- 拆分定界符:可选
n。 - 资产命名空间:资产命名空间(例如
aws.vpc.flowlogs.cwl)。 - 提取标签:要应用于此 Feed 中事件的标签(例如
source=vpc_flow_firehose)。
- 拆分定界符:可选
- 点击下一步。
- 检查 Feed 配置,然后点击提交。
- 点击生成密钥,生成用于对此 Feed 进行身份验证的密钥。
- 复制并保存密钥,因为您无法再次查看此密钥。
- 点击详细信息标签页。
- 从端点信息字段中复制 Feed 端点网址。
- 点击完成。
为 Amazon Data Firehose Feed 创建 API 密钥
- 前往 Google Cloud 控制台的凭据页面。
- 点击创建凭证,然后选择 API 密钥。
- 复制密钥并将其保存在安全的位置。
- 限制 API 密钥对 Google SecOps API 的访问权限。
为 CloudWatch Logs to Firehose 配置 IAM 权限
- 在 AWS 控制台中,依次前往 IAM > 政策 > 创建政策 > JSON。
粘贴以下政策 JSON,并将
<region>和<account-id>替换为您的 AWS 区域和账号 ID:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch" ], "Resource": "arn:aws:firehose:<region>:<account-id>:deliverystream/cwlogs-to-secops" } ] }将政策命名为
CWLtoFirehoseWrite,然后点击创建政策。依次前往 IAM > 角色 > 创建角色。
选择自定义信任政策,然后粘贴:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<region>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }将政策
CWLtoFirehoseWrite附加到角色。将角色命名为
CWLtoFirehoseRole,然后点击创建角色。
配置 Amazon Kinesis Data Firehose 到 Google SecOps
- 在 AWS 控制台中,依次前往 Kinesis > Data Firehose > Create delivery stream(创建传送流)。
- 提供以下配置详细信息:
- 来源:选择直接 PUT 或其他来源。
- 目标:选择 HTTP 端点。
- 名称:
cwlogs-to-secops - HTTP 端点网址:输入 Google SecOps 中的 Feed HTTPS 端点网址,并附加 API 密钥:
<ENDPOINT_URL>?key=<API_KEY> - HTTP 方法:选择 POST。
- 在访问密钥下:
- 输入在 Google SecOps Feed 中生成的密钥(这会成为
X-Amz-Firehose-Access-Key标头)。 - 缓冲提示:设置缓冲区空间 = 1 MiB,缓冲间隔 = 60 秒。
- 压缩:选择已停用。
- S3 备份:选择已停用。
- 将重试和日志记录设置保留为默认。
- 输入在 Google SecOps Feed 中生成的密钥(这会成为
- 点击创建传送流。
为 CloudWatch Logs 组订阅 Firehose 流
- 依次前往 CloudWatch > 日志 > 日志组。
- 选择目标日志组(例如
/aws/vpc/flowlogs)。 - 打开订阅过滤条件标签页,然后点击创建。
- 选择创建 Amazon Kinesis Data Firehose 订阅过滤器。
- 提供以下配置详细信息:
- Destination(目标):选择传送流
cwlogs-to-secops。 - 授予权限:选择角色
CWLtoFirehoseRole。 - 过滤器名称:输入
all-events。 - 过滤条件模式:留空即可发送所有事件。
- Destination(目标):选择传送流
- 点击开始直播。
方案 3:使用 Amazon S3 配置 CSV 格式的 AWS VPC 流日志
将日志转换为 CSV 格式(可选)
- 确保 CSV 行遵循严格、一致的列顺序,与您在 VPC 流日志自定义格式中选择的字段(例如规范 v2 字段集或 v5/v7 集)相匹配。除非解析器选项要求,否则请勿在生产文件中添加标题行。
- 将 CSV 文件写入稳定的前缀,例如:
s3://<your-bucket>/vpcflowlogs-csv/<region>/year=<year>/month=<month>/day=<day>/。
在 Google SecOps 中配置 Feed 以注入 AWS VPC 流日志 (CSV)
- 依次前往设置 > 数据管理 > Feed。如果您使用的是仅 SIEM 平台,请依次前往设置 > Feed。
- 点击 + 添加新 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
AWS VPC Flow Logs - S3 (CSV))。 - 选择 Amazon S3 V2 作为来源类型。
- 选择 AWS VPC Flow (CSV) 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- S3 URI:输入 S3 存储桶地址(例如
s3://<your-bucket>/vpcflowlogs-csv/<region>/)。 - 来源删除选项:根据您的偏好选择删除选项。
- 文件保留时间上限:默认 180 天。
- 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
- Secret Access Key:有权访问 S3 存储桶的用户 Secret。
- 资产命名空间:资产命名空间。
- 注入标签:应用于此 Feed 中事件的标签。
- S3 URI:输入 S3 存储桶地址(例如
- 点击下一步。
- 在最终确定界面中查看新的新闻信息流配置,然后点击提交。
UDM 映射表
| 日志示例 | 日志字段 | UDM 映射 |
|---|---|---|
"entries: {
data: ""7,11111111111,eni-11aa1a1a1a1aa1a,1.1.1.1,2.2.2.2,51256,16020,6,14,3881,1723542839,1723542871,ACCEPT,OK,vpc-1aa1a1a1a1aa1aa,subnet-1aa1a1a1a1aa1a1,i-1aa1a1a1a1aa1a,0,IPv4,1.1.1.1,2.2.2.2,ap-northeast-1,masked_zone,-,-,-,-,ingress,,-,-,-,-,-,-,-,-,-,-""
collection_time: {
seconds: 1741159282
nanos: 254633949
}
}" |
7 |
metadata.product_version |
11111111111 |
metadata.product_log_id |
|
eni-11aa1a1a1a1aa1a |
principal.user.product_object_id |
|
1.1.1.1 |
principal.ip |
|
2.2.2.2 |
target.ip |
|
51256 |
principal.port |
|
16020 |
target.port |
|
6 |
network.ip_protocol |
|
14 |
network.sent_packets |
|
3881 |
network.received_bytes |
|
1723542839 |
metadata.event_timestamp about.resource.attribute.labels(start_time) |
|
1723542871 |
metadata.ingested_timestamp about.resource.attribute.labels(end_time) |
|
ACCEPT |
security_result.action security_result.action_details |
|
OK |
about.resource.attribute.labels (log-status) |
|
vpc-1aa1a1a1a1aa1a |
principal.resource.attribute.labels (vpcID) |
|
subnet-a1a1a1a1a1 |
principal.asset_id |
|
i-1aa1a1a1a1aa1a |
principal.resource_ancestors.product_object_id |
|
0 |
about.resource.attribute.labels (type) |
|
IPv4 |
additional.fields (pkt-srcaddr-ip) |
|
1.1.1.1 |
intermediary.ip |
|
2.2.2.2 |
additional.fields (tcp_flags) |
|
ap-northeast-1 |
not getting mapped |
|
masked_zone |
not getting mapped |
|
- |
about.resource.attribute.labels (sublocation_type) |
|
- |
about.resource.attribute.labels (sublocation_id) |
|
- |
about.resource.attribute.labels (pkt_src_aws_service) |
|
- |
about.resource.attribute.labels (pkt_dst_aws_service) |
|
ingress |
network.direction |
|
|
additional.fields (traffic_path) |
|
- |
not getting mapped |
|
- |
not getting mapped- |
|
"entries: {
data: ""7,11111111111,eni-11aa1a1a1a1aa1a,5.5.5.5,2.2.2.2,53102,16020,6,8,2112,1723542839,1723542871,ACCEPT,OK,vpc-1aa1a1a1a1aa1a,subnet-1aa1a1a1a1aa1a,i-1aa1a1a1a1aa1a,0,IPv4,5.5.5.5,2.2.2.2,ap-northeast-1,masked_zone,-,-,-,-,ingress,,-,-,-,-,-,-,-,-,-,-""
collection_time: {
seconds: 1741159390
nanos: 374934225
}
}" |
7 |
metadata.product_version |
11111111111 |
metadata.product_log_id |
|
eni-11aa1a1a1a1aa1a |
principal.user.product_object_id |
|
5.5.5.5 |
principal.ip |
|
2.2.2.2 |
target.ip |
|
53102 |
principal.port |
|
16020 |
target.port |
|
6 |
network.ip_protocol |
|
8 |
network.sent_packets |
|
2112 |
network.received_bytes |
|
1723542839 |
metadata.event_timestamp about.resource.attribute.labels(start_time) |
|
1723542871 |
metadata.ingested_timestamp about.resource.attribute.labels(end_time) |
|
ACCEPT |
security_result.action security_result.action_details |
|
OK |
about.resource.attribute.labels (log-status) |
|
vpc-1aa1a1a1a1aa1a |
principal.resource.attribute.labels (vpcID) |
|
subnet-1aa1a1a1a1aa1a |
principal.asset_id |
|
i-1aa1a1a1a1aa1a |
principal.resource_ancestors.product_object_id |
|
0 |
about.resource.attribute.labels (type) |
|
IPv4 |
additional.fields (pkt-srcaddr-ip) |
|
5.5.5.5 |
intermediary.ip |
|
2.2.2.2 |
additional.fields (tcp_flags) |
|
ap-northeast-1 |
not getting mapped |
|
masked_zone |
not getting mapped |
|
- |
about.resource.attribute.labels (sublocation_type) |
|
- |
about.resource.attribute.labels (sublocation_id) |
|
- |
about.resource.attribute.labels (pkt_src_aws_service) |
|
- |
about.resource.attribute.labels (pkt_dst_aws_service) |
|
ingress |
network.direction |
|
|
additional.fields (traffic_path) |
|
- |
not getting mapped |
|
- |
not getting mapped1 |
|
"entries: {
data: ""7,11111111111,eni-11aa1a1a1a1aa1a,1.1.2.2,1.1.2.1,36358,42659,6,1091,3.754327e+06,1747981553,1747981582,ACCEPT,OK,vpc-1aa1a1a1a1aa1a,subnet-1aa1a1a1a1aa1a,i-1aa1a1a1a1aa1a,0,IPv4,1.1.2.2,1.1.2.1,ap-northeast-1,apne1-az1,-,-,-,-,egress,1,-,-,-,-,-,-,-,-,-,-,604249""
collection_time: {
seconds: 1748238552
nanos: 479960397
}
}" |
7 |
metadata.product_version |
11111111111 |
metadata.product_log_id |
|
eni-11aa1a1a1a1aa1a |
about.resource.attribute.labels |
|
1.1.2.2 |
principal.ip |
|
1.1.2.1 |
target.ip |
|
36358 |
principal.port |
|
42659 |
target.port |
|
6 |
network.ip_protocol |
|
1091 |
network.sent_packets |
|
3.75E+06 |
network.sent_bytes |
|
1747981553 |
metadata.event_timestamp about.resource.attribute.labels(start_time) |
|
1747981582 |
metadata.ingested_timestamp about.resource.attribute.labels(end_time) |
|
ACCEPT |
security_result.action security_result.action_details |
|
OK |
about.resource.attribute.labels (log-status) |
|
vpc-1aa1a1a1a1aa1a |
principal.resource.attribute.labels (vpcID) |
|
subnet-1aa1a1a1a1aa1a |
principal.asset_id |
|
i-1aa1a1a1a1aa1a |
principal.resource_ancestors.product_object_id |
|
0 |
additional.fields (tcp_flags) |
|
IPv4 |
about.resource.attribute.labels(type) |
|
1.1.2.2 |
"additional.fields (pkt-srcaddr-ip)条件: if [pkt_dstaddr_ip] != [dstaddr] will map to intermediary.ip" |
|
1.1.2.1 |
"additional.fields (pkt-dstaddr-ip)条件: if [pkt_srcaddr_ip] != [srcaddr] will map to intermediary.ip" |
|
ap-northeast-1 |
principal.location.country_or_region |
|
apne1-az1 |
principal.location.name |
|
- |
about.resource.attribute.labels (sublocation_type) |
|
- |
about.resource.attribute.labels (sublocation_id) |
|
- |
about.resource.attribute.labels (pkt_src_aws_service) |
|
- |
about.resource.attribute.labels (pkt_dst_aws_service) |
|
egress |
network.direction |
|
1 |
additional.fields (traffic_path) |
|
- |
not getting mapped |
|
604249 |
not getting mapped |
|
Connection_info.Tcp_flags |
additional.fields |
|
connection_info.tcp_flags |
additional.fields |
|
Dst_endpoint.Interface_uid |
target.user.product_object_id |
|
Log_status |
additional.fields |
|
Src_endpoint.Instance_uid |
principal.user.product_object_id |
|
Tcp_flags |
additional.fields |
|
tcp_flags |
additional.fields |
|
tgw_dst_az_id |
target.resource.attribute.cloud.availability_zone |
|
tgw_id |
target.resource.product_object_id |
|
tgw_src_az_id |
principal.location.name |
|
Traffic_Bytes |
network.sent_bytes |
|
Traffic_Packets |
network.sent_packets |
版本增量
Google SecOps 发布了 AWS VPC 流日志解析器 16.0 版,其中对 Parser_Name 日志字段到 UDM 字段的映射以及事件类型的映射进行了重大更改。
日志字段映射增量
| 日志字段 | 旧映射 | 当前映射 |
|---|---|---|
bytes |
network.sent_bytes |
Removed |
Connection_info.Tcp_flags |
network.dhcp.flags |
additional.fields |
connection_info.tcp_flags |
network.dhcp.flags |
additional.fields |
Dst_endpoint.Interface_uid |
additional.fields |
target.user.product_object_id |
flow_direction |
about.resource.attribute.labels |
Removed |
Log_status |
about.resource.attribute.labels |
additional.fields |
Src_endpoint.Instance_uid |
additional.fields |
principal.user.product_object_id |
Tcp_flags |
network.dhcp.flags |
additional.fields |
tcp_flags |
network.dhcp.flags |
additional.fields |
tgw_dst_az_id |
target.resource.attribute.labels |
target.resource.attribute.cloud.availability_zone |
tgw_id |
additional.fields |
target.resource.product_object_id |
tgw_src_az_id |
principal.resource.attribute.labels |
principal.location.name |
Traffic_Bytes |
additional.fields |
network.sent_bytes |
Traffic_Packets |
additional.fields |
network.sent_packets |
事件类型映射增量
之前被归为一般类别的多个事件现在已正确归入有意义的事件类型。
| 事件类型 | 日志中的字段 | 原因 |
|---|---|---|
| FILE_UNCATEGORIZED | Bytes |
此 PR 中新处理了该事件,并将其映射到适当的特定事件类型 |
| NETWORK_CONNECTION | protocol |
此 PR 中新处理了该事件,并将其映射到适当的特定事件类型 |
| NETWORK_UNCATEGORIZED | Class_name |
此 PR 中新处理了该事件,并将其映射到适当的特定事件类型 |
| NETWORK_UNCATEGORIZED | flow_direction |
此 PR 中新处理了该事件,并将其映射到适当的特定事件类型 |
| STATUS_UPDATE | [src_endpoint][ip] |
此 PR 中新处理了该事件,并将其映射到适当的特定事件类型 |