L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

auditing-gcp-iam-permissions

auditing-gcp-iam-permissions

使用 gcloud CLI、Policy Analyzer 和 IAM Recommender,审计 Google Cloud Platform IAM 权限, 识别过度宽松的绑定、原始角色使用、服务账户密钥泛滥和跨项目访问风险。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: auditing-gcp-iam-permissions description: > 使用 gcloud CLI、Policy Analyzer 和 IAM Recommender,审计 Google Cloud Platform IAM 权限, 识别过度宽松的绑定、原始角色使用、服务账户密钥泛滥和跨项目访问风险。 domain: cybersecurity subdomain: cloud-security tags: [cloud-security, gcp, iam, permissions-audit, service-accounts, policy-analyzer] version: "1.0" author: mahipal license: Apache-2.0

审计 GCP IAM 权限

适用场景

  • 对 GCP 组织或项目 IAM 配置进行安全评估时
  • 识别具有过多权限或未使用访问的服务账户时
  • 合规要求要求审查访问控制和角色分配时
  • 调查通过 IAM 错误配置实现的横向移动时
  • 通过缩减权限范围减少失陷凭据的爆炸半径时

不适用于:VPC 防火墙规则审计(使用网络安全工具)、GKE RBAC 审计(使用 Kubernetes 专用 RBAC 工具),或 IAM 操作的实时威胁检测(使用 SCC Event Threat Detection)。

前置条件

  • GCP 组织或项目具备 roles/iam.securityReviewer 和 roles/cloudAsset.viewer
  • gcloud CLI 已使用适当权限认证
  • Cloud Asset API 已启用(gcloud services enable cloudasset.googleapis.com)
  • IAM Recommender API 已启用(gcloud services enable recommender.googleapis.com)
  • Policy Analyzer API 已启用(gcloud services enable policyanalyzer.googleapis.com)

工作流程

步骤 1:枚举整个组织的 IAM 绑定

在组织、文件夹和项目层级列出所有 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}')
"

步骤 2:审计服务账户及其密钥

识别权限过高、使用用户管理密钥和未使用的服务账户。

# 列出项目中所有服务账户
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

步骤 3:使用 IAM Recommender 识别多余权限

利用 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

步骤 4:使用 Policy Analyzer 分析有效权限

使用 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)"

步骤 5:检查域范围委托和冒充风险

识别具有域范围委托和冒充能力的服务账户。

# 检查具有域范围委托的服务账户
# (需要 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

步骤 6:生成审计报告并实施修复

汇总发现并实施建议的权限缩减措施。

# 移除原始角色并替换为预定义角色
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 RecommenderGCP 基于机器学习的服务,分析实际权限使用情况并建议角色缩减以实现最小权限
Policy Analyzer分析整个组织层级有效 IAM 访问的工具,可回答"谁能访问什么"的查询
服务账户密钥(Service Account Key)用于服务账户认证的用户管理凭据,密钥可被导出且不会自动过期,存在安全风险
域范围委托(Domain-Wide Delegation)授予服务账户冒充 Google Workspace 域中任何用户的能力,是重大的权限提升风险

工具与系统

  • gcloud CLI:查询和管理 GCP IAM 策略、服务账户和角色绑定的主要工具
  • IAM Recommender:基于实际使用情况减少过多权限的机器学习建议引擎
  • Policy Analyzer:组织范围内的有效访问分析工具,用于了解谁能访问什么
  • Cloud Asset Inventory:跨项目搜索 IAM 策略和资源元数据
  • ScoutSuite:多云审计工具,包含 GCP IAM 专项检查(角色分配和服务账户)

常见场景

场景:减少 GCP 组织中原始角色的使用

场景背景:审计发现组织内 60% 的 IAM 绑定使用原始角色(Owner/Editor)。安全团队需要在不中断开发者工作流的情况下迁移到预定义角色。

方法:

  1. 运行 gcloud asset search-all-iam-policies 清点所有原始角色绑定
  2. 使用 IAM Recommender 获取基于机器学习的替换预定义角色建议
  3. 对每个绑定,使用 Policy Analyzer 了解主体实际访问的资源
  4. 创建映射文档:原始角色 -> 所需的特定预定义角色
  5. 在保留原始角色的同时添加预定义角色,进行测试期
  6. 使用 Cloud Audit Logs 监控访问拒绝错误
  7. 确认 2 周内无访问问题后,移除原始角色

常见陷阱:原始角色包含所有 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 个独立权限
Skills enregistrées