收集 AWS IAM 日志

支持的语言:

本文档介绍了如何将 AWS IAM 日志注入到 Google Security Operations 中。解析器会将原始 JSON 格式的日志转换为结构化的统一数据模型 (UDM)。它会提取相关字段(例如用户详细信息、角色信息、权限和时间戳),并将它们映射到相应的 UDM 字段,以便进行一致的安全分析。

准备工作

  • 确保您拥有 Google SecOps 实例。
  • 确保您拥有 AWS 的特权访问权限。

配置 AWS IAM 和 S3

  1. 按照以下用户指南创建 Amazon S3 存储桶创建存储桶
  2. 保存存储桶名称区域以备后用。
  3. 按照以下用户指南创建用户:创建 IAM 用户
  4. 选择创建的用户
  5. 选择安全凭据标签页。
  6. 访问密钥部分中,点击创建访问密钥
  7. 选择第三方服务作为使用情形
  8. 点击下一步
  9. 可选:添加说明标记。
  10. 点击创建访问密钥
  11. 点击 Download CSV file(下载 CSV 文件),保存访问密钥不公开的访问密钥以供日后使用。
  12. 点击完成
  13. 选择权限标签页。
  14. 权限政策部分中,点击添加权限
  15. 选择添加权限
  16. 选择直接附加政策
  17. 搜索并选择 AmazonS3FullAccess 政策。
  18. 点击下一步
  19. 点击添加权限

配置 CloudTrail 以捕获 IAM 日志

  1. 登录 AWS Management Console
  2. 在搜索栏中,输入并从服务列表中选择 CloudTrail
  3. 点击创建试验
  4. 提供轨迹名称;例如 IAMActivityTrail
    • 将轨迹应用于所有区域:选择以捕获所有区域的活动。
    • 存储位置:选择之前创建的 S3 存储桶,或创建一个新的存储桶。
    • S3 存储桶:输入 S3 存储桶的名称,例如 iam-logs-bucket
    • 选择创建新的 IAM 角色(如果之前未创建)。
    • 管理事件:选择读取写入,以捕获 IAM 资源的读取和写入事件。
    • 数据事件:启用 S3 和 Lambda 数据事件。
  5. 点击创建以创建轨迹。

配置 CloudTrail 以将日志导出到 S3

  1. 依次前往服务 > S3
  2. 选择存储 CloudTrail 日志的 S3 存储桶,例如 iam-logs-bucket
  3. 确保 CloudTrail 拥有将日志写入存储桶的相应权限。
  4. 如果以下政策尚不存在,请添加:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "CloudTrailS3Access",
          "Effect": "Allow",
          "Principal": {
            "Service": "cloudtrail.amazonaws.com"
          },
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::your-bucket-name/AWSLogs/*"
        }
      ]
    }
    
  5. 在 S3 存储桶上启用版本控制,以确保日志以多个版本存储。

  6. 依次前往属性 > 存储分区版本控制 > 启用

可选:配置 Lambda 以进行实时导出

  1. 前往 AWS Lambda 控制台
  2. 点击创建函数
  3. 选择从头开始创作
  4. 将函数名称设置为 ExportIAMLogsToS3
  5. 选择 Python 3.x 运行时。
  6. 为函数分配具有以下权限的 IAM 角色:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "logs:GetLogEvents",
            "logs:FilterLogEvents",
            "logs:DescribeLogGroups",
            "logs:DescribeLogStreams"
          ],
          "Resource": "*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:PutObject"
          ],
          "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
      ]
    }
    
  7. 使用以下 Python 代码提取 IAM 日志将其上传到 S3

    import boto3
    import gzip
    from io import BytesIO
    
    s3 = boto3.client('s3')
    logs = boto3.client('logs')
    
    def lambda_handler(event, context):
        log_group = event['logGroup']
        log_stream = event['logStream']
    
        log_events = logs.get_log_events(
            logGroupName=log_group,
            logStreamName=log_stream,
            startFromHead=True
        )
    
        log_data = "\n".join([event['message'] for event in log_events['events']])
    
        # Compress and upload to S3
        compressed_data = gzip.compress(log_data.encode('utf-8'))
        s3.put_object(
            Bucket='your-s3-bucket-name',
            Key='iam-logs/{log_stream}.gz',
            Body=compressed_data
        )
    
  • your-s3-bucket-name 替换为您的实际存储桶名称。

为 CloudWatch Logs 配置 Lambda 触发器

  1. Lambda 控制台中,前往设计器
  2. 依次选择添加触发器 > CloudWatch Logs
  3. 选择与 IAM 日志关联的 CloudWatch Logs 日志组,例如 /aws/cloudtrail/
  4. 点击添加

设置 Feed

您可以通过两种不同的入口点在 Google SecOps 平台中设置 Feed:

  • SIEM 设置 > Feed > 添加新 Feed
  • 内容中心 > 内容包 > 开始

如何设置 AWS IAM Feed

  1. 点击 Amazon Cloud Platform 包。
  2. 找到 AWS IAM 日志类型。
  3. 在以下字段中指定值。

    • 来源类型:第三方 API
    • 用户名:用于身份验证的用户名
    • Secret:用于身份验证的 Secret

    高级选项

    • Feed 名称:用于标识 Feed 的预填充值。
    • 资源命名空间:与 Feed 关联的命名空间。
    • 提取标签:应用于相应 Feed 中所有事件的标签。
  4. 点击创建 Feed

如需详细了解如何为相应产品系列中的不同日志类型配置多个 Feed,请参阅按产品配置 Feed

UDM 映射表

日志字段 UDM 映射 逻辑
Arn entity.entity.resource.name 直接从 USER 和 RESOURCE 实体类型的 Arn 字段映射。对于 GROUP 实体类型,它从 Group.Arn 映射而来。
AssumeRolePolicyDocument entity.entity.resource.attribute.permissions.name 直接从 AssumeRolePolicyDocument 字段映射,但仅适用于 RESOURCE 实体类型。
CreateDate entity.entity.user.attribute.creation_time 直接从 CreateDate 字段映射,并转换为 Chronicle 的时间戳格式(适用于 USER 实体类型)。
CreateDate entity.entity.resource.attribute.creation_time 直接从 CreateDate 字段映射,并转换为 Chronicle 的时间戳格式(适用于 RESOURCE 实体类型)。
Group.Arn entity.entity.resource.name 直接从 GROUP 实体类型的 Group.Arn 字段映射。
Group.CreateDate entity.entity.group.attribute.creation_time 直接从 Group.CreateDate 字段映射并转换为 Chronicle 的时间戳格式。
Group.GroupID entity.entity.group.product_object_id 直接从 Group.GroupID 字段映射。
Group.GroupName entity.entity.group.group_display_name 直接从 Group.GroupName 字段映射。
Group.GroupName entity.entity.group.email_addresses 直接从 Group.GroupName 字段映射。
Group.Path entity.entity.group.attribute.labels.value 直接从 Group.Path 字段映射,键硬编码为 path
IsTruncated entity.entity.group.attribute.labels.value 直接从 IsTruncated 字段映射并转换为字符串,键硬编码为 is_truncated
标记 entity.entity.group.attribute.labels.value 直接从 Marker 字段映射,键硬编码为 marker
PasswordLastUsed entity.entity.user.last_login_time 直接从 PasswordLastUsed 字段映射并转换为 Chronicle 的时间戳格式。
路径 entity.entity.user.attribute.labels.value 直接从 USER 实体类型的 Path 字段映射,键硬编码为 path
路径 entity.entity.resource.attribute.labels.value 直接从 RESOURCE 实体类型的 Path 字段映射,该键硬编码为 path
PermissionsBoundary.PermissionsBoundaryArn entity.entity.resource.attribute.labels.value 直接从 PermissionsBoundary.PermissionsBoundaryArn 字段映射,键硬编码为 permissions_boundary_arn
PermissionsBoundary.PermissionsBoundaryType entity.entity.resource.attribute.labels.value 直接从 PermissionsBoundary.PermissionsBoundaryType 字段映射,键硬编码为 permissions_boundary_type
RoleID entity.entity.resource.product_object_id 直接从 RoleID 字段映射。
RoleLastUsed.LastUsedDate entity.entity.resource.attribute.labels.value 直接从 RoleLastUsed.LastUsedDate 字段映射,键硬编码为 role_last_used_date
RoleLastUsed.Region entity.entity.location.name 直接从 RoleLastUsed.Region 字段映射。
RoleName entity.entity.resource.attribute.roles.name 直接从 RoleName 字段映射。
Tags.Key entity.entity.user.attribute.labels.key 用作用户属性中 labels 字段的键。
Tags.Value entity.entity.user.attribute.labels.value 用作用户属性中 labels 字段的值。
UserID entity.entity.user.product_object_id 直接从 UserID 字段映射。
用户名 entity.entity.user.userid 直接从 UserName 字段映射。
Users.Arn relations.entity.resource.name 直接从用户关系中的 Users.Arn 字段映射。
Users.CreateDate relations.entity.user.attribute.creation_time 直接从用户关系中的 Users.CreateDate 字段映射,并转换为 Chronicle 的时间戳格式。
Users.PasswordLastUsed relations.entity.user.last_login_time 直接从用户关系中的 Users.PasswordLastUsed 字段映射,并转换为 Chronicle 的时间戳格式。
Users.Path relations.entity.user.attribute.labels.value 直接从用户关系中的 Users.Path 字段映射,键硬编码为 path
Users.PermissionsBoundary.PermissionsBoundaryArn relations.entity.resource.attribute.labels.value 直接从用户关系中的 Users.PermissionsBoundary.PermissionsBoundaryArn 字段映射,键硬编码为 permissions_boundary_arn
Users.PermissionsBoundary.PermissionsBoundaryType relations.entity.resource.attribute.labels.value 直接从用户关系中的 Users.PermissionsBoundary.PermissionsBoundaryType 字段映射,键硬编码为 permissions_boundary_type
Users.UserID relations.entity.user.product_object_id 直接从用户关系中的 Users.UserID 字段映射。
Users.UserName relations.entity.user.userid 直接从用户关系中的 Users.UserName 字段映射。
不适用 entity.metadata.collected_timestamp 使用原始日志中的事件时间戳填充。
不适用 entity.metadata.vendor_name 硬编码为 AWS
不适用 entity.metadata.product_name 硬编码为 AWS IAM
不适用 entity.metadata.entity_type 根据是否存在特定字段来确定:如果存在 UserID,则为 USER;如果存在 RoleName,则为 RESOURCE;如果存在 Group.GroupName,则为 GROUP。
不适用 entity.entity.resource.resource_subtype 对于 USER 和 GROUP 实体类型,请设置为 User
不适用 entity.entity.resource.resource_type 对于 RESOURCE 实体类型,设置为 ACCESS_POLICY
不适用 entity.entity.resource.attribute.cloud.environment 硬编码为 AMAZON_WEB_SERVICES
不适用 relations.entity_type 针对群组内的用户关系硬编码为 USER
不适用 relations.relationship 针对群组内的用户关系硬编码为 MEMBER
不适用 relations.direction 针对群组内的用户关系硬编码为 UNIDIRECTIONAL
不适用 relations.entity.resource.resource_subtype 针对群组内的用户关系硬编码为 User

需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。