收集 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. 点击添加

在 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 is a:选择目录目录(包括子目录)
    • 来源删除选项:根据您的偏好设置选择删除选项。

    • 访问密钥 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 字段映射,并转换为 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 专业人士那里获得解答。