收集 AWS IAM 日志

支持的平台:

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

准备工作

确保您满足以下前提条件:

  • Google SecOps 实例
  • 对 AWS 控制台的特权访问权限
  • 创建 IAM 用户、角色和政策的权限

选择集成方法

Google SecOps 支持以下两种 AWS IAM 数据注入方法:

方法 A:CloudTrail + Amazon S3(活动日志)

  • 收集的数据:IAM 活动日志(谁执行了哪些操作)
  • 数据源:AWS CloudTrail 事件
  • 延迟时间:几分钟(基于轮询)
  • 应用场景:历史审核轨迹、合规性报告
  • Feed 源类型:Amazon S3 V2

方法 B:第三方 API(配置快照)

  • 收集的数据:IAM 配置数据(用户、群组、角色、政策)
  • 数据源:AWS IAM API 直接调用
  • 延迟时间:近乎实时(定期轮询)
  • 应用场景:实时 IAM 配置监控、访问权限审核
  • Feed 源类型:第三方 API

方法 A:CloudTrail + Amazon S3 集成

此方法使用 AWS CloudTrail 捕获 IAM 活动,并将日志存储在 Amazon S3 中,然后由 Google SecOps 注入这些日志。

创建 Amazon S3 存储桶

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

为 CloudTrail 配置 S3 存储桶政策

CloudTrail 需要具备将日志写入 S3 存储桶的权限。

  1. Amazon S3 控制台中,选择您的存储桶。
  2. 前往权限 > 存储分区政策
  3. 点击修改,然后添加以下政策:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "CloudTrailAclCheck",
          "Effect": "Allow",
          "Principal": {
            "Service": "cloudtrail.amazonaws.com"
          },
          "Action": "s3:GetBucketAcl",
          "Resource": "arn:aws:s3:::iam-activity-logs-bucket"
        },
        {
          "Sid": "CloudTrailWrite",
          "Effect": "Allow",
          "Principal": {
            "Service": "cloudtrail.amazonaws.com"
          },
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::iam-activity-logs-bucket/AWSLogs/*",
          "Condition": {
            "StringEquals": {
              "s3:x-amz-acl": "bucket-owner-full-control"
            }
          }
        }
      ]
    }
    
    • iam-activity-logs-bucket 替换为您的实际存储桶名称。
  4. 点击保存更改

配置 CloudTrail 以捕获 IAM 活动

  1. 登录 AWS Management Console
  2. 在搜索栏中,输入并从服务列表中选择 CloudTrail
  3. 点击创建试验
  4. 提供以下配置详细信息:
    • 轨迹名称:输入一个描述性名称(例如 IAMActivityTrail)。
    • 将轨迹应用于所有区域:选择可捕获所有区域的活动。
    • 存储位置:选择使用现有 S3 存储桶,然后选择之前创建的存储桶。
    • 日志文件前缀(可选):输入前缀(例如 iam-logs/)。
    • 日志文件 SSE-KMS 加密:可选。如果已启用,请创建或选择 KMS 密钥。
  5. 点击下一步
  6. 配置事件选择:
    • 管理事件:选择读取写入,以捕获 IAM 资源上的读取和写入事件。
    • 数据事件:可选。根据需要启用 S3Lambda 数据事件。
    • 数据洞见事件:可选。启用后可检测异常活动。
  7. 点击下一步
  8. 检查配置,然后点击创建轨迹
  1. Amazon S3 控制台中,选择您的存储桶。
  2. 依次前往属性 > 存储分区版本控制
  3. 点击修改
  4. 选择启用
  5. 点击保存更改

为 Google SecOps S3 访问权限创建 IAM 用户

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

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:GetObject",
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::iam-activity-logs-bucket",
            "arn:aws:s3:::iam-activity-logs-bucket/*"
          ]
        }
      ]
    }
    
    • iam-activity-logs-bucket 替换为您的实际存储桶名称。
  18. 点击下一步

  19. 将政策命名为 chronicle-s3-read-policy

  20. 点击创建政策

  21. 返回到用户创建标签页,然后刷新政策列表。

  22. 搜索并选择 chronicle-s3-read-policy

  23. 点击下一步

  24. 点击添加权限

可选:创建用于实时导出的 Lambda 函数

如果您需要将 CloudTrail 日志近乎实时地导出到 S3,请执行以下操作:

  1. AWS 控制台中,依次前往 Lambda > 函数 > 创建函数
  2. 点击从头开始创作
  3. 提供以下配置详细信息:

    设置
    名称 ExportIAMLogsToS3
    运行时 Python 3.13
    架构 x86_64
    执行角色 创建具有基本 Lambda 权限的新角色
  4. 点击创建函数

  5. 创建函数后,打开 Code 标签页,删除桩代码并输入以下代码:

    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='iam-activity-logs-bucket',
            Key=f'iam-logs/{log_stream}.gz',
            Body=compressed_data
        )
    
        return {
            'statusCode': 200,
            'body': 'Logs exported successfully'
        }
    
    • iam-activity-logs-bucket 替换为您的存储分区名称。
  6. 点击部署以保存函数代码。

可选:配置 Lambda 执行角色权限

  1. 在同一函数中,选择配置标签页。
  2. 从左侧菜单中选择权限
  3. 点击执行角色名称,在 IAM 控制台中打开该角色。
  4. 依次点击添加权限 > 附加政策
  5. 在新标签页中点击创建政策
  6. 选择 JSON 标签页,然后粘贴以下政策:

    {
      "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:::iam-activity-logs-bucket/*"
        }
      ]
    }
    
    • iam-activity-logs-bucket 替换为您的存储分区名称。
  7. 点击下一步

  8. 将政策命名为 lambda-iam-logs-export-policy

  9. 点击创建政策

  10. 返回到角色标签页,然后刷新。

  11. 搜索并选择 lambda-iam-logs-export-policy

  12. 点击添加权限

可选:配置 Lambda 超时

  1. 在 Lambda 函数中,停留在配置标签页中。
  2. 从左侧菜单中选择常规配置
  3. 点击修改
  4. 超时更改为 5 分钟(300 秒)
  5. 点击保存

可选:为 CloudWatch Logs 配置 Lambda 触发器

  1. 在 Lambda 函数中,选择顶部的函数概览部分。
  2. 点击添加触发器
  3. 触发器配置下拉菜单中,选择 CloudWatch Logs
  4. 提供以下配置详细信息:
    • 日志组:选择或输入与 CloudTrail 关联的 CloudWatch Logs 日志组(例如 /aws/cloudtrail/)。
    • 过滤条件名称:输入一个描述性名称(例如 IAM-events-filter)。
    • 过滤模式:留空可捕获所有事件,也可输入特定模式。
  5. 点击 Add(添加)。

设置 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

使用 SIEM 设置

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 在下一页上,点击配置单个 Feed
  4. Feed 名称字段中,输入 Feed 的名称(例如 AWS IAM CloudTrail Logs)。
  5. 选择 Amazon S3 V2 作为来源类型
  6. 选择 AWS IAM 作为日志类型
  7. 点击下一步
  8. 为以下输入参数指定值:

    • S3 URIs3://iam-activity-logs-bucket/

      • iam-activity-logs-bucket 替换为您的实际存储桶名称。
    • 来源删除选项:根据您的偏好选择删除选项:

      • 永不:永不删除转移后的任何文件(建议用于测试)。
      • 成功时:成功转移后删除所有文件和空目录(用于优化费用)。
    • 文件存在时间上限:包含在过去指定天数内修改的文件。默认值为 180 天。

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

    • 私有访问密钥:具有 S3 存储桶访问权限的用户私有密钥。

    • 资产命名空间资产命名空间

    • 注入标签:要应用于此 Feed 中事件的标签。

  9. 点击下一步

  10. 最终确定界面中查看新的 Feed 配置,然后点击提交

方法 B:第三方 API 集成

此方法使用直接 AWS IAM API 调用来收集当前的 IAM 配置数据(用户、群组、角色、政策)。

获取 Google SecOps IP 范围

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 请注意页面顶部显示的 IP 地址范围。
  4. 或者,您也可以使用 Feed Management API 以编程方式检索 IP 范围。

创建具有所需权限的 IAM 用户

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

重要提示IAMReadOnlyAccess 政策包含所有必需的权限:

  • iam:GetUser
  • iam:ListUsers
  • iam:GetGroup
  • iam:ListGroups
  • iam:GetPolicy
  • iam:ListPolicies
  • iam:GetRole
  • iam:ListRoles
  • iam:ListAttachedUserPolicies
  • iam:ListAttachedGroupPolicies
  • iam:ListAttachedRolePolicies
  • iam:GetAccountSummary

选项 B:创建自定义政策(最小权限)

如果您的安全政策要求使用最少的权限,而不是使用托管政策:

  1. 在 AWS 控制台中,依次前往 IAM > 政策 > 创建政策 > JSON 标签页
  2. 粘贴以下政策:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "iam:GetUser",
            "iam:ListUsers",
            "iam:GetGroup",
            "iam:ListGroups",
            "iam:GetPolicy",
            "iam:ListPolicies",
            "iam:GetRole",
            "iam:ListRoles",
            "iam:ListAttachedUserPolicies",
            "iam:ListAttachedGroupPolicies",
            "iam:ListAttachedRolePolicies",
            "iam:GetAccountSummary"
          ],
          "Resource": "*"
        }
      ]
    }
    
  3. 点击下一步

  4. 将政策命名为 chronicle-iam-api-read-policy

  5. 点击创建政策

  6. 按照以下用户指南创建用户创建 IAM 用户

  7. 选择创建的用户

  8. 选择安全凭据标签页。

  9. 访问密钥部分中,点击创建访问密钥

  10. 选择第三方服务作为使用情形

  11. 点击下一步

  12. 可选:添加说明标记。

  13. 点击创建访问密钥

  14. 点击下载 CSV 文件,保存访问密钥秘密访问密钥,以供日后参考。

  15. 点击完成

  16. 选择权限标签页。

  17. 权限政策部分中,点击添加权限

  18. 选择添加权限

  19. 选择直接附加政策

  20. 搜索并选择 chronicle-iam-api-read-policy

  21. 点击下一步

  22. 点击添加权限

在 Google SecOps 中配置 Feed 以注入 IAM 配置数据

  1. 依次前往内容中心 > 内容包 > 开始
  2. 点击 Amazon Cloud Platform 包。
  3. 找到 AWS IAM 日志类型。
  4. 来源类型下拉菜单中选择第三方 API
  5. 提供以下配置详细信息:
    • 用户名:之前创建的 IAM 用户的访问密钥 ID。
    • 密钥:之前创建的 IAM 用户的私有访问密钥。
    • Feed 名称:用于标识 Feed 的预填充值(例如 AWS IAM API Configuration)。
    • 资源命名空间:与 Feed 关联的命名空间。
    • 提取标签:应用于相应 Feed 中所有事件的标签。
  6. 点击创建 Feed

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

使用 SIEM 设置

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 在下一页上,点击配置单个 Feed
  4. Feed 名称字段中,输入 Feed 的名称(例如 AWS IAM API Configuration)。
  5. 选择第三方 API 作为来源类型
  6. 选择 AWS IAM 作为日志类型
  7. 点击下一步
  8. 为以下输入参数指定值:

    • 用户名:之前创建的 IAM 用户的访问密钥 ID。
    • 密钥:之前创建的 IAM 用户的私有访问密钥。
    • 区域:AWS 区域(例如 us-east-1)。
    • 资产命名空间资产命名空间
    • 注入标签:要应用于此 Feed 中事件的标签。
  9. 点击下一步

  10. 最终确定界面中查看新的 Feed 配置,然后点击提交

UDM 映射表

日志字段 UDM 映射 逻辑
Arn entity.entity.resource.name 直接从 ARN 字段映射。适用于各种实体类型。对于 GROUP 实体类型,从 Group.Arn 映射。
AssumeRolePolicyDocument entity.entity.resource.attribute.permissions.name 直接从 AssumeRolePolicyDocument 字段映射,但仅适用于 RESOURCE 实体类型。
CreateDate entity.entity.user.attribute.creation_time 直接从 CreateDate 字段映射并转换为 Chronicle 的时间戳格式。
CreateDate entity.entity.resource.attribute.creation_time 直接从 CreateDate 字段映射并转换为 Chronicle 的时间戳格式。
Group.Arn entity.entity.resource.name 直接从 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。
Marker entity.entity.group.attribute.labels.value 直接从 Marker 字段映射,键硬编码为 marker。
PasswordLastUsed entity.entity.user.last_login_time 直接从 PasswordLastUsed 字段映射并转换为 Chronicle 的时间戳格式。
Path entity.entity.user.attribute.labels.value 直接从 USER 实体类型的 Path 字段映射,键硬编码为 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 用作用户实体中标签的键。
Tags.Value entity.entity.user.attribute.labels.value 用作用户实体中标签的值。
UserID entity.entity.user.product_object_id 直接从 UserID 字段映射。
UserName 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;如果存在 RoleID,则为 RESOURCE;如果存在 Group.GroupName,则为 GROUP。
不适用 entity.entity.resource.resource_subtype 对于 USER 实体类型,设置为 User;对于 RESOURCE 实体类型,设置为 Role。
不适用 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 专业人士的解答。