收集 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. 点击下载 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 日志配置 Lambda 触发器

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

在 Google SecOps 中配置 Feed 以提取 AWS IAM 日志

  1. 依次前往 SIEM 设置 > Feed
  2. 点击新增
  3. Feed 名称字段中,输入 Feed 的名称;例如,AWS IAM 日志
  4. 选择 Amazon S3 作为来源类型
  5. 选择 AWS IAM 作为日志类型
  6. 点击下一步
  7. 为以下输入参数指定值:

    • 区域:Amazon S3 存储分区所在的区域。
    • S3 URI:存储分区 URI。
      • s3://your-log-bucket-name/
        • your-log-bucket-name 替换为存储分区的实际名称。
    • URI 是:选择目录包含子目录的目录
    • 来源删除选项:根据您的偏好选择删除选项。

    • 访问密钥 ID:有权访问 S3 存储分区的用户访问密钥。

    • 私有访问密钥:有权访问 S3 存储分区的用户私钥。

    • 资源命名空间资源命名空间

    • 提取标签:要应用于此 Feed 中的事件的标签。

  8. 点击下一步

  9. 最终确定界面中查看新的 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 字段映射,并针对 USER 实体类型转换为 Chronicle 的时间戳格式。
CreateDate entity.entity.resource.attribute.creation_time 直接从 CreateDate 字段映射,并针对 RESOURCE 实体类型转换为 Chronicle 的时间戳格式。
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
不适用 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

变化

2023-12-14

  • 新创建的解析器。

需要更多帮助?向社区成员和 Google SecOps 专业人士寻求解答。