收集 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>
    

要进行验证,请执行以下操作:

  1. AWS 管理控制台中,依次前往 CloudWatch > 日志 > 日志组
  2. 搜索 /aws/lambda/
  3. 确认您要注入日志的每个 Lambda 函数都存在对应的日志组。

配置 AWS S3 存储桶

  1. 按照本用户指南创建 Amazon S3 存储桶创建存储桶
  2. 保存存储桶名称区域以供日后参考(例如 lambda-logs-to-secops)。

为 Amazon Data Firehose 配置 IAM 角色

Amazon Data Firehose 需要 IAM 角色才能将日志写入您的 S3 存储桶。

创建 IAM 政策

  1. AWS 控制台中,依次前往 IAM > 政策 > 创建政策
  2. 选择 JSON 标签页。
  3. 粘贴以下政策(将 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:*"
            }
        ]
    }
    
  4. 点击下一步

  5. 政策名称字段中,输入 LambdaLogsFirehoseS3Policy

  6. 点击创建政策

创建 IAM 角色

  1. 依次前往 IAM > 角色 > 创建角色
  2. 选择自定义信任政策
  3. 粘贴以下信任政策:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "firehose.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    
  4. 点击下一步

  5. 搜索并选择 LambdaLogsFirehoseS3Policy

  6. 点击下一步

  7. 角色名称字段中,输入 LambdaLogsFirehoseToS3Role

  8. 点击 Create role

创建 Amazon Data Firehose 流

  1. 访问 https://console.aws.amazon.com/kinesis,打开 Kinesis 控制台
  2. 在导航窗格中,选择 Amazon Data Firehose
  3. 点击创建 Firehose 数据流
  4. 选择来源和目标下,提供以下配置:
    • 来源:选择 Direct PUT
    • 目标:选择 Amazon S3
  5. Firehose 流名称字段中,输入 lambda-logs-to-secops
  6. 转换记录下,在从 Amazon CloudWatch Logs 解压缩源记录部分中:

    1. 选择开启解压缩
    2. 请勿选择启用消息提取功能
  7. 目标设置下:

    • S3 存储桶:选择 S3 存储桶 lambda-logs-to-secops
    • S3 存储桶前缀(可选):输入 lambda-logs/
    • S3 存储桶错误输出前缀(可选):输入 firehose-errors/
  8. 缓冲区提示下:

    • 缓冲区空间5 MiB(默认)。
    • 缓冲区间300 秒(默认)。
  9. 高级设置下:

    • 服务器端加密:可选。如果需要加密,请启用此功能。
    • 错误日志记录:选择已启用(推荐)。
    • 权限:选择选择现有 IAM 角色,然后选择 LambdaLogsFirehoseToS3Role
  10. 点击创建 Firehose 数据流

  11. 等待数据流状态显示为有效

为 CloudWatch Logs 配置 IAM 角色

CloudWatch Logs 需要 IAM 角色才能将日志数据发送到 Firehose 流。

创建 IAM 政策

  1. 依次前往 IAM > 政策 > 创建政策
  2. 选择 JSON 标签页。
  3. 粘贴以下政策(将 <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"
            }
        ]
    }
    
  4. 点击下一步

  5. 政策名称字段中,输入 LambdaLogsCWLtoFirehosePolicy

  6. 点击创建政策

创建 IAM 角色

  1. 依次前往 IAM > 角色 > 创建角色
  2. 选择自定义信任政策
  3. 粘贴以下信任政策(将 <region> 替换为您的 AWS 区域):

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "logs.<region>.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    
  4. 点击下一步

  5. 搜索并选择 LambdaLogsCWLtoFirehosePolicy

  6. 点击下一步

  7. 角色名称字段中,输入 LambdaLogsCWLtoFirehoseRole

  8. 点击 Create role

创建 CloudWatch Logs 订阅过滤条件

  1. AWS 管理控制台中,依次前往 CloudWatch > 日志 > 日志组
  2. 选择日志组 /aws/lambda/<function-name>
  3. 选择订阅过滤条件标签页。
  4. 依次点击创建 > 创建 Amazon Data Firehose 订阅过滤器
  5. 提供以下配置详细信息:
    • 目标:选择 Firehose 流 lambda-logs-to-secops
    • 授予权限:选择角色 LambdaLogsCWLtoFirehoseRole
    • 订阅过滤条件名称:输入一个描述性名称(例如 lambda-logs-to-secops-filter)。
    • 日志格式:选择其他
    • 订阅过滤模式:留空可发送所有 Lambda 函数日志事件。
  6. 点击开始直播

为 Google SecOps 配置 IAM 用户

Google SecOps 需要一个有权访问 S3 存储桶的 IAM 用户来注入交付的日志。

  1. 按照以下用户指南创建用户创建 IAM 用户
  2. 选择创建的用户
  3. 选择安全凭据标签页。
  4. 访问密钥部分中,点击创建访问密钥
  5. 选择第三方服务作为使用情形
  6. 点击下一步
    • 可选:添加说明标记。
  7. 点击创建访问密钥
  8. 点击下载 .csv 文件以保存访问密钥密钥,供日后参考。
  9. 点击完成
  10. 选择权限标签页。
  11. 权限政策部分中,点击添加权限
  12. 选择添加权限
  13. 选择直接附加政策
  14. 搜索 AmazonS3FullAccess 政策。
  15. 选择相应政策。
  16. 点击下一步
  17. 点击添加权限

在 Google SecOps 中配置 Feed 以注入 AWS Lambda 函数日志

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 在下一页上,点击配置单个 Feed
  4. Feed 名称输入一个唯一名称。
  5. 选择 Amazon S3 V2 作为来源类型
  6. 选择 AWS Lambda 函数作为日志类型
  7. 点击下一步,然后点击提交
  8. 为以下字段指定值:
    • S3 URIs3://lambda-logs-to-secops/lambda-logs/
    • 来源删除选项:根据您的偏好选择删除选项
    • 文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)
    • 访问密钥 ID:有权访问 S3 存储桶的用户访问密钥
    • 私有访问密钥:具有 S3 存储桶访问权限的用户私有密钥
    • 资产命名空间资产命名空间
    • 注入标签:要应用于此 Feed 中事件的标签
  9. 点击下一步,然后点击提交

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 已映射:trueAUTHTYPE_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 已映射:trueUSER_LOGINtrueNETWORK_HTTPtrueNETWORK_CONNECTION、`true...
has_principal_user metadata.event_type 已映射:trueUSER_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 已映射:InformationalINFORMATIONAL
severity security_result.severity 已映射:INFOINFORMATIONAL
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 专业人士的解答。