# IAM 活动追踪器
[](https://opensource.org/licenses/MIT)
[](https://www.python.org/downloads/)
[](https://aws.amazon.com/serverless/sam/)
[](https://github.com/TarekCheikh-Org/my-iam-activity-trakcer)
[](https://aws.amazon.com/serverless/)
一个全面的无服务器 AWS 解决方案,用于跨所有区域追踪和审计 IAM、STS 和 AWS 控制台登录活动。具有通过免费的 CloudTrail 事件历史记录进行实时收集、结合 S3 + Athena 进行高级分析以及自动化安全告警等功能。使用 AWS SAM、Lambda、DynamoDB 和可选的 Parquet 分析构建。
## 概述
IAM 活动追踪器提供对您 AWS 账户中身份验证和授权活动的全面监控,帮助您:
- 追踪谁创建、修改或删除了 IAM 资源
- 监控角色扮演和凭证使用情况
- 检测可疑的身份验证模式和失败的登录尝试
- 监控 AWS 控制台登录活动,包括 root 账户使用情况
- 生成合规性报告和审计追踪
- 将事件数据保留时间延长至 CloudTrail 90 天限制之后
- 针对可疑活动进行实时安全告警
## 功能
### 事件收集
- **多区域支持**:自动追踪 IAM 事件 (us-east-1)、STS 事件(所有区域)、控制台登录事件(全球)以及 SSO/Identity Center 事件
- **全面覆盖**:监控 IAM、STS、signin.amazonaws.com 和 sso.amazonaws.com 事件源
- **SSO 追踪**:全面支持 AWS SSO/Identity Center 管理事件(权限集、账户分配、策略附加)
- **增量处理**:通过 checkpoint 管理仅处理自上次运行以来的新事件
- **初始收集**:首次运行可收集长达 90 天的 CloudTrail 历史事件
- **并行处理**:使用多线程进行快速区域查询(最多 32 个并发线程)
- **实时存储**:使用带有 GSI 的 DynamoDB 进行即时用户和操作查询
- **智能过滤**:自动过滤掉 AWS 服务关联角色的干扰,同时保留与安全相关的事件
- **无服务器**:无需管理基础设施,采用完全事件驱动的架构
- **安全告警**:针对 root 使用、身份验证失败、权限提升、SSO 管理操作等提供实时 SNS 通知
### 分析与报告
- **S3 数据湖**:可选每日以优化的 Parquet 格式导出到 S3
- **Athena 集成**:使用标准 SQL 查询数年的数据
- **预构建查询**:15 个即用型安全与合规查询(包括 6 个特定于 SSO 的查询)
- **双输出格式**:所有查询均支持表格格式(精选字段,无截断)和 JSON 格式(完整数据)
- **成本优化**:S3 生命周期策略自动归档旧数据
- **查询工具**:提供 Python CLI 以编程方式运行分析,具备灵活的输出选项
### 运维
- **高性价比**:对于大多数组织,在 AWS 免费额度内运行
- **可定制计划**:可配置的收集和导出频率
- **全面监控**:为所有函数提供 CloudWatch 告警
- **轻松部署**:单条命令的 SAM 部署
## 架构
### 完整系统概述
```
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ EventBridge │────▶│ Tracker Lambda │────▶│ DynamoDB │
│ (Hourly) │ │(Multi-threaded) │ │ (Events) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │
▼ ▼
┌──────────────────┐ ┌─────────────────┐
│ CloudTrail Event │ │Security Alerts │
│ History API │ │ (SNS) │
│ (Free 90 days) │ └─────────────────┘
└──────────────────┘ │
▼
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ EventBridge │────▶│ Export Lambda │ │ DynamoDB │
│ (Daily) │ │ (Parquet) │ │ (Control) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌──────────────────┐ ┌─────────────────┐
│ S3 Bucket │────▶│ Athena + Glue │
│ (Data Lake) │ │ (Analytics) │
└──────────────────┘ └─────────────────┘
│ │
▼ ▼
┌──────────────────┐ ┌─────────────────┐
│ Lifecycle Rules │ │ Query Tools │
│(CostOptimization)│ │ (Python) │
└──────────────────┘ └─────────────────┘
```
### 数据流
1. **收集**:Tracker Lambda 每小时跨所有区域查询 CloudTrail
2. **存储**:事件存储在 DynamoDB 中以供实时查询
3. **导出**:导出 Lambda 将每日数据转换为 S3 中的 Parquet 格式
4. **分析**:Glue 爬虫程序发现分区,Athena 启用 SQL 查询
5. **优化**:S3 生命周期规则归档旧数据以降低成本
## 前置条件
- 具有适当权限的 AWS 账户
- 已安装并配置好 AWS CLI
- 已安装 SAM CLI([安装指南](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html))
- 您的 AWS 区域支持 Python 3.13 runtime
- 适用于 Python 3.13 的 AWS SDK Pandas Layer(已在模板中自动配置)
### 所需的 IAM 权限
要部署和操作 IAM 活动追踪器,您的 AWS 用户/角色需要以下权限:
- **CloudFormation**:拥有创建、更新和删除堆栈的完全访问权限
- **Lambda**:创建、更新函数和执行角色
- **DynamoDB**:创建表、索引和管理数据
- **S3**:创建存储桶和管理对象(如果启用了分析功能)
- **EventBridge**:创建和管理规则
- **CloudWatch**:创建日志组和告警
- **IAM**:创建和管理服务角色与策略
- **Glue**:创建数据库、表和爬虫程序(如果启用了分析功能)
对于部署,您可以使用 AWS 托管策略 `PowerUserAccess`,或者创建一个包含这些特定权限的自定义策略。
## 快速开始
### 1. 克隆仓库
```
git clone https://github.com/TocConsulting/iam-activity-tracker
cd iam-activity-tracker
```
### 2. 部署解决方案
```
make deploy
```

部署将会:
- 构建 Lambda 函数
- 为部署构件创建 S3 存储桶(如果需要)
- 部署 CloudFormation 堆栈
- 设置所有必需的资源
- **自动提供初始化系统的提示**(推荐)
**立即初始化**
部署完成后,系统会询问您是否要立即初始化。这将会:
1. 收集多达 90 天的历史 CloudTrail 事件(1-5 分钟)
2. 将数据以 Parquet 格式导出到 S3(如果启用了分析功能)
3. 自动设置 Athena 表
4. 运行 Glue 爬虫程序以发现分区
**如果不进行初始化,您将需要等待 25 小时以上才能使用分析功能!**
### 3. 查看可用命令
```
make help
```

这里展示了所有可用的命令,包括部署、查询和实用工具。
## 部署选项
### 标准部署(推荐)
```
export AWS_REGION=us-east-1
export AWS_PROFILE=production
make deploy
# 在提示初始化时选择 'Y'
```
这提供了最佳的用户体验,可以立即访问分析数据。
### 不带初始化的部署
```
make deploy
# 在提示初始化时选择 'n'
```
如果您想等待计划的收集任务(1 小时 + 24 小时)完成,请使用此选项。
### 稍后初始化
```
make init
```
在部署后的任何时候运行此命令,以收集历史数据并设置分析。
## AWS 服务事件过滤
默认情况下,追踪器会过滤掉 AWS 服务关联角色事件,以减少干扰并专注于与安全相关的活动。
### 什么会被过滤?
事件将根据 CloudTrail 的 `userIdentity.type` 字段进行过滤:
```
{
"userIdentity": {
"type": "AWSService",
"invokedBy": "elasticloadbalancing.amazonaws.com"
}
}
```
### 为什么要过滤 AWS 服务事件?
AWS 服务会产生数千个日常运维事件,这些事件在安全监控中属于干扰信息:
- **数据量**:可占 IAM/STS 事件总量的 80-90%
- **运维性质**:并不代表用户或应用程序的安全活动
- **成本**:会增加 DynamoDB 存储和处理成本
- **告警疲劳**:使得发现真正的安全事件变得更加困难
## 针对 CSPM 和安全工具的角色过滤
追踪器支持过滤掉会产生过多干扰的特定角色,这对于云安全态势管理 (CSPM) 工具和安全扫描器尤为有用。
### 常见用例
过滤掉以下角色:
- **CSPM 工具**:PrismaCloud、Wiz、Orca、Dome9、CloudHealth
- **安全扫描器**:Qualys、Rapid7、Tenable
- **合规工具**:AWS Config 规则、自定义合规检查器
- **监控工具**:DataDog、New Relic、Splunk 采集器
### 配置
在部署或更新期间设置 `FilteredRoles` 参数:
```
# 部署期间
sam deploy --parameter-overrides FilteredRoles="PrismaCloudRole,WizSecurityRole,*Scanner*"
# 或在部署前导出
export FILTERED_ROLES="PrismaCloud*,Wiz*,OrcaSecurityRole,*CSPM*"
make deploy
```
### 过滤模式语法
此过滤器支持多种模式类型:
1. **精确角色名**:`SecurityAuditRole`
2. **通配符**:`*SecurityScanner*`、`CSPM-*`、`*-audit-role`
3. **完整 ARN**:`arn:aws:iam::123456789012:role/PrismaCloudRole`
4. **多个模式**:以逗号分隔的列表
### 什么会被过滤?
当某个角色匹配您的过滤模式时:
- 该角色的 **AssumeRole 事件** 将不会被存储
- 该扮演角色会话执行的 **所有后续操作** 都将被过滤
- 事件会被计数,但不会存储在 DynamoDB 中
- 过滤指标将包含在 Lambda 执行日志中
### 配置示例
```
# 过滤常见的 CSPM 工具
FilteredRoles="PrismaCloud*,WizSecurityRole,OrcaSecurityRole,Dome9-Connect"
# 按 pattern 过滤
FilteredRoles="*SecurityScanner*,*CSPM*,*Compliance*"
# 过滤特定的 ARN
FilteredRoles="arn:aws:iam::123456789012:role/SecurityAudit,arn:aws:iam::123456789012:role/CloudHealth"
# 混合 patterns
FilteredRoles="PrismaCloud*,*Scanner*,arn:aws:iam::123456789012:role/SpecificRole"
```
### 监控已过滤的事件
Lambda 响应包含过滤统计信息:
```
{
"total_events_processed": 1500,
"total_events_filtered": 8500, // Events filtered out
"execution_time_seconds": 45.2
}
```
这有助于您了解过滤的影响,并验证您的模式是否正常工作。
## 配置选项
### 环境变量
#### 核心配置
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `STACK_NAME` | iam-activity-tracker | CloudFormation 堆栈名称 |
| `AWS_REGION` | us-east-1 | 部署区域 |
| `LOG_LEVEL` | INFO | 日志详细程度 (DEBUG/INFO/WARNING/ERROR) |
#### 收集设置
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `SCHEDULE_EXPRESSION` | rate(1 hour) | 收集事件的频率 |
| `MAX_WORKERS` | 16 | 处理区域的最大并发线程数 |
| `PROCESS_IAM_EVENTS` | true | 追踪 IAM 事件 (us-east-1) |
| `PROCESS_STS_EVENTS` | true | 追踪 STS 事件(所有区域) |
| `PROCESS_SIGNIN_EVENTS` | true | 追踪 AWS 控制台登录事件 (us-east-1) |
| `PROCESS_SSO_EVENTS` | true | 追踪 AWS SSO/Identity Center 事件 |
| `SSO_REGION` | us-east-1 | SSO 事件的主区域 |
| `FILTER_AWS_SERVICE_EVENTS` | true | 过滤掉 AWS 服务关联角色事件 |
| `FILTERED_ROLES` | '' | 以逗号分隔的要过滤的角色名称/模式列表(例如:`PrismaCloud*,WizRole,*SecurityScanner*`)。支持通配符 (*) |
#### 分析配置
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `ENABLE_ANALYTICS` | true | 启用 S3 导出和 Athena 集成 |
| `EXPORT_SCHEDULE_EXPRESSION` | rate(1 day) | 导出到 S3 的频率 |
| `EXPORT_DAYS_BACK` | 1 | 每次运行导出的天数 |
#### 安全告警配置
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `ENABLE_SECURITY_ALERTS` | true | 通过 SNS 启用安全告警 |
| `ALERTS_EMAIL_ADDRESS` | '' | 接收安全告警的电子邮件地址(在部署期间设置,或留空以跳过) |
| `OFF_HOURS_START` | 22 | 非工作时间告警的开始小时(24 小时制) |
| `OFF_HOURS_END` | 6 | 非工作时间告警的结束小时(24 小时制) |
### 计划选项
#### 收集频率
- `rate(1 hour)` - 每小时(推荐用于活跃环境)
- `rate(6 hours)` - 每 6 小时(注重成本的选择)
- `rate(12 hours)` - 每天 2 次(最基础的活跃监控)
- `rate(1 day)` - 每天 1 次(以归档为重点)
#### 导出频率
- `rate(6 hours)` - 每 6 小时(近实时分析)
- `rate(12 hours)` - 每天 2 次
- `rate(1 day)` - 每天(推荐用于大多数用例)
- `rate(7 days)` - 每周(针对大型数据集进行成本优化)
## 成本分析
### 免费额度覆盖(仅限 DynamoDB)
对于小型组织(<100 用户,<50 服务角色):
- **DynamoDB**:$0(在 25GB 免费存储空间、25 RCU/WCU 范围内)
- **Lambda**:$0(在 100 万次调用、400,000 GB-秒范围内)
- **CloudTrail**:$0(使用免费的 90 天事件历史记录 API)
- **CloudWatch**:$0(在免费额度限制范围内)
- **总计**:$0/月
### 启用分析后 (S3 + Athena)
#### 小型组织
- **核心组件**:$0(免费额度)
**S3 存储**:约 $0.50-2/月(取决于数据保留情况)
- **Athena 查询**:约 $0.10-1/月(取决于查询频率)
- **总计**:$0.60-3/月
#### 中型组织(500-1000 用户)
- **DynamoDB**:$2-5/月(超出免费额度)
- **Lambda**:$0-2/月(增加导出的执行时间)
- **S3 存储**:$2-8/月(数据量更大,经生命周期优化)
- **Athena**:$1-5/月(更频繁的分析)
- **总计**:$5-20/月
#### 大型组织(1000+ 用户)
- **DynamoDB**:$10-25/月
- **Lambda**:$2-10/月
- **S3 存储**:$5-20/月(配置了生命周期策略)
- **Athena**:$5-15/月
- **Glue**:$1-5/月(爬虫程序执行)
- **总计**:$23-75/月
**注意**:成本不包含 SNS 告警(极少,约每 1000 封邮件 $0.10)
### 成本优化功能
1. **S3 生命周期策略**:自动将数据转移到更便宜的存储类别
- Standard (30 天) → Standard-IA (90 天) → Glacier (365 天) → Deep Archive
- 对于较早的数据,可降低 80-95% 的存储成本
2. **Parquet 格式**:比 JSON 小 70-90%,从而降低存储和查询成本
3. **分区数据**:Athena 仅扫描相关分区,降低查询成本
4. **条件部署**:如果只需要实时监控,可禁用分析
## 查询数据
### 实时查询 (DynamoDB)
非常适合查询近期数据(过去 30-90 天)和进行运维监控。
#### 使用 AWS 管理控制台
1. 在 AWS 管理控制台中导航到 DynamoDB
2. 选择事件表(例如 `iam-activity-tracker-events`)
3. 使用 Query 或 Scan 加筛选条件
#### 使用 AWS CLI
```
# 按用户查询事件
aws dynamodb query \
--table-name iam-activity-tracker-events \
--index-name user_name-index \
--key-condition-expression "user_name = :username" \
--expression-attribute-values '{":username":{"S":"alice.johnson"}}'
# 按操作查询事件
aws dynamodb query \
--table-name iam-activity-tracker-events \
--index-name event_name-index \
--key-condition-expression "event_name = :eventname" \
--expression-attribute-values '{":eventname":{"S":"CreateUser"}}'
```
### 分析查询 (Athena)
非常适合历史分析、合规报告和复杂查询。
#### 快速设置
**选项 1:自动(推荐)**
系统会在部署初始化期间自动设置 Athena。
**选项 2:手动设置**
如果您跳过了初始化,请在首次导出后运行此命令:
```
make setup-athena
```
**选项 3:稍后初始化**
如果您部署时未进行初始化,随时可以运行此命令:
```
make init
```

#### 预构建的安全查询
```
# 列出所有可用查询
make list-queries
# 运行特定的安全分析(表格格式 - 默认)
make run-query Q=failed_auth # Failed authentication attempts
make run-query Q=root_usage # Root account activity
make run-query Q=off_hours # After-hours access
make run-query Q=active_users # Most active users
make run-query Q=permission_changes # IAM permission modifications
make run-query Q=role_assumptions # Role usage patterns
make run-query Q=daily_summary # Compliance reporting
# SSO/Identity Center 查询
make run-query Q=sso_permission_sets # SSO permission set changes
make run-query Q=sso_account_assignments # Account access grants
make run-query Q=sso_admin_policies # Admin policy attachments
make run-query Q=sso_admin_users # SSO administrators
make run-query Q=sso_activity_summary # SSO usage overview
# 用于获取完整数据的 JSON 格式(所有查询均支持这两种格式!)
make run-query Q=failed_auth FORMAT=json # Any IAM query
make run-query Q=root_usage FORMAT=json
make run-query Q=sso_account_assignments FORMAT=json # Any SSO query
make run-query Q=sso_admin_policies FORMAT=json
make run-query Q=active_users FORMAT=json # Any analytics query
```
#### 输出格式
**所有查询均支持两种输出格式:**
- **表格格式(默认)**:显示经过精心挑选的字段,并进行了优化以防止截断。非常适合快速分析和报告。
- **JSON 格式**:返回包含所有可用字段的完整数据。非常适合详细调查或数据导出。
```
# 示例 - 每个查询都适用于这两种格式
make run-query Q=user_lookup # Table format (default)
make run-query Q=user_lookup FORMAT=table # Explicit table format
make run-query Q=user_lookup FORMAT=json # JSON format with all fields
make run-query Q=sso_admin_policies # Table format (default)
make run-query Q=sso_admin_policies FORMAT=json # Complete data
```
#### 直接使用 Athena 控制台
对于更喜欢直接使用 AWS Athena 控制台的用户,所有查询均以即用型 SQL 的形式提供:
```
# 以 SQL 格式查看所有查询
cat queries/analytics_queries.sql
# 将任何查询直接复制/粘贴到 Athena 控制台
# 查询使用默认表:iam_activity_tracker_database.iam_events
```
`queries/analytics_queries.sql` 文件包含所有 15 个标准 SQL 格式的查询,与 Python 实现同步。非常适合用于:
- **自定义修改**:根据特定要求编辑查询
- **学习**:了解每种安全分析背后的 SQL 逻辑
- **集成**:与 CLI 之外的其他工具结合使用

**查询输出示例:**

#### 自定义 SQL 查询
```
-- Recent failed authentication attempts
SELECT
substr(event_time, 1, 10) as event_date,
user_name,
source_ip,
event_name,
error_code,
COUNT(*) as failure_count
FROM iam_activity_tracker_database.iam_events
WHERE
substr(event_time, 1, 10) >= cast(current_date - INTERVAL '7' DAY as varchar)
AND error_code IS NOT NULL AND error_code != ''
AND event_name IN ('ConsoleLogin', 'AssumeRole', 'GetSessionToken')
GROUP BY 1, 2, 3, 4, 5
ORDER BY failure_count DESC;
-- Permission changes by user
SELECT
user_name,
event_name,
COUNT(*) as change_count,
MIN(substr(event_time, 1, 10)) as first_change,
MAX(substr(event_time, 1, 10)) as last_change
FROM iam_activity_tracker_database.iam_events
WHERE
substr(event_time, 1, 10) >= cast(current_date - INTERVAL '30' DAY as varchar)
AND event_name IN (
'AttachUserPolicy', 'DetachUserPolicy',
'AttachGroupPolicy', 'DetachGroupPolicy',
'AttachRolePolicy', 'DetachRolePolicy',
'CreateUser', 'DeleteUser',
'CreateRole', 'DeleteRole',
'PutUserPolicy', 'DeleteUserPolicy'
)
GROUP BY user_name, event_name
ORDER BY change_count DESC;
-- Role assumption patterns
SELECT
JSON_EXTRACT_SCALAR(request_parameters, '$.roleArn') as role_arn,
user_name,
COUNT(*) as assumption_count,
COUNT(CASE WHEN error_code IS NOT NULL AND error_code != '' THEN 1 END) as failed_count
FROM iam_activity_tracker_database.iam_events
WHERE
substr(event_time, 1, 10) >= cast(current_date - INTERVAL '30' DAY as varchar)
AND event_name = 'AssumeRole'
AND JSON_EXTRACT_SCALAR(request_parameters, '$.roleArn') IS NOT NULL
GROUP BY 1, 2
ORDER BY assumption_count DESC
LIMIT 20;
```
### 输出示例
该工具为所有查询提供丰富且格式化的输出,并附带执行指标:

### 查询对比
| 功能 | DynamoDB | Athena |
|---------|----------|--------|
| **最适合** | 实时、近期数据 | 历史分析、复杂查询 |
| **时间范围** | 所有数据(默认无 TTL) | 所有已导出的数据 |
| **查询语言** | DynamoDB Query/Scan | 标准 SQL |
| **性能** | 毫秒级 | 秒到分钟级 |
| **成本** | 适用于免费额度 | 按扫描的 TB 数量付费 |
| **复杂性** | 简单筛选 | 复杂的连接、聚合 |
## 监控
### CloudWatch 告警
该解决方案包含针对以下内容的 CloudWatch 告警:
- **Tracker Lambda**:错误和过长的执行时间(>4 分钟)
- **导出 Lambda**:错误和过长的执行时间(>13 分钟)
### 查看日志
```
# 通过自动格式化查看 tracker Lambda 日志
make logs
# 查看特定的 log group
make logs | grep ERROR # Filter for errors
make logs | grep CRITICAL # Filter for critical alerts
```
### 健康检查
```
# 检查 stack 状态和输出
make status
# 测试特定查询
make run-query Q=failed_auth
```
## 维护
### 数据保留
默认情况下,事件会无限期保留。要启用自动删除:
1. 编辑 `template.yaml`
2. 将 TTL 配置添加到 IAMEventsTable
3. 重新部署堆栈
### 更新解决方案
```
# 拉取最新更改
git pull
# 更新部署
make update
```
## 故障排除
### 数据收集问题
1. **“Access Denied” 错误**
- 确保 Lambda 具有在所有区域读取 CloudTrail 的权限
- 验证 CloudTrail 是否已启用(检查 AWS 管理控制台 → CloudTrail)
- 检查附加到追踪器 Lambda 角色的 IAM 策略
2. **追踪器 Lambda 执行时间过长**
- 如果遇到 API 速率限制,请减少 MAX_WORKERS
- 考虑增加计划时间间隔以降低频率
- 检查 CloudWatch 指标以查看是否有限流
3. **事件丢失**
- 验证 PROCESS_IAM_EVENTS 和 PROCESS_STS_EVENTS 是否为 true
- 检查 CloudWatch 日志中是否存在特定于区域的错误
- 确保可以访问所有必需的 AWS 区域
### 分析问题
4. **S3 存储桶中无数据**
- 检查导出 Lambda 日志是否存在错误
- 验证 ENABLE_ANALYTICS 是否设置为 true
- 确保在导出运行前 DynamoDB 中已存在数据
- 检查 S3 存储桶权限
5. **Athena 查询未返回结果**
- 运行 Glue 爬虫程序以发现新分区:
aws glue start-crawler --name iam-activity-tracker-crawler
- 验证 Athena 表定义中的 S3 数据位置
- 检查分区投影配置
6. **Athena 成本过高**
- 在测试期间的查询中使用 LIMIT
- 添加日期筛选器以减少扫描的数据量
- 检查查询执行计划
- 考虑进行分区修剪
7. **导出 Lambda 超时**
- 减小 EXPORT_DAYS_BACK 以减少每次运行处理的天数
- 增加 Lambda 内存(当前为 2048MB)
- 检查 DynamoDB 是否存在限流问题
### 性能优化
8. **查询性能缓慢**
- 在 DynamoDB 中使用适当的索引
- 在 Athena 查询中添加分区筛选器
- 考虑在 Athena 中使用列式投影
9. **成本优化**
- 启用 S3 生命周期策略(自动配置)
- 如果不需要实时分析,则降低查询频率
- 使用 Athena 工作组设置查询限制
### 调试模式
要启用详细日志记录,请更新 CloudFormation 堆栈参数:
- 在部署期间将 `LogLevel` 参数设置为 `DEBUG`
### 验证命令
```
# 检查 DynamoDB 表
aws dynamodb describe-table --table-name iam-activity-tracker-events
# 检查 S3 bucket(如果启用了分析)
aws s3 ls s3://iam-activity-tracker-analytics-ACCOUNT_ID/iam-events/ --recursive | head -5
# 测试查询
make run-query Q=daily_summary
```
## 安全注意事项
- Lambda 函数仅具有对 CloudTrail 的只读访问权限
- DynamoDB 表进行了静态加密
- 日志中不包含任何凭证或敏感数据
- 遵循最小权限原则
## 卸载
要移除所有资源:
```
make destroy
```
**警告**:这将删除所有收集到的事件数据!
**重要**:如果启用了分析功能,请在运行销毁命令前手动清空 S3 存储桶:
```
aws s3 rm s3://iam-activity-tracker-analytics-ACCOUNT_ID/ --recursive
aws s3 rm s3://iam-activity-tracker-athena-results-ACCOUNT_ID/ --recursive
```
## 贡献
欢迎贡献!请:
1. Fork 本仓库
2. 创建一个功能分支
3. 提交一个 pull request
## 许可证
该项目基于 MIT 许可证授权 - 详情请参阅 LICENSE 文件。
## 支持
如有问题或疑问:
1. 查看故障排除部分
2. 查看 CloudWatch 日志
3. 在仓库中提出一个 issue
## 可用查询
### 预构建查询(共 15 个)
#### IAM 和安全查询
1. `user_lookup` - 用户活动模式
2. `failed_auth` - 失败的身份验证尝试
3. `root_usage` - Root 账户活动
4. `off_hours` - 非工作时间访问(晚上 10 点 - 早上 6 点)
5. `active_users` - 最活跃的用户
6. `permission_changes` - IAM 策略修改
7. `role_assumptions` - 角色使用模式
8. `daily_summary` - 每日活动汇总
9. `hourly_activity` - 高峰使用分析
#### SSO/Identity Center 查询
10. `sso_permission_sets` - 追踪 SSO 权限集的创建和更新
11. `sso_account_assignments` - 监控谁正在获得对哪些 AWS 账户的访问权限
12. `sso_admin_policies` - 追踪危险的管理策略附加操作
13. `sso_applications` - 监控第三方应用程序集成
14. `sso_admin_users` - 识别进行 SSO 配置更改的用户
15. `sso_activity_summary` - SSO 使用模式和错误率
### 安全告警(8 项功能)
1. Root 账户活动(登录/失败)
2. IAM 用户创建
3. 管理员策略附加
4. 危险的内联策略
5. 访问密钥创建
6. 角色信任策略问题
7. 访问密钥更新
8. MFA 设备更改
## 文件结构
```
iam-activity-tracker/
├── assets/ # Screenshots and documentation
│ ├── Failed_Auth.png
│ └── List_Queries.png
├── functions/ # Lambda function code
│ ├── tracker/ # Real-time event collection
│ │ ├── handler.py # Main tracker Lambda
│ │ ├── cloudtrail_processor.py
│ │ ├── dynamodb_operations.py
│ │ ├── security_alerts.py # SNS alerting logic
│ │ └── requirements.txt
│ └── exporter/ # S3 analytics export
│ ├── export_handler.py # Export Lambda
│ ├── parquet_processor.py
│ ├── s3_operations.py
│ ├── dynamodb_operations.py
│ └── requirements.txt
├── queries/ # Analytics tools
│ ├── athena_utilities.py # Athena integration
│ ├── query_runner.py # CLI query tool
│ ├── analytics_queries.sql # Pre-built SQL queries
│ ├── setup.sh # Python environment setup
│ └── requirements.txt
├── scripts/ # Operational scripts
│ ├── deploy.sh # Deployment script
│ ├── destroy.sh # Cleanup script
│ ├── logs.sh # View Lambda logs
│ ├── run-query.sh # Query execution wrapper
│ ├── setup-athena.sh # Athena table setup
│ ├── status.sh # Stack status check
│ ├── test-alerts.sh # Test alert system
│ └── validate.sh # Template validation
├── template.yaml # SAM deployment template
├── Makefile # Build automation
├── Architecture.md # Detailed system design
└── README.md # This file
```
为 AWS 安全社区而构建