收集 AWS IAM 日志
支持的平台:
Google SecOps
SIEM
本文档介绍了如何将 AWS IAM 日志提取到 Google Security Operations。解析器会将原始 JSON 格式的日志转换为结构化的统一数据模型 (UDM)。它会提取用户详细信息、角色信息、权限和时间戳等相关字段,并将其映射到相应的 UDM 字段,以便进行一致的安全分析。
准备工作
- 确保您拥有 Google SecOps 实例。
- 确保您拥有对 AWS 的特权访问权限。
配置 AWS IAM 和 S3
- 按照此用户指南中的说明创建 Amazon S3 存储分区:创建存储分区。
- 保存存储分区的名称和区域,以备日后使用。
- 按照此用户指南中的说明创建用户:创建 IAM 用户。
- 选择创建的用户。
- 选择安全凭据标签页。
- 点击访问密钥部分中的创建访问密钥。
- 选择第三方服务作为用例。
- 点击下一步。
- 可选:添加说明标记。
- 点击创建访问密钥。
- 点击下载 CSV 文件,保存访问密钥和密钥以供日后使用。
- 点击完成。
- 选择权限标签页。
- 在权限政策部分中,点击添加权限。
- 选择添加权限。
- 选择直接附加政策
- 搜索并选择 AmazonS3FullAccess 政策。
- 点击下一步。
- 点击添加权限。
配置 CloudTrail 以捕获 IAM 日志
- 登录 AWS Management Console。
- 在搜索栏中输入 CloudTrail,然后从服务列表中选择该服务。
- 点击创建小路。
- 提供轨迹名称;例如
IAMActivityTrail
。- 将轨迹应用于所有地区:选择是可捕获所有地区的活动。
- 存储位置:选择之前创建的 S3 存储分区或创建一个新的存储分区。
- S3 存储分区:输入 S3 存储分区的名称;例如
iam-logs-bucket
。 - 选择创建新的 IAM 角色(如果之前未创建)。
- 管理事件:选择读取和写入,以捕获 IAM 资源上的读取和写入事件。
- 数据事件:启用 S3 和 Lambda 数据事件。
- 点击创建以创建轨迹。
配置 CloudTrail 将日志导出到 S3
- 依次选择服务 > S3。
- 选择存储 CloudTrail 日志的 S3 存储分区;例如
iam-logs-bucket
。 - 确保 CloudTrail 拥有将日志写入存储分区的权限。
如果不存在以下政策,请添加该政策:
{ "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/*" } ] }
在 S3 存储分区上启用版本控制,以确保日志以多个版本存储。
依次前往媒体资源 > 存储分区版本控制 > 启用。
可选:配置 Lambda 以实现实时导出
- 前往 AWS Lambda 控制台。
- 点击创建函数。
- 选择从头开始创作。
- 将函数名称设置为
ExportIAMLogsToS3
。 - 选择 Python 3.x 运行时。
向函数分配一个 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/*" } ] }
使用以下 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 触发器
- 在 Lambda 控制台中,前往 Designer。
- 依次选择添加触发器 > CloudWatch 日志。
- 选择与您的 IAM 日志关联的 CloudWatch 日志日志组;例如
/aws/cloudtrail/
。 - 点击添加。
在 Google SecOps 中配置 Feed 以提取 AWS IAM 日志
- 依次前往 SIEM 设置 > Feed。
- 点击新增。
- 在 Feed 名称字段中,输入 Feed 的名称;例如,AWS IAM 日志。
- 选择 Amazon S3 作为来源类型。
- 选择 AWS IAM 作为日志类型。
- 点击下一步。
为以下输入参数指定值:
- 区域:Amazon S3 存储分区所在的区域。
- S3 URI:存储分区 URI。
s3://your-log-bucket-name/
- 将
your-log-bucket-name
替换为存储分区的实际名称。
- 将
- URI 是:选择目录或包含子目录的目录。
来源删除选项:根据您的偏好选择删除选项。
访问密钥 ID:有权访问 S3 存储分区的用户访问密钥。
私有访问密钥:有权访问 S3 存储分区的用户私钥。
资源命名空间:资源命名空间。
提取标签:要应用于此 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 字段映射,并针对 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 专业人士寻求解答。