skills/auditing-gcp-iam-permissions/SKILL.md
使用 gcloud CLI、Policy Analyzer 和 IAM Recommender,审计 Google Cloud Platform IAM 权限, 识别过度宽松的绑定、原始角色使用、服务账户密钥泛滥和跨项目访问风险。
npx skillsauth add killvxk/cybersecurity-skills-zh auditing-gcp-iam-permissionsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
不适用于: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:[email protected]" \
--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:[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"
# 删除未使用的服务账户密钥
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: [email protected]
角色: 项目 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 个独立权限
testing
设计并执行社会工程学渗透测试,包括钓鱼、语音钓鱼、短信钓鱼和物理借口活动,以衡量人员安全韧性并识别培训差距。
testing
主持结构化的事件后审查,以识别根本原因、记录有效和无效的措施,并提出可操作的改进建议以提升未来的事件响应能力。
testing
通过分析举报的邮件、提取指标、评估凭据受攻陷情况、在全组织范围隔离恶意邮件并修复受影响账号来响应网络钓鱼事件。涵盖邮件头分析、URL/附件沙箱检测和邮箱范围清除操作。适用于网络钓鱼响应、邮件事件、凭据钓鱼、鱼叉式网络钓鱼调查或钓鱼修复相关请求。
tools
票据传递(Pass-the-Ticket,PtT)是一种横向移动技术,使用窃取的 Kerberos 票据(TGT 或 TGS)在不知道用户密码的情况下向服务进行认证。通过从已控制的主机内存中提取 Kerberos 票据,攻击者可以将这些票据注入自己的会话以模拟票据所有者。