cloudgamble/gcp-iam-audit

GitHub: cloudgamble/gcp-iam-audit

一款 GCP 组织级 IAM 审计工具,用于发现违反「联合身份、零静态凭证」原则的非联合访问和权限配置问题,并结合最后使用时间帮助团队排序清理。

Stars: 0 | Forks: 0

# gcp-iam-audit 查找 GCP 组织中的非联合访问,并报告其最后使用时间。 **原则:**联合身份,永不生成凭证。工作负载应通过 Workload Identity Federation(或 GKE Workload Identity)接入 GCP,人类应通过 联合工作区身份接入 —— 并且不应持有任何静态密钥。此工具标记的任何内容都是违反、偏离或未执行该原则的地方。 GCP 的 IAM 模型是累加且向下继承的:没有可供读取的策略文档,授权会不断累积,且没有任何机制将其收回。实际后果是可以预见的 —— 基础角色蔓延、服务账号密钥泛滥,以及无人记得创建过的绑定。该工具正是对此进行清单梳理(覆盖整个组织),并结合最后使用数据,以便自动对清理列表进行排序。 ## 检测内容 | 发现项 | 严重性 | 含义 | |---|---|---| | `UNUSED_SA_KEY` | HIGH | 用户管理的密钥超过 90 天未使用(或在观测窗口内从未使用)—— 删除它 | | `USER_MANAGED_SA_KEY` | MEDIUM | 活动的静态凭证 —— 将工作负载迁移至 Workload Identity Federation | | `PUBLIC_PRINCIPAL` | HIGH | 在项目 IAM 上存在 `allUsers` / `allAuthenticatedUsers` | | `FOREIGN_DOMAIN_USER` | HIGH | 来自可信域之外的直接 `user:` 授权 | | `PRIMITIVE_ROLE_USER` / `_SA` | HIGH/MED | owner/editor/viewer 绑定 —— 永远不会被收回的授权 | | `KEY_MINTING_ALLOWED` | HIGH | 组织未强制执行 `iam.disableServiceAccountKeyCreation` —— 该原则形同虚设 | | `DOMAIN_BINDING`, `GROUP_OWNER`, `DELETED_PRINCIPAL` | MED/LOW | 卫生与治理偏移 | | `SKIPPED` | — | 凭证无法读取的项目 —— 会被报告,而不是静默地视为干净 | 联合绑定(`principal://`, `principalSet://`)被计为目标状态, 因此摘要也可作为迁移进度的衡量指标:联合绑定增加, 静态密钥减少。 ## 修复映射 发现项映射到强制执行,而不仅仅是清理 —— 关键在于让这一类发现项以后不再可能出现: | 发现项类别 | 根本性修复方案 | |---|---| | SA keys | Workload Identity Federation / GKE Workload Identity,然后配合带有有时限项目例外的组织策略 `iam.disableServiceAccountKeyCreation` | | Primitive roles | 最小权限的预定义/自定义角色;对新 owner/editor 授权使用 IAM Deny | | Public / foreign principals | 组织策略 `iam.allowedPolicyMemberDomains`(限制域共享) | ## 设置 ``` pip install -r requirements.txt gcloud auth application-default login gcloud auth application-default set-quota-project gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com \ policyanalyzer.googleapis.com orgpolicy.googleapis.com --project ``` 必须在配额项目上启用相应的 API(`policyanalyzer` 可选 —— 用于获取最后认证数据;`orgpolicy` 可选 —— 用于进行密钥生成检查)。被禁用的 API 会在报告中显示为带有 403 原因的分阶段 SKIPPED 行,而不是作为一个被静默忽略的缺口。仅需读取权限;在扫描范围上拥有 `roles/iam.securityReviewer` 以及 `roles/browser` 即可涵盖所有内容。此工具发出的每一个调用都是 get/list/search/query —— 它永远不会修改任何内容。 ## 用法 ``` # 你的 credential 能看到的一切 ./gcp_iam_audit.py # 整个 org — BFS 遍历 folder tree,并进行 last-auth 查找 ./gcp_iam_audit.py --org 123456789012 --trusted-domain example.com # 快速通过,不调用 Policy Analyzer ./gcp_iam_audit.py --org 123456789012 --skip-last-auth ``` 输出:将排好序的摘要输出到 stdout,将完整的发现结果输出到 CSV(每个发现结果占一行,并各自附带具体的建议)。 ## 路线图 - `project-baseline` —— 根据安全默认的创建基线扫描(并在明确许可下修复)项目:启用所需的 API,开启 Data Access 审计日志,并将日志路由至组织汇总接收器。源于此工具首次实际运行时偶然发现了被禁用的 API。 - `abandoned-projects` —— 多信号废弃项目检测器(API 活动、支出、IAM 变更近期性) - `org-policy-baseline` —— 审计层级结构中哪个节点设置了哪些防护栏约束,以及哪些地方的继承被覆盖了 - `gke-workload-identity` —— 仍在使用节点服务账号或遗留元数据的集群/pod
标签:GCP, IAM, 权限审计, 身份治理, 逆向工具