收集 AWS VPC 流日志
解析器版本:17.0
本文档介绍了如何使用三种不同的方法将 AWS VPC 流日志注入到 Google Security Operations:Amazon S3(文本格式)、Amazon CloudWatch Logs with 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 文本)
- 前往 SIEM 设置 > Feed。
- 点击 + 添加新 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
AWS VPC Flow Logs - S3 (Text))。 - 选择 Amazon S3 V2 作为来源类型。
- 选择 AWS VPC 流作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- 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 分钟。
- 目标位置:选择发送到 CloudWatch Logs。
- 目标日志组:选择或创建日志组(例如
/aws/vpc/flowlogs)。 - IAM 角色:选择可写入 CloudWatch Logs 的角色。
- 日志记录格式:选择 AWS 默认(版本 2)或自定义(包含其他字段)。
- 点击创建流日志。
在 Google SecOps 中创建 Feed 以获取端点网址和密钥
- 前往 SIEM 设置 > Feed。
- 点击 + 添加新 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
AWS VPC Flow Logs - CloudWatch via Firehose)。 - 选择 Amazon Data Firehose 作为来源类型。
- 选择 AWS VPC 流作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- 拆分定界符:可选
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 > 角色 > 创建角色。
选择 Custom trust policy(自定义信任政策),然后粘贴:
{ "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 > 创建交付流。
- 提供以下配置详细信息:
- 来源:选择直接 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 订阅过滤器。
- 提供以下配置详细信息:
- 目标:选择交付数据流
cwlogs-to-secops。 - 授予权限:选择角色
CWLtoFirehoseRole。 - 过滤条件名称:输入
all-events。 - 过滤条件模式:留空即可发送所有事件。
- 目标:选择交付数据流
- 点击开始直播。
方案 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)
- 前往 SIEM 设置 > Feed。
- 点击 + 添加新 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
AWS VPC Flow Logs - S3 (CSV))。 - 选择 Amazon S3 V2 作为来源类型。
- 选择 AWS VPC 流 (CSV) 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- S3 URI:输入 S3 存储桶地址(例如
s3://<your-bucket>/vpcflowlogs-csv/<region>/)。 - 源删除选项:根据您的偏好选择删除选项。
- 文件存在时间上限:默认 180 天。
- 访问密钥 ID:具有 S3 存储桶访问权限的用户访问密钥。
- 私有访问密钥:具有 S3 存储桶访问权限的用户私有密钥。
- 资源命名空间:资源命名空间。
- 注入标签:应用于此 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 中新处理了该问题,并将其映射到适当的特定事件类型 |
更新日志
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。