收集 AWS Lambda 函数日志
本文档介绍了如何使用 Amazon S3 将 AWS Lambda 函数日志注入到 Google Security Operations。
AWS Lambda 是一项无服务器计算服务,可运行您的代码来响应事件,并自动管理底层计算资源。Lambda 会自动将所有函数日志(平台日志、扩展日志和应用输出)发送到 Amazon CloudWatch Logs,并为每个函数创建一个日志组。此集成使用 Amazon Data Firehose 将 Lambda 日志事件从 CloudWatch Logs 流式传输到 S3 存储桶,然后 Google SecOps 使用 Amazon S3 V2 Feed 提取这些事件。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- 对 AWS 管理控制台的特权访问权限,并拥有以下管理权限:
- AWS Lambda(函数、日志记录配置)
- Amazon CloudWatch Logs(日志组、订阅过滤器)
- Amazon Data Firehose(传送流)
- Amazon S3(存储分区)
- AWS IAM(角色、政策、用户)
验证 Lambda 函数的 CloudWatch Logs 日志组
AWS Lambda 在首次调用函数时,会自动为每个函数创建一个 CloudWatch Logs 日志组。默认日志组命名惯例如下:
/aws/lambda/<function-name>
要进行验证,请执行以下操作:
- 在 AWS 管理控制台中,依次前往 CloudWatch > 日志 > 日志组。
- 搜索
/aws/lambda/。 确认您要注入日志的每个 Lambda 函数都存在对应的日志组。
配置 AWS S3 存储桶
- 按照本用户指南创建 Amazon S3 存储桶:创建存储桶。
- 保存存储桶名称和区域以供日后参考(例如
lambda-logs-to-secops)。
为 Amazon Data Firehose 配置 IAM 角色
Amazon Data Firehose 需要 IAM 角色才能将日志写入您的 S3 存储桶。
创建 IAM 政策
- 在 AWS 控制台中,依次前往 IAM > 政策 > 创建政策。
- 选择 JSON 标签页。
粘贴以下政策(将
lambda-logs-to-secops替换为您的实际存储桶名称):{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3Delivery", "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::lambda-logs-to-secops", "arn:aws:s3:::lambda-logs-to-secops/*" ] }, { "Sid": "CloudWatchLogging", "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/kinesisfirehose/lambda-logs-to-secops:log-stream:*" } ] }点击下一步。
在政策名称字段中,输入
LambdaLogsFirehoseS3Policy。点击创建政策。
创建 IAM 角色
- 依次前往 IAM > 角色 > 创建角色。
- 选择自定义信任政策。
粘贴以下信任政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }点击下一步。
搜索并选择 LambdaLogsFirehoseS3Policy。
点击下一步。
在角色名称字段中,输入
LambdaLogsFirehoseToS3Role。点击 Create role。
创建 Amazon Data Firehose 流
- 访问 https://console.aws.amazon.com/kinesis,打开 Kinesis 控制台。
- 在导航窗格中,选择 Amazon Data Firehose。
- 点击创建 Firehose 数据流。
- 在选择来源和目标下,提供以下配置:
- 来源:选择 Direct PUT。
- 目标:选择 Amazon S3。
- 在 Firehose 流名称字段中,输入
lambda-logs-to-secops。 在转换记录下,在从 Amazon CloudWatch Logs 解压缩源记录部分中:
- 选择开启解压缩。
- 请勿选择启用消息提取功能。
在目标设置下:
- S3 存储桶:选择 S3 存储桶
lambda-logs-to-secops。 - S3 存储桶前缀(可选):输入
lambda-logs/。 - S3 存储桶错误输出前缀(可选):输入
firehose-errors/。
- S3 存储桶:选择 S3 存储桶
在缓冲区提示下:
- 缓冲区空间:
5MiB(默认)。 - 缓冲区间:
300秒(默认)。
- 缓冲区空间:
在高级设置下:
- 服务器端加密:可选。如果需要加密,请启用此功能。
- 错误日志记录:选择已启用(推荐)。
- 权限:选择选择现有 IAM 角色,然后选择
LambdaLogsFirehoseToS3Role。
点击创建 Firehose 数据流。
等待数据流状态显示为有效。
为 CloudWatch Logs 配置 IAM 角色
CloudWatch Logs 需要 IAM 角色才能将日志数据发送到 Firehose 流。
创建 IAM 政策
- 依次前往 IAM > 政策 > 创建政策。
- 选择 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/lambda-logs-to-secops" } ] }点击下一步。
在政策名称字段中,输入
LambdaLogsCWLtoFirehosePolicy。点击创建政策。
创建 IAM 角色
- 依次前往 IAM > 角色 > 创建角色。
- 选择自定义信任政策。
粘贴以下信任政策(将
<region>替换为您的 AWS 区域):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<region>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }点击下一步。
搜索并选择 LambdaLogsCWLtoFirehosePolicy。
点击下一步。
在角色名称字段中,输入
LambdaLogsCWLtoFirehoseRole。点击 Create role。
创建 CloudWatch Logs 订阅过滤条件
- 在 AWS 管理控制台中,依次前往 CloudWatch > 日志 > 日志组。
- 选择日志组
/aws/lambda/<function-name>。 - 选择订阅过滤条件标签页。
- 依次点击创建 > 创建 Amazon Data Firehose 订阅过滤器。
- 提供以下配置详细信息:
- 目标:选择 Firehose 流
lambda-logs-to-secops。 - 授予权限:选择角色
LambdaLogsCWLtoFirehoseRole。 - 订阅过滤条件名称:输入一个描述性名称(例如
lambda-logs-to-secops-filter)。 - 日志格式:选择其他。
- 订阅过滤模式:留空可发送所有 Lambda 函数日志事件。
- 目标:选择 Firehose 流
点击开始直播。
为 Google SecOps 配置 IAM 用户
Google SecOps 需要一个有权访问 S3 存储桶的 IAM 用户来注入交付的日志。
- 按照以下用户指南创建用户:创建 IAM 用户。
- 选择创建的用户。
- 选择安全凭据标签页。
- 在访问密钥部分中,点击创建访问密钥。
- 选择第三方服务作为使用情形。
- 点击下一步。
- 可选:添加说明标记。
- 点击创建访问密钥。
- 点击下载 .csv 文件以保存访问密钥和密钥,供日后参考。
- 点击完成。
- 选择权限标签页。
- 在权限政策部分中,点击添加权限。
- 选择添加权限。
- 选择直接附加政策。
- 搜索 AmazonS3FullAccess 政策。
- 选择相应政策。
- 点击下一步。
- 点击添加权限。
在 Google SecOps 中配置 Feed 以注入 AWS Lambda 函数日志
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 在下一页上,点击配置单个 Feed。
- 为Feed 名称输入一个唯一名称。
- 选择 Amazon S3 V2 作为来源类型。
- 选择 AWS Lambda 函数作为日志类型。
- 点击下一步,然后点击提交。
- 为以下字段指定值:
- S3 URI:
s3://lambda-logs-to-secops/lambda-logs/ - 来源删除选项:根据您的偏好选择删除选项
- 文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)
- 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥
- 私有访问密钥:具有 S3 存储桶访问权限的用户私有密钥
- 资产命名空间:资产命名空间
- 注入标签:要应用于此 Feed 中事件的标签
- S3 URI:
- 点击下一步,然后点击提交。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
Activity_id_label |
additional.fields |
已合并 |
Arrays_label |
additional.fields |
已合并 |
Name_label |
additional.fields |
已合并 |
Type_1_label |
additional.fields |
已合并 |
Type_id_label |
additional.fields |
已合并 |
Type_label |
additional.fields |
已合并 |
Uid_label |
additional.fields |
已合并 |
Uid_label_1 |
additional.fields |
已合并 |
Value_label |
additional.fields |
已合并 |
__type_label |
additional.fields |
已合并 |
attempts_label |
additional.fields |
已合并 |
class_name_label |
additional.fields |
已合并 |
contentType_label |
additional.fields |
已合并 |
env_label |
additional.fields |
已合并 |
extendedRequestId_label |
additional.fields |
已合并 |
feature_name_label |
additional.fields |
已合并 |
line_number_label |
additional.fields |
已合并 |
logType_label |
additional.fields |
已合并 |
product_name_label |
additional.fields |
已合并 |
requestid_label |
additional.fields |
已合并 |
sourceAccount_label |
additional.fields |
已合并 |
stack_label |
additional.fields |
已合并 |
totalRetryDelay_label |
additional.fields |
已合并 |
vendor_name_label |
additional.fields |
已合并 |
version_label |
additional.fields |
已合并 |
has_principal |
extensions.auth.type |
已映射:true → AUTHTYPE_UNSPECIFIED |
description |
metadata.description |
直接映射 |
file_desc |
metadata.description |
直接映射 |
Time |
metadata.event_timestamp |
解析为 UNIX |
time |
metadata.event_timestamp |
解析为 yyyy-MM-ddTHH:mm:ss.SSSZ |
has_principal |
metadata.event_type |
已映射:true → USER_LOGIN、true → NETWORK_HTTP、true → NETWORK_CONNECTION、`true... |
has_principal_user |
metadata.event_type |
已映射:true → USER_RESOURCE_ACCESS |
Api.Operation |
metadata.product_event_type |
直接映射 |
name |
metadata.product_event_type |
直接映射 |
Api.Request.Uid |
metadata.product_log_id |
直接映射 |
id |
metadata.product_log_id |
直接映射 |
meta_data.requestId |
metadata.product_log_id |
直接映射 |
Metadata.Version |
metadata.product_version |
直接映射 |
version |
metadata.product_version |
直接映射 |
meta_data.httpStatusCode |
network.http.response_code |
直接映射 |
Http_request.User_agent |
network.http.user_agent |
直接映射 |
Actor.Invoked_by |
principal.administrative_domain |
直接映射 |
Src_endpoint.Domain |
principal.asset.hostname |
直接映射 |
Src_endpoint.Domain |
principal.hostname |
直接映射 |
Cloud.Region |
principal.resource.attribute.cloud.availability_zone |
直接映射 |
Actor.User.Name |
principal.user.userid |
直接映射 |
Status |
security_result.action_details |
直接映射 |
Category_name |
security_result.category_details |
已合并 |
error |
security_result.description |
直接映射 |
errorMessage |
security_result.description |
直接映射 |
Metadata_uid_label |
security_result.detection_fields |
已合并 |
category_uid_label |
security_result.detection_fields |
已合并 |
class_uid_label |
security_result.detection_fields |
已合并 |
errorType_label |
security_result.detection_fields |
已合并 |
event_code_label |
security_result.detection_fields |
已合并 |
fault_label |
security_result.detection_fields |
已合并 |
functionName_label |
security_result.detection_fields |
已合并 |
severity_id_label |
security_result.detection_fields |
已合并 |
sourceArn_label |
security_result.detection_fields |
已合并 |
type_name_label |
security_result.detection_fields |
已合并 |
type_uid_label |
security_result.detection_fields |
已合并 |
user_type_label |
security_result.detection_fields |
已合并 |
Severity |
security_result.severity |
已映射:Informational → INFORMATIONAL |
severity |
security_result.severity |
已映射:INFO → INFORMATIONAL |
msg |
security_result.summary |
直接映射 |
Api.Service.Name |
target.application |
直接映射 |
service |
target.application |
直接映射 |
size |
target.file.size |
直接映射 |
filename |
target.process.file.full_path |
直接映射 |
Activity_name |
target.resource.name |
直接映射 |
targetVar |
target.resource.name |
直接映射 |
| 不适用 | extensions.auth.type |
常量:AUTHTYPE_UNSPECIFIED |
| 不适用 | metadata.event_type |
常量:USER_UNCATEGORIZED |
| 不适用 | metadata.product_name |
常量:AWS_Lambda_Function |
| 不适用 | metadata.vendor_name |
常量:AWS_Lambda_Function |
| 不适用 | principal.resource.attribute.cloud.environment |
常量:AMAZON_WEB_SERVICES |
| 不适用 | security_result.severity |
常量:INFORMATIONAL |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。