0x1kp/CrossCloudRoleSanityChecker
GitHub: 0x1kp/CrossCloudRoleSanityChecker
跨云数据同步前的 IAM 权限与存储配置安全预检工具,同时验证 AWS 和 GCP 的最小权限原则和加密合规性。
Stars: 1 | Forks: 0
# 跨云角色健全性检查器
一款命令行安全预检工具,用于在跨云数据传输之前验证 AWS IAM 角色 和 GCP 服务账号。它会检查过度宽松的权限、不安全的信任策略、公开的存储桶暴露、缺失的加密以及危险的服务账号配置,然后生成包含所有发现的结构化报告。
其预期用例是在执行针对 GCP 的 AWS DataSync 作业等操作之前,将此工具作为关卡运行。在这种场景下,任何一方的错误配置角色都可能导致权限提升、数据泄露或未授权访问。
## 目录
- [检查内容](#what-it-checks)
- [项目结构](#project-structure)
- [前置条件](#prerequisites)
- [安装说明](#installation)
- [配置](#configuration)
- [用法](#usage)
- [输出格式](#output-formats)
- [安全注意事项](#security-considerations)
- [所需 IAM 权限](#required-iam-permissions)
- [局限性](#limitations)
- [运行测试](#running-tests)
- [CI/CD](#cicd)
## 检查内容
该工具总共运行八项检查:四项针对 AWS,四项针对 GCP。
### AWS 检查
| 检查项 | 源函数 | 检测内容 |
|-------|----------------|-----------------|
| IAM 角色权限 | `check_iam_role_permissions` | 附加到角色的任何托管策略中的通配符操作(`*` 或 `service:*`) |
| 信任策略 | `check_trust_policy` | 授予所有 AWS 主体(`"AWS": "*"`)或所有服务(`"Service": "*"`)访问权限的 Assume-role 信任策略 |
| S3 存储桶加密 | `check_s3_bucket_encryption` | 未启用服务器端加密的 S3 存储桶 |
| S3 公开访问阻断 | `check_s3_public_access` | 账户级 S3 公开访问阻断设置未完全生效 |
### GCP 检查
| 检查项 | 源函数 | 检测内容 |
|-------|----------------|-----------------|
| 服务账号 IAM 绑定 | `check_gcp_service_account_permissions` | 授予服务账号危险角色(`roles/owner`、`roles/editor`、`roles/iam.securityAdmin`、`roles/iam.serviceAccountAdmin`、`roles/iam.serviceAccountKeyAdmin`、`roles/iam.serviceAccountTokenCreator`、`roles/resourcemanager.projectIamAdmin`、`roles/resourcemanager.organizationAdmin`)的项目级 IAM 绑定 |
| 服务账号密钥 | `check_service_account_keys` | 用户管理的服务账号密钥,由于其不会自动轮换且可能被窃取,因此存在安全风险 |
| GCS 存储桶公开访问 | `check_gcs_bucket_public_access` | 包含 `allUsers` 或 `allAuthenticatedUsers` 的 GCS 存储桶 IAM 绑定 |
| GCS 存储桶加密 | `check_gcs_bucket_encryption` | 未配置客户管理加密密钥 (CMEK) 的 GCS 存储桶 |
每项检查均独立运行。如果一项检查失败(例如,由于权限缺失),其余检查仍会继续执行,且失败信息会作为报告中的 `ERROR:` 行项目被记录。
## 项目结构
```
CrossCloudRoleSanityChecker/
.github/
workflows/
ci.yml # GitHub Actions CI pipeline
src/
main.py # CLI entry point and check orchestration
config.py # Configuration constants (regions, bucket names, project IDs)
aws_checks.py # AWS IAM and S3 security checks
gcp_checks.py # GCP IAM and GCS security checks
reporting.py # Markdown and JSON report generation
tests/
test_aws_checks.py # Unit tests for AWS checks (17 tests)
test_gcp_checks.py # Unit tests for GCP checks (18 tests)
.gitignore
requirements.txt
README.md
```
## 前置条件
- **Python 3.10 或更高版本。** 代码库使用了 `list[str]` 和 `set[str]` 内置泛型语法,这需要 Python 3.9+。推荐使用 Python 3.10+。
- **已配置 AWS 凭证。** 该工具使用 `boto3`,它会从标准 AWS 凭证链读取凭证:环境变量(`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`)、`~/.aws/credentials` 文件或 IAM 实例配置文件。如果您尚未配置,请使用 `aws configure` 配置一个配置文件。
- **已配置 GCP 应用默认凭证。** 该工具使用 `google.auth.default()` 获取凭证。可以通过运行 `gcloud auth application-default login`,或将 `GOOGLE_APPLICATION_CREDENTIALS` 环境变量设置为服务账号 JSON 密钥文件的路径来进行配置。
## 安装说明
克隆仓库并安装 Python 依赖:
```
git clone
cd CrossCloudRoleSanityChecker
pip install -r requirements.txt
```
依赖包括:
| 包名 | 用途 |
|---------|---------|
| `boto3` | 用于 IAM 和 S3 API 调用的 AWS SDK |
| `google-cloud-storage` | GCS 存储桶检查 |
| `google-cloud-iam` | GCP IAM 操作 |
| `google-api-python-client` | Cloud Resource Manager 和 IAM Admin API 访问 |
| `google-auth` | 应用默认凭证解析 |
| `google-auth-httplib2` | Google auth 的 HTTP 传输 |
| `google-auth-oauthlib` | OAuth2 认证流程支持 |
## 配置
在运行工具之前,编辑 `src/config.py` 以匹配您的环境:
```
# AWS 配置
AWS_REGION = "us-east-1" # AWS region for API calls
S3_BUCKET_NAME = "my-source-bucket" # S3 bucket to check encryption and public access
AWS_PROFILE = "secure-sync" # AWS CLI profile name
# GCP 配置
GCP_PROJECT_ID = "my-gcp-project" # Fallback project ID if not extractable from the service account email
GCS_BUCKET_NAME = "my-target-bucket" # GCS bucket to check public access and CMEK
GOOGLE_APPLICATION_CREDENTIALS = "/path/to/your/service_account.json"
# 报告配置
OUTPUT_FORMAT = "markdown" # Default output format: 'markdown' or 'json'
ENABLE_STRICT_MODE = True # Enforce strict IAM role policy rules
```
**关于 GCP 项目 ID 解析的说明:** 该工具从 GCP 服务账号邮箱地址中提取项目 ID(标准格式为 `NAME@PROJECT_ID.iam.gserviceaccount.com`)。如果邮箱不遵循此格式(例如,Compute Engine 默认服务账号使用 `NUMBER-compute@developer.gserviceaccount.com`),工具将回退使用 `config.py` 中的 `GCP_PROJECT_ID`。
## 用法
从仓库根目录运行该工具:
```
python src/main.py \
--aws-role my-data-sync-role \
--gcp-account my-svc-account@my-gcp-project.iam.gserviceaccount.com \
--output-format markdown
```
### 命令行参数
| 参数 | 必需 | 默认值 | 描述 |
|----------|----------|---------|-------------|
| `--aws-role` | 是 | -- | 要检查的 AWS IAM 角色名称(不是 ARN,仅角色名) |
| `--gcp-account` | 是 | -- | 要检查的 GCP 服务账号的完整邮箱地址 |
| `--output-format` | 否 | `markdown` | 报告格式:`markdown` 用于人类可读输出,`json` 用于机器可读输出 |
### 运行示例
```
$ python src/main.py \
--aws-role DataSyncRole \
--gcp-account sync-sa@my-project.iam.gserviceaccount.com \
--output-format markdown
Running AWS checks...
Checking IAM role permissions...
Checking trust policy...
Checking S3 bucket encryption...
Checking S3 public access block...
Running GCP checks...
Checking service account IAM bindings...
Checking service account keys...
Checking GCS bucket public access...
Checking GCS bucket encryption...
# Security Preflight Check Report
## AWS IAM Role 问题
- Policy AdminAccess grants overly permissive access: *
- Trust policy allows all principals (*)
## GCP IAM Service Account 问题
- Service account sync-sa@my-project.iam.gserviceaccount.com has dangerous role 'roles/editor' on project my-project
- GCS bucket my-target-bucket does not use a Customer-Managed Encryption Key (CMEK)
```
如果所有检查都顺利通过,报告各部分标题下将显示 `- None`。
## 输出格式
### Markdown (默认)
生成打印到标准输出的人类可读报告,包含 AWS 和 GCP 问题的标题。每个问题为一个要点。适合粘贴到 Pull Request、Slack 消息或审计日志中。
### JSON
生成一个包含两个键(`aws` 和 `gcp`)的 JSON 对象,每个键包含一个问题字符串数组:
```
{
"aws": [
"Policy AdminAccess grants overly permissive access: *"
],
"gcp": [
"GCS bucket my-target-bucket does not use a Customer-Managed Encryption Key (CMEK)"
]
}
```
适合通过管道传输给 `jq`、摄入监控系统或在自动化脚本中处理。使用 `--output-format json` 启用。
## 安全注意事项
此工具设计为可安全地在生产云环境中运行。
**仅限读取 API 调用。** 此工具发出的每个 AWS 和 GCP API 调用均为读取操作。该工具从不创建、修改或删除任何云资源。使用的具体 API 方法包括:`iam:ListAttachedRolePolicies`、`iam:GetPolicy`、`iam:GetPolicyVersion`、`iam:GetRole`、`s3:GetBucketEncryption`、`s3control:GetPublicAccessBlock`、`sts:GetCallerIdentity`、`cloudresourcemanager.projects.getIamPolicy`、`iam.projects.serviceAccounts.keys.list`、GCS `bucket.get_iam_policy` 和 GCS `bucket.default_kms_key_name`。
**无凭证存储。** 该工具不存储、缓存、记录或传输凭证。它完全依赖于运行时环境中已配置的现有 AWS 凭证链(环境变量、`~/.aws/credentials` 或实例配置文件)和 GCP 应用默认凭证。
**无数据访问。** 该工具不读取、复制、列出或传输 S3 或 GCS 存储桶中的任何对象或数据。它仅检查 IAM 策略和存储桶级配置元数据。
**无网络出站。** 所有输出均打印到标准输出。该工具不会将结果发送到任何外部服务、Webhook、端点或遥测系统。
**无权限提升。** 该工具仅需要读取级别的 IAM 权限。它不请求、代入或使用任何资源的写入权限。有关确切列表,请参阅 [所需 IAM 权限](#required-iam-permissions) 部分。
**故障隔离。** 八项检查中的每一项都在 try/except 包装器内独立运行。一项检查的失败(例如,`s3control:GetPublicAccessBlock` 上的权限错误)不会阻止其余七项检查完成。失败将以带 `ERROR:` 前缀的条目显示在报告中。
## 所需 IAM 权限
### AWS
用于运行此工具的 AWS 凭证必须具有以下 IAM 权限:
```
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:ListAttachedRolePolicies",
"iam:GetPolicy",
"iam:GetPolicyVersion",
"iam:GetRole",
"s3:GetEncryptionConfiguration",
"s3control:GetPublicAccessBlock",
"sts:GetCallerIdentity"
],
"Resource": "*"
}
]
}
```
这完全是只读的。这些操作均不允许修改任何 AWS 资源。
### GCP
用于运行此工具的 GCP 凭证必须在目标项目上具有以下 IAM 权限:
| 权限 | 典型角色 | 使用方 |
|------------|-------------|---------|
| `resourcemanager.projects.getIamPolicy` | `roles/browser` 或 `roles/viewer` | `check_gcp_service_account_permissions` |
| `iam.serviceAccountKeys.list` | `roles/iam.serviceAccountViewer` | `check_service_account_keys` |
| `storage.buckets.getIamPolicy` | `roles/storage.admin` 或自定义 | `check_gcs_bucket_public_access` |
| `storage.buckets.get` | `roles/storage.objectViewer` 或更高 | `check_gcs_bucket_encryption` |
所有这些都是只读权限。
## 局限性
- **GCP 检查仅检查项目级 IAM 绑定。** 不会评估组织级和文件夹级 IAM 绑定。服务账号可能从 GCP 资源层次结构的更高级别继承危险角色,而此工具无法检测到。
- **AWS 检查仅覆盖附加的托管策略。** 不检查直接嵌入在 IAM 角色上的内联策略。一个没有托管策略附件但具有宽松内联策略的角色将不会被标记。
- **无递归策略评估。** 该工具按字面值检查通配符操作。它不通过 IAM 权限边界、AWS Service Control Policies (SCP) 或基于资源的策略来评估有效权限。一个角色可能看起来很干净,但仍可能通过其他策略机制拥有广泛的访问权限。
- **单角色范围。** 该工具每次调用检查一个 AWS IAM 角色和一个 GCP 服务账号。它不会扫描整个 AWS 账户或 GCP 项目中的所有角色和服务账号。
- **无凭证验证。** 该工具假定已配置有效凭证,且指定的角色名和服务账号邮箱存在。如果不存在,相应的检查将失败,并在报告中捕获 API 错误。
- **S3 公开访问检查是账户级的。** `check_s3_public_access` 函数检查账户级的 S3 公开访问阻断配置,而不是单个存储桶级的设置。一个存储桶可能拥有自己的公开访问设置,与账户默认值不同。
- **GCS CMEK 检查仅限元数据。** 该工具检查存储桶上是否设置了 `default_kms_key_name`。它不验证引用的 KMS 密钥是否有效、处于活动状态或可访问。
- **无条件绑定评估。** GCP IAM 绑定可能包含限制角色授权何时生效的 IAM 条件。该工具不评估这些条件,并且会将条件性 `roles/owner` 绑定与无条件绑定一样标记。
## 运行测试
测试套件使用 `pytest` 和 `unittest.mock` 来模拟所有 AWS 和 GCP API 调用。运行测试不需要云凭证。
安装 pytest 并运行完整套件:
```
pip install pytest
pytest tests/ -v
```
预期输出:
```
tests/test_aws_checks.py - 17 tests (IAM permissions, trust policy, S3 encryption, S3 public access)
tests/test_gcp_checks.py - 18 tests (project ID extraction, IAM bindings, SA keys, GCS public access, GCS encryption)
35 passed
```
运行单个模块的测试:
```
pytest tests/test_aws_checks.py -v
pytest tests/test_gcp_checks.py -v
```
## CI/CD
仓库包含位于 `.github/workflows/ci.yml` 的 GitHub Actions 工作流,该工作流在每次推送到 `main` 分支和 Pull Request 时运行。
流水线:
1. 检出仓库
2. 设置 Python 3.11 并启用 pip 依赖缓存
3. 从 `requirements.txt` 安装生产依赖和 `pytest`
4. 运行 `pytest tests/`
CI 中不需要云凭证,因为所有测试都使用模拟的 API 客户端。
标签:AWS, DevSecOps, DPI, GCP, IAM 合规性, Modbus, PE 加载器, S3 加密, Streamlit, 上游代理, 关系图谱, 基线检查, 多云管理, 存储安全, 数据同步安全, 最小权限, 权限审计, 横向移动防御, 漏洞探索, 特权升级检测, 访问控制, 逆向工具, 配置检测, 预检脚本