Audits GCP IAM permissions using gcloud CLI, Policy Analyzer, and IAM Recommender to identify overly permissive bindings, primitive roles, service account key proliferation, and cross-project access risks. Useful for security assessments, compliance, and reducing privilege escalation.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
- 对 GCP 组织或项目 IAM 配置进行安全评估时
Audits GCP IAM permissions for overly permissive bindings, primitive roles, service account key proliferation, and cross-project risks using gcloud CLI, Policy Analyzer, and IAM Recommender. Ideal for security assessments and compliance reviews.
Audits GCP IAM permissions for overly permissive bindings, primitive roles, service account key proliferation, and cross-project risks using gcloud CLI, Policy Analyzer, IAM Recommender.
Performs GCP security assessments using Forseti Security, Security Command Center, and gcloud CLI. Audits IAM policies, firewall rules, storage permissions, and checks CIS GCP Foundations Benchmark compliance.
Share bugs, ideas, or general feedback.
不适用于:VPC 防火墙规则审计(使用网络安全工具)、GKE RBAC 审计(使用 Kubernetes 专用 RBAC 工具),或 IAM 操作的实时威胁检测(使用 SCC Event Threat Detection)。
roles/iam.securityReviewer 和 roles/cloudAsset.viewergcloud services enable cloudasset.googleapis.com)gcloud services enable recommender.googleapis.com)gcloud services enable policyanalyzer.googleapis.com)在组织、文件夹和项目层级列出所有 IAM 绑定,以了解完整的访问状况。
# 组织级 IAM 绑定
gcloud organizations get-iam-policy ORG_ID \
--format=json > org-iam-policy.json
# 跨组织搜索所有 IAM 策略
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--format="table(resource, policy.bindings.role, policy.bindings.members)" \
--limit=500
# 查找所有具有 Owner 角色的用户和服务账户
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--query="policy:roles/owner" \
--format="table(resource, policy.bindings.members)"
# 查找所有使用原始角色(Owner、Editor、Viewer)的绑定
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--query="policy:roles/owner OR policy:roles/editor" \
--format=json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for result in data:
resource = result.get('resource', '')
for binding in result.get('policy', {}).get('bindings', []):
role = binding.get('role', '')
if role in ['roles/owner', 'roles/editor']:
for member in binding.get('members', []):
print(f'{resource} | {role} | {member}')
"
识别权限过高、使用用户管理密钥和未使用的服务账户。
# 列出项目中所有服务账户
gcloud iam service-accounts list \
--project=PROJECT_ID \
--format="table(email, displayName, disabled)"
# 检查用户管理的密钥(应最小化)
for sa in $(gcloud iam service-accounts list --project=PROJECT_ID --format="value(email)"); do
keys=$(gcloud iam service-accounts keys list \
--iam-account="$sa" \
--managed-by=user \
--format="table(name.basename(),validAfterTime,validBeforeTime)")
if [ -n "$keys" ]; then
echo "=== $sa ==="
echo "$keys"
fi
done
# 查找所有项目中具有管理员角色的服务账户
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--query="policy.bindings.members:serviceAccount AND (policy:roles/owner OR policy:roles/editor OR policy:admin)" \
--format="table(resource, policy.bindings.role, policy.bindings.members)"
# 检查服务账户 IAM 策略(谁可以冒充)
for sa in $(gcloud iam service-accounts list --project=PROJECT_ID --format="value(email)"); do
echo "=== $sa ==="
gcloud iam service-accounts get-iam-policy "$sa" --format=json 2>/dev/null
done
利用 GCP 的 IAM Recommender 查找授予超出实际使用权限的角色。
# 列出项目的 IAM 角色建议
gcloud recommender recommendations list \
--project=PROJECT_ID \
--recommender=google.iam.policy.Recommender \
--location=global \
--format="table(name, description, priority, stateInfo.state)"
# 获取详细建议
gcloud recommender recommendations describe RECOMMENDATION_ID \
--project=PROJECT_ID \
--recommender=google.iam.policy.Recommender \
--location=global \
--format=json
# 列出 IAM 使用洞察
gcloud recommender insights list \
--project=PROJECT_ID \
--insight-type=google.iam.policy.Insight \
--location=global \
--format="table(name, description, severity, category)"
# 应用建议(审查后)
gcloud recommender recommendations mark-claimed RECOMMENDATION_ID \
--project=PROJECT_ID \
--recommender=google.iam.policy.Recommender \
--location=global \
--etag=ETAG
使用 Policy Analyzer 确定特定主体或资源的有效访问权限。
# 检查谁有权访问特定资源
gcloud asset analyze-iam-policy \
--organization=ORG_ID \
--full-resource-name="//storage.googleapis.com/projects/_/buckets/sensitive-data-bucket" \
--format="table(identityList.identities, accessControlLists.accesses.role)"
# 检查特定用户可以访问哪些资源
gcloud asset analyze-iam-policy \
--organization=ORG_ID \
--identity="user:developer@company.com" \
--format="table(accessControlLists.resources.fullResourceName, accessControlLists.accesses.role)"
# 检查谁可以执行特定操作
gcloud asset analyze-iam-policy \
--organization=ORG_ID \
--full-resource-name="//cloudresourcemanager.googleapis.com/projects/PROJECT_ID" \
--permissions="iam.serviceAccounts.actAs,iam.serviceAccountKeys.create" \
--format="table(identityList.identities, accessControlLists.accesses.permission)"
# 查找所有具有 allUsers 或 allAuthenticatedUsers 访问的主体
gcloud asset search-all-iam-policies \
--scope=organizations/ORG_ID \
--query="policy:allUsers OR policy:allAuthenticatedUsers" \
--format="table(resource, policy.bindings.role, policy.bindings.members)"
识别具有域范围委托和冒充能力的服务账户。
# 检查具有域范围委托的服务账户
# (需要 Admin SDK 访问权限列出委托账户)
gcloud iam service-accounts list --project=PROJECT_ID --format=json | python3 -c "
import json, sys
accounts = json.load(sys.stdin)
for sa in accounts:
email = sa.get('email', '')
# 检查 SA 是否启用了域范围委托
# 这需要 Admin SDK API 访问权限
print(f'SA: {email} - 请在 admin.google.com 检查委托状态')
"
# 查找其他身份可以冒充的服务账户
for sa in $(gcloud iam service-accounts list --project=PROJECT_ID --format="value(email)"); do
policy=$(gcloud iam service-accounts get-iam-policy "$sa" --format=json 2>/dev/null)
if echo "$policy" | python3 -c "
import json, sys
p = json.load(sys.stdin)
for b in p.get('bindings', []):
if b['role'] in ['roles/iam.serviceAccountTokenCreator', 'roles/iam.serviceAccountUser']:
print(f' {b[\"role\"]}: {b[\"members\"]}')
" 2>/dev/null; then
echo "=== 冒充风险: $sa ==="
fi
done
汇总发现并实施建议的权限缩减措施。
# 移除原始角色并替换为预定义角色
gcloud projects remove-iam-policy-binding PROJECT_ID \
--member="user:developer@company.com" \
--role="roles/editor"
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="user:developer@company.com" \
--role="roles/compute.viewer"
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="user:developer@company.com" \
--role="roles/storage.objectViewer"
# 删除未使用的服务账户密钥
gcloud iam service-accounts keys delete KEY_ID \
--iam-account=SA_EMAIL
# 禁用未使用的服务账户
gcloud iam service-accounts disable SA_EMAIL --project=PROJECT_ID
| 术语 | 定义 |
|---|---|
| 原始角色(Primitive Role) | 旧版 GCP 角色(Owner、Editor、Viewer),授予所有服务的广泛权限,不推荐在生产环境使用 |
| 预定义角色(Predefined Role) | GCP 管理的角色,范围限定于特定服务和操作,比原始角色提供更细粒度的访问 |
| IAM Recommender | GCP 基于机器学习的服务,分析实际权限使用情况并建议角色缩减以实现最小权限 |
| Policy Analyzer | 分析整个组织层级有效 IAM 访问的工具,可回答"谁能访问什么"的查询 |
| 服务账户密钥(Service Account Key) | 用于服务账户认证的用户管理凭据,密钥可被导出且不会自动过期,存在安全风险 |
| 域范围委托(Domain-Wide Delegation) | 授予服务账户冒充 Google Workspace 域中任何用户的能力,是重大的权限提升风险 |
场景背景:审计发现组织内 60% 的 IAM 绑定使用原始角色(Owner/Editor)。安全团队需要在不中断开发者工作流的情况下迁移到预定义角色。
方法:
gcloud asset search-all-iam-policies 清点所有原始角色绑定常见陷阱:原始角色包含所有 GCP 服务的权限,替换需要多个预定义角色。如果观察期未涵盖所有使用场景,Recommender 可能会建议过于严格的角色。当没有预定义角色完全匹配所需权限集时,自定义角色可以填补空白。
GCP IAM 权限审计报告
===================================
组织: acme-org (ORG_ID: 123456789)
已审计项目: 25
审计日期: 2026-02-23
IAM 绑定摘要:
总绑定数: 342
使用原始角色: 205 (60%)
使用预定义角色: 112 (33%)
使用自定义角色: 25 (7%)
严重发现:
[IAM-001] 具有 Owner 角色的服务账户
SA: admin-sa@prod-project.iam.gserviceaccount.com
角色: 项目 prod-project 的 roles/owner
用户管理密钥: 3 个(最旧: 14 个月)
修复: 替换为特定预定义角色,删除旧密钥
[IAM-002] allAuthenticatedUsers 绑定
资源: gs://public-data-bucket
角色: roles/storage.objectViewer
风险: 任何 Google 账户持有者均可读取存储桶内容
修复: 限制为特定用户组或服务账户
服务账户健康状况:
服务账户总数: 67
具有用户管理密钥: 23
密钥超过 90 天: 18
未使用账户(90 天以上): 12
具有域范围委托: 2
Recommender 建议:
总建议数: 45
高优先级: 12
估计减少的权限数: 2,847 个独立权限