exho-rose/cloud-iam-auditor

GitHub: exho-rose/cloud-iam-auditor

一个轻量级 Python AWS IAM 安全审计 CLI,检测通配符策略、过期密钥、缺失 MFA、开放安全组和公开 S3 桶等常见云配置问题。

Stars: 0 | Forks: 0

# cloud-iam-auditor 一个小型 Python CLI,用于审计 AWS 账户的 IAM 策略、访问密钥、MFA 覆盖率、EC2 安全组和 S3 存储桶暴露情况,以发现常见的错误配置。它使用 `boto3` 构建,既可以针对真实的 AWS 账户运行,也可以完全离线针对形状类似于真实 boto3 API 响应的本地 JSON 固定数据运行。 检测逻辑与数据获取是解耦的:每个 `check_*()` 函数都将纯 Python 数据(列表/字典)作为输入,而不是 boto3 client。每个检查系列都有两个加载器来产生相同的标准化数据结构 —— 一个读取 JSON 固定数据 (`--mock`),另一个调用实时的 boto3 API(真实模式)—— 因此在两种情况下都会执行完全相同的代码路径。 ## 检查项 | ID | 检查项 | 标记内容 | 默认严重程度 | |--------|---------------------------------|--------------------------------------------------------------------------------|-------------------| | IAM001 | 管理员通配符 IAM 策略 | 包含 `Effect: Allow`、`Action: "*"` 和 `Resource: "*"`(或包含 `"*"` 的列表)的托管或内联策略声明 | CRITICAL | | IAM002 | 过期的活跃访问密钥 | `Status: Active` 且超过可配置阈值(默认 90 天)的访问密钥 | HIGH | | IAM003 | 无 MFA 的控制台访问 | 拥有控制台登录配置文件(密码)且未注册任何 MFA 设备的 IAM 用户 | CRITICAL | | NET001 | 开放式安全组入站规则 | 在敏感端口 (22, 23, 3389, 3306, 5432, 1433, 27017, 6379, 9200, 5601) 上允许 `0.0.0.0/0` / `::/0` 的 EC2 安全组入站规则 | CRITICAL | | S3001 | 可公开访问的 S3 存储桶 | 通过 ACL 授权 (`AllUsers`/`AuthenticatedUsers`) 或存储桶策略实际变为公开的存储桶,并考虑到每个存储桶的 Public Access Block 配置 | CRITICAL | ## 项目结构 ``` cloud_auditor/__main__.py # argparse CLI cloud_auditor/report.py # Finding + Report (text / JSON rendering) cloud_auditor/checks/ # iam_policies.py, access_keys.py, mfa.py, # security_groups.py, s3_public.py (one check family each) fixtures/{iam,ec2,s3}/ # boto3-response-shaped sample data (compliant + non-compliant) tests/ # pytest suite against fixtures + moto-based real-mode tests ``` ## 安装说明 ``` git clone cloud-iam-auditor cd cloud-iam-auditor python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt # boto3 only, enough to run --mock or real mode pip install -r requirements-dev.txt # + pytest, moto, for running the test suite ``` ## 用法 ### 模拟模式(无需 AWS 凭证) 完全针对 `fixtures/` 中的 JSON 固定数据运行,这些数据模拟了合规和不合规的资源,使得该工具可以完全在离线状态下进行演示: ``` python -m cloud_auditor --mock ``` ``` ============================================================================== cloud-iam-auditor - Findings Report ============================================================================== Summary -> CRITICAL: 10, HIGH: 3 Total findings: 13 [CRITICAL] Policy 'AdminWildcardPolicy' grants full admin access (Action:* Resource:*) Check: IAM001 Resource: arn:aws:iam::123456789012:policy/AdminWildcardPolicy Description: The managed policy 'AdminWildcardPolicy' contains a statement with Effect=Allow, Action='*' and Resource='*', granting unrestricted access to every AWS action on every resource. Remediation: Scope the policy to specific actions and resources following least privilege. [CRITICAL] Security group 'db-sg-open-mysql' allows MySQL/Aurora (port 3306) from the internet Check: NET001 Resource: sg-0fedcba9876543210 (db-sg-open-mysql) ... [HIGH] Active access key is 596 days old (threshold: 90) Check: IAM002 Resource: user/contractor-temp (AKIAEXAMPLE00000003) ... ``` JSON 输出 (`--format json`) 会将相同的发现作为一个单一对象生成: `{"total_findings": 13, "summary": {"CRITICAL": 10, "HIGH": 3, ...}, "findings": [...]}`, 每个发现都包含 `check_id`、`severity`、`resource`、`title`、`description` 和 `remediation`。 运行部分检查项、调整访问密钥有效期阈值或将其写入文件: ``` python -m cloud_auditor --mock --checks security_groups,s3_public python -m cloud_auditor --mock --max-key-age-days 30 python -m cloud_auditor --mock --format json --output report.json ``` ### 真实模式(针对真实的 AWS 账户) 真实模式根据指定的 profile 和/或 region 构建 `boto3.Session`,并调用实时的 IAM / EC2 / S3 API。不使用 `--mock` 标志即表示使用真实模式: ``` python -m cloud_auditor --profile prod --region us-east-1 python -m cloud_auditor --profile prod --region us-east-1 --format json --output findings.json ``` 运行此命令的 IAM 主体至少需要具有只读权限: `iam:ListPolicies`, `iam:GetPolicyVersion`, `iam:ListUsers`, `iam:ListUserPolicies`, `iam:GetUserPolicy`, `iam:ListAccessKeys`, `iam:GetLoginProfile`, `iam:ListMFADevices`, `ec2:DescribeSecurityGroups`, `s3:ListAllMyBuckets`, `s3:GetBucketAcl`, `s3:GetBucketPolicyStatus`, `s3:GetBucketPublicAccessBlock` —— 例如,AWS 托管的 `SecurityAudit` 策略就涵盖了所有这些权限。 如果既没有提供 `--mock` 也没有提供 `--profile`,boto3 将回退到其默认的凭证链(环境变量、`~/.aws/credentials`、实例/任务角色等)—— 在这种情况下,CLI 会向 stderr 打印一条警告,以防您意外审计了错误的账户。 ### 退出代码 如果没有发现严重程度为 `HIGH` 或 `CRITICAL` 的问题,则返回 `0`,否则返回 `1` —— 这非常适合作为 CI 中的安全门禁。 ## 运行测试 ``` source .venv/bin/activate pip install -r requirements-dev.txt pytest -v ``` 测试套件直接针对固定数据覆盖了每个检查项的正向和反向用例(例如,一个 `Action: "*"` 但 `Resource` 被限制范围的策略绝不能被标记为管理员通配符策略;一个作用域限制在私有 CIDR 或被引用的安全组上的安全组绝不能被标记为对 Internet 开放),此外还有用于端到端 CLI 行为的 `tests/test_cli.py`,以及 `tests/test_aws_real_mode.py`,它使用 `moto` 来模拟真实的 boto3 API 调用,并验证真实模式的数据加载器是否会产生与固定数据加载器相同的标准化数据结构(从而产生相同的发现)。 ## 设计说明 - **固定数据镜像真实 API 结构。** `fixtures/iam/list_policies.json` 的结构类似于 `iam.list_policies()`,按 ARN 作为键的 `fixtures/iam/policy_versions.json` 就像重复调用的 `iam.get_policy_version()`,`fixtures/ec2/security_groups.json` 就像 `ec2.describe_security_groups()`,`fixtures/s3/public_access_block.json` 就像每个存储桶的 `s3.get_public_access_block()` 等等。某个存储桶或用户仅仅是在其中一个文件中缺失,就对应于真实 API 中 boto3 调用抛出 `NoSuchEntity` / `NoSuchPublicAccessBlockConfiguration` / `NoSuchBucketPolicy` 的情况。 - **检查项永远看不到 boto3 client。** `load_*_from_fixtures(fixtures_dir)` 和 `load_*_from_aws(client)` 都会产生相同的标准化 Python 数据结构;`check_*(data)` 是纯函数,可独立测试。 - **此仓库中的任何地方都没有真实的凭证或账户 ID。** 所有固定数据均使用 AWS 文档中记录的示例账户 ID `123456789012` 以及占位符资源名称。 ## 许可证 MIT —— 见 [LICENSE](LICENSE)。
标签:AWS, DPI, IAM, Python, 安全规则引擎, 无后门, 逆向工具, 配置核查