mcpField
A
auditing-gcp-iam-permissions

auditing-gcp-iam-permissions

github.com/mukul975安全35.2k230 次安装8 周前更新
代码仓库

关于 auditing-gcp-iam-permissions

用于审查 GCP 组织和项目 IAM 配置的安全审计技能,面向安全团队。它通过 GCP 工具梳理策略、检查服务账号、分析权限并指导整改。

主要功能

  1. 01盘点组织范围的 IAM 绑定
  2. 02检查服务账号及其密钥
  3. 03用 IAM Recommender 查找过度权限
  4. 04用 Policy Analyzer 分析有效访问
  5. 05识别全域委派和模拟身份风险
  6. 06整理审计及整改报告

适用场景

  1. 01开展 GCP 安全审查时评估 IAM 访问
  2. 02查找权限过大的服务账号
  3. 03将宽泛的基础角色替换为更精细角色

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill auditing-gcp-iam-permissions

安装后在 Claude Code 中输入/auditing-gcp-iam-permissions确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
references/
api-reference.md
scripts/
agent.py

详细介绍

审计 GCP IAM 权限

何时使用

  • 在对 GCP 组织或项目的 IAM 配置进行安全评估时
  • 在识别权限过高或访问闲置的服务账号时
  • 在合规要求强制审查访问控制和角色分配时
  • 在调查通过 IAM 错误配置进行的潜在横向移动时
  • 在通过缩减权限来降低凭证泄露的影响范围时

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

前提条件

  • 具有 roles/iam.securityReviewer 和 roles/cloudAsset.viewer 的 GCP 组织或项目
  • 已通过相应权限完成身份验证的 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 绑定,以了解完整的访问情况。

# Organization-level IAM bindings
gcloud organizations get-iam-policy ORG_ID \
  --format=json > org-iam-policy.json

# Search all IAM policies across the organization
gcloud asset search-all-iam-policies \
  --scope=organizations/ORG_ID \
  --format="table(resource, policy.bindings.role, policy.bindings.members)" \
  --limit=500

# Find all users and service accounts with Owner role
gcloud asset search-all-iam-policies \
  --scope=organizations/ORG_ID \
  --query="policy:roles/owner" \
  --format="table(resource, policy.bindings.members)"

# Find all bindings using primitive roles (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 步:审计服务账号及其密钥

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

# List all service accounts in a project
gcloud iam service-accounts list \
  --project=PROJECT_ID \
  --format="table(email, displayName, disabled)"

# Check for user-managed keys (should be minimized)
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

# Find service accounts with admin roles across all projects
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)"

# Check service account IAM policies (who can impersonate)
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 找出授予的访问权限超过实际使用的角色。

# List IAM role recommendations for a project
gcloud recommender recommendations list \
  --project=PROJECT_ID \
  --recommender=google.iam.policy.Recommender \
  --location=global \
  --format="table(name, description, priority, stateInfo.state)"

# Get detailed recommendation
gcloud recommender recommendations describe RECOMMENDATION_ID \
  --project=PROJECT_ID \
  --recommender=google.iam.policy.Recommender \
  --location=global \
  --format=json

# List insights about IAM usage
gcloud recommender insights list \
  --project=PROJECT_ID \
  --insight-type=google.iam.policy.Insight \
  --location=global \
  --format="table(name, description, severity, category)"

# Apply a recommendation (after review)
gcloud recommender recommendations mark-claimed RECOMMENDATION_ID \
  --project=PROJECT_ID \
  --recommender=google.iam.policy.Recommender \
  --location=global \
  --etag=ETAG
第 4 步:使用 Policy Analyzer 分析有效权限

使用 Policy Analyzer 确定特定主体或资源的有效访问权限。

# Check who has access to a specific resource
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)"

# Check what resources a specific user can access
gcloud asset analyze-iam-policy \
  --organization=ORG_ID \
  --identity="user:[email protected]" \
  --format="table(accessControlLists.resources.fullResourceName, accessControlLists.accesses.role)"

# Check who can perform a specific action
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)"

# Find all principals with allUsers or allAuthenticatedUsers access
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 步:检查全网域委派和模拟风险

识别具有全网域委派和模拟能力的服务账号。

# Check for service accounts with domain-wide delegation
# (Requires Admin SDK access to list delegated accounts)
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', '')
    # Check if the SA has domain-wide delegation enabled
    # This requires Admin SDK API access
    print(f'SA: {email} - Check admin.google.com for delegation status')
"

# Find service accounts that other identities can impersonate
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 "=== Impersonation risk: $sa ==="
  fi
done
第 6 步:生成审计报告并应用修复

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

# Remove primitive role and replace with predefined role
gcloud projects remove-iam-policy-binding PROJECT_ID \
  --member="user:[email protected]" \
  --role="roles/editor"

gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="user:[email protected]" \
  --role="roles/compute.viewer"

gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="user:[email protected]" \
  --role="roles/storage.objectViewer"

# Delete unused service account keys
gcloud iam service-accounts keys delete KEY_ID \
  --iam-account=SA_EMAIL

# Disable unused service accounts
gcloud iam service-accounts disable SA_EMAIL --project=PROJECT_ID

关键概念

术语定义
原始角色授予所有服务广泛权限的旧版 GCP 角色(Owner、Editor、Viewer),不建议用于生产环境
预定义角色GCP 管理的角色,范围限定于特定服务和操作,比原始角色提供更精细的访问控制
IAM Recommender基于机器学习的 GCP 服务,分析实际权限使用情况并建议缩减角色以实现最小权限
Policy Analyzer用于分析组织层级中有效 IAM 访问权限的工具,可回答“谁可以访问什么”的查询
服务账号密钥用于服务账号身份验证的用户管理凭证,是一种安全风险,因为密钥可被导出且不会自动过期
全网域委派授予服务账号模拟 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 Permissions Audit Report
===================================
Organization: acme-org (ORG_ID: 123456789)
Projects Audited: 25
Audit Date: 2026-02-23

IAM BINDING SUMMARY:
  Total bindings:                    342
  Using primitive roles:             205 (60%)
  Using predefined roles:            112 (33%)
  Using custom roles:                 25 (7%)

CRITICAL FINDINGS:
[IAM-001] Service Account with Owner Role
  SA: [email protected]
  Role: roles/owner on project prod-project
  User-Managed Keys: 3 (oldest: 14 months)
  Remediation: Replace with specific predefined roles, delete old keys

[IAM-002] allAuthenticatedUsers Binding
  Resource: gs://public-data-bucket
  Role: roles/storage.objectViewer
  Risk: Any Google account holder can read bucket contents
  Remediation: Restrict to specific user groups or service accounts

SERVICE ACCOUNT HEALTH:
  Total service accounts:            67
  With user-managed keys:            23
  Keys older than 90 days:           18
  Unused accounts (90+ days):        12
  With domain-wide delegation:        2

RECOMMENDER SUGGESTIONS:
  Total recommendations:             45
  Priority HIGH:                     12
  Estimated permissions reduced:     2,847 individual permissions

评论

支持 Markdown