关于 auditing-gcp-iam-permissions
用于审查 GCP 组织和项目 IAM 配置的安全审计技能,面向安全团队。它通过 GCP 工具梳理策略、检查服务账号、分析权限并指导整改。
主要功能
- 01盘点组织范围的 IAM 绑定
- 02检查服务账号及其密钥
- 03用 IAM Recommender 查找过度权限
- 04用 Policy Analyzer 分析有效访问
- 05识别全域委派和模拟身份风险
- 06整理审计及整改报告
适用场景
- 01开展 GCP 安全审查时评估 IAM 访问
- 02查找权限过大的服务账号
- 03将宽泛的基础角色替换为更精细角色
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill auditing-gcp-iam-permissions安装后在 Claude Code 中输入/auditing-gcp-iam-permissions确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdscripts/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)。安全团队需要在不妨碍开发者工作流的情况下迁移到预定义角色。
方法:
- 运行
gcloud asset search-all-iam-policies清点所有原始角色绑定 - 使用 IAM Recommender 获取基于机器学习的替换预定义角色建议
- 对于每个绑定,使用 Policy Analyzer 了解该主体实际访问的内容
- 创建映射文档:原始角色 -> 所需的具体预定义角色
- 在测试期间将预定义角色与原始角色一起应用
- 使用 Cloud Audit Logs 监控访问被拒错误
- 在确认 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