收集 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 存储桶
- 按照以下用户指南创建 Amazon S3 存储桶:创建存储桶。
- 保存存储桶名称和区域以供日后参考(例如
iam-activity-logs-bucket)。
为 CloudTrail 配置 S3 存储桶政策
CloudTrail 需要具备将日志写入 S3 存储桶的权限。
- 在 Amazon S3 控制台中,选择您的存储桶。
- 前往权限 > 存储分区政策。
点击修改,然后添加以下政策:
{ "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替换为您的实际存储桶名称。
- 将
点击保存更改。
配置 CloudTrail 以捕获 IAM 活动
- 登录 AWS Management Console。
- 在搜索栏中,输入并从服务列表中选择 CloudTrail。
- 点击创建试验。
- 提供以下配置详细信息:
- 轨迹名称:输入一个描述性名称(例如
IAMActivityTrail)。 - 将轨迹应用于所有区域:选择是可捕获所有区域的活动。
- 存储位置:选择使用现有 S3 存储桶,然后选择之前创建的存储桶。
- 日志文件前缀(可选):输入前缀(例如
iam-logs/)。 - 日志文件 SSE-KMS 加密:可选。如果已启用,请创建或选择 KMS 密钥。
- 轨迹名称:输入一个描述性名称(例如
- 点击下一步。
- 配置事件选择:
- 管理事件:选择读取和写入,以捕获 IAM 资源上的读取和写入事件。
- 数据事件:可选。根据需要启用 S3 和 Lambda 数据事件。
- 数据洞见事件:可选。启用后可检测异常活动。
- 点击下一步。
- 检查配置,然后点击创建轨迹。
可选:启用 S3 存储桶版本控制(推荐)
- 在 Amazon S3 控制台中,选择您的存储桶。
- 依次前往属性 > 存储分区版本控制。
- 点击修改。
- 选择启用。
- 点击保存更改。
为 Google SecOps S3 访问权限创建 IAM 用户
- 按照以下用户指南创建用户:创建 IAM 用户。
- 选择创建的用户。
- 选择安全凭据标签页。
- 在访问密钥部分中,点击创建访问密钥。
- 选择第三方服务作为使用情形。
- 点击下一步。
- 可选:添加说明标记。
- 点击创建访问密钥。
- 点击下载 CSV 文件,保存访问密钥和秘密访问密钥,以供日后参考。
- 点击完成。
- 选择权限标签页。
- 在权限政策部分中,点击添加权限。
- 选择添加权限。
- 选择直接附加政策。
- 在新标签页中点击创建政策。
- 在政策编辑器中,选择 JSON 标签页。
输入以下政策:
{ "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替换为您的实际存储桶名称。
- 将
点击下一步。
将政策命名为
chronicle-s3-read-policy。点击创建政策。
返回到用户创建标签页,然后刷新政策列表。
搜索并选择
chronicle-s3-read-policy。点击下一步。
点击添加权限。
可选:创建用于实时导出的 Lambda 函数
如果您需要将 CloudTrail 日志近乎实时地导出到 S3,请执行以下操作:
- 在 AWS 控制台中,依次前往 Lambda > 函数 > 创建函数。
- 点击从头开始创作。
提供以下配置详细信息:
设置 值 名称 ExportIAMLogsToS3运行时 Python 3.13 架构 x86_64 执行角色 创建具有基本 Lambda 权限的新角色 点击创建函数。
创建函数后,打开 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替换为您的存储分区名称。
- 将
点击部署以保存函数代码。
可选:配置 Lambda 执行角色权限
- 在同一函数中,选择配置标签页。
- 从左侧菜单中选择权限。
- 点击执行角色名称,在 IAM 控制台中打开该角色。
- 依次点击添加权限 > 附加政策。
- 在新标签页中点击创建政策。
选择 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替换为您的存储分区名称。
- 将
点击下一步。
将政策命名为
lambda-iam-logs-export-policy。点击创建政策。
返回到角色标签页,然后刷新。
搜索并选择
lambda-iam-logs-export-policy。点击添加权限。
可选:配置 Lambda 超时
- 在 Lambda 函数中,停留在配置标签页中。
- 从左侧菜单中选择常规配置。
- 点击修改。
- 将超时更改为 5 分钟(300 秒)。
- 点击保存。
可选:为 CloudWatch Logs 配置 Lambda 触发器
- 在 Lambda 函数中,选择顶部的函数概览部分。
- 点击添加触发器。
- 在触发器配置下拉菜单中,选择 CloudWatch Logs。
- 提供以下配置详细信息:
- 日志组:选择或输入与 CloudTrail 关联的 CloudWatch Logs 日志组(例如
/aws/cloudtrail/)。 - 过滤条件名称:输入一个描述性名称(例如
IAM-events-filter)。 - 过滤模式:留空可捕获所有事件,也可输入特定模式。
- 日志组:选择或输入与 CloudTrail 关联的 CloudWatch Logs 日志组(例如
- 点击 Add(添加)。
设置 Feed
您可以通过两种不同的入口点在 Google SecOps 平台中设置 Feed:
- SIEM 设置 > Feed > 添加新 Feed
- 内容中心 > 内容包 > 开始
如何设置 AWS IAM Feed
- 点击 Amazon Cloud Platform 包。
- 找到 AWS IAM 日志类型。
在以下字段中指定值。
- 来源类型:第三方 API
- 用户名:用于身份验证的用户名
- Secret:用于进行身份验证的 Secret
高级选项
- Feed 名称:用于标识 Feed 的预填充值。
- 资源命名空间:与 Feed 关联的命名空间。
- 提取标签:应用于相应 Feed 中所有事件的标签。
点击创建 Feed。
如需详细了解如何为相应产品系列中的不同日志类型配置多个 Feed,请参阅按产品配置 Feed。
使用 SIEM 设置
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 在下一页上,点击配置单个 Feed。
- 在Feed 名称字段中,输入 Feed 的名称(例如
AWS IAM CloudTrail Logs)。 - 选择 Amazon S3 V2 作为来源类型。
- 选择 AWS IAM 作为日志类型。
- 点击下一步。
为以下输入参数指定值:
S3 URI:
s3://iam-activity-logs-bucket/- 将
iam-activity-logs-bucket替换为您的实际存储桶名称。
- 将
来源删除选项:根据您的偏好选择删除选项:
- 永不:永不删除转移后的任何文件(建议用于测试)。
- 成功时:成功转移后删除所有文件和空目录(用于优化费用)。
文件存在时间上限:包含在过去指定天数内修改的文件。默认值为 180 天。
访问密钥 ID:有权访问 S3 存储桶的用户访问密钥。
私有访问密钥:具有 S3 存储桶访问权限的用户私有密钥。
资产命名空间:资产命名空间。
注入标签:要应用于此 Feed 中事件的标签。
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
方法 B:第三方 API 集成
此方法使用直接 AWS IAM API 调用来收集当前的 IAM 配置数据(用户、群组、角色、政策)。
获取 Google SecOps IP 范围
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 请注意页面顶部显示的 IP 地址范围。
- 或者,您也可以使用 Feed Management API 以编程方式检索 IP 范围。
创建具有所需权限的 IAM 用户
方案 A:使用 AWS 托管政策(推荐)
- 按照以下用户指南创建用户:创建 IAM 用户。
- 选择创建的用户。
- 选择安全凭据标签页。
- 在访问密钥部分中,点击创建访问密钥。
- 选择第三方服务作为使用情形。
- 点击下一步。
- 可选:添加说明标记。
- 点击创建访问密钥。
- 点击下载 CSV 文件,保存访问密钥和秘密访问密钥,以供日后参考。
- 点击完成。
- 选择权限标签页。
- 在权限政策部分中,点击添加权限。
- 选择添加权限。
- 选择直接附加政策。
- 搜索 IAMReadOnlyAccess(AWS 托管政策)。
- 选择相应政策。
- 点击下一步。
- 点击添加权限。
重要提示:IAMReadOnlyAccess 政策包含所有必需的权限:
iam:GetUseriam:ListUsersiam:GetGroupiam:ListGroupsiam:GetPolicyiam:ListPoliciesiam:GetRoleiam:ListRolesiam:ListAttachedUserPoliciesiam:ListAttachedGroupPoliciesiam:ListAttachedRolePoliciesiam:GetAccountSummary
选项 B:创建自定义政策(最小权限)
如果您的安全政策要求使用最少的权限,而不是使用托管政策:
- 在 AWS 控制台中,依次前往 IAM > 政策 > 创建政策 > JSON 标签页。
粘贴以下政策:
{ "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": "*" } ] }点击下一步。
将政策命名为
chronicle-iam-api-read-policy。点击创建政策。
按照以下用户指南创建用户:创建 IAM 用户。
选择创建的用户。
选择安全凭据标签页。
在访问密钥部分中,点击创建访问密钥。
选择第三方服务作为使用情形。
点击下一步。
可选:添加说明标记。
点击创建访问密钥。
点击下载 CSV 文件,保存访问密钥和秘密访问密钥,以供日后参考。
点击完成。
选择权限标签页。
在权限政策部分中,点击添加权限。
选择添加权限。
选择直接附加政策。
搜索并选择
chronicle-iam-api-read-policy。点击下一步。
点击添加权限。
在 Google SecOps 中配置 Feed 以注入 IAM 配置数据
使用内容中心(推荐)
- 依次前往内容中心 > 内容包 > 开始。
- 点击 Amazon Cloud Platform 包。
- 找到 AWS IAM 日志类型。
- 从来源类型下拉菜单中选择第三方 API。
- 提供以下配置详细信息:
- 用户名:之前创建的 IAM 用户的访问密钥 ID。
- 密钥:之前创建的 IAM 用户的私有访问密钥。
- Feed 名称:用于标识 Feed 的预填充值(例如
AWS IAM API Configuration)。 - 资源命名空间:与 Feed 关联的命名空间。
- 提取标签:应用于相应 Feed 中所有事件的标签。
- 点击创建 Feed。
如需详细了解如何为相应产品系列中的不同日志类型配置多个 Feed,请参阅按产品配置 Feed。
使用 SIEM 设置
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 在下一页上,点击配置单个 Feed。
- 在Feed 名称字段中,输入 Feed 的名称(例如
AWS IAM API Configuration)。 - 选择第三方 API 作为来源类型。
- 选择 AWS IAM 作为日志类型。
- 点击下一步。
为以下输入参数指定值:
- 用户名:之前创建的 IAM 用户的访问密钥 ID。
- 密钥:之前创建的 IAM 用户的私有访问密钥。
- 区域:AWS 区域(例如
us-east-1)。
- 资产命名空间:资产命名空间。
- 注入标签:要应用于此 Feed 中事件的标签。
点击下一步。
在最终确定界面中查看新的 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 专业人士的解答。