如何查询GCP服务创建用户并扩展现有资源审计bash脚本
GCP资源创建人查询实现方案
GCP不会在资源元数据中直接存储原始创建用户字段,所有资源创建操作的记录都保存在Cloud Audit Logs(云审计日志)中,默认日志保留周期为400天,若提前配置了日志长期归档到存储桶可查询更久记录,超出日志保留期且无归档的资源无法追溯创建人。
要在现有脚本中增加创建人查询能力,只需要在枚举到每个资源后,调用Cloud Logging接口匹配对应的资源创建事件,提取事件里的请求发起账号即可。
前置权限要求
运行改造后脚本的账号,需要在所有待审计项目拥有以下权限:
- 原有脚本所需的各资源列表读取权限
roles/logging.viewer(日志查看者)角色,用于读取审计日志
脚本改造步骤
首先在脚本开头定义通用的创建人查询函数,避免重复写日志查询逻辑:
#!/bin/bash ############################################################## # This script will list all services with creator in all projects in GCP # ############################################################## # 通用创建人查询函数:入参1为项目ID,入参2为日志过滤规则 get_creator() { local TARGET_PROJECT=$1 local LOG_FILTER=$2 gcloud logging read "${LOG_FILTER}" \ --project="${TARGET_PROJECT}" \ --limit=1 \ --format="value(protoPayload.authenticationInfo.principalEmail)" \ 2>/dev/null | head -n 1 }
之后将原脚本中各资源的枚举逻辑,替换为「枚举资源+匹配日志查创建人」的逻辑,各资源对应的审计日志过滤规则如下:
- 已启用服务(Service Usage):过滤
resource.type="serviceusage.googleapis.com" protoPayload.methodName="google.api.serviceusage.v1.ServiceUsage.EnableService" protoPayload.request.service="<服务名>" - GKE集群:过滤
resource.type="gke_cluster" protoPayload.methodName="google.container.v1.ClusterManager.CreateCluster" resource.labels.cluster_name="<集群名>" - Compute Engine实例:过滤
resource.type="gce_instance" protoPayload.methodName="v1.compute.instances.insert" resource.labels.instance_id="<实例ID>" - Cloud SQL实例:过滤
resource.type="cloudsql_database" protoPayload.methodName="cloudsql.instances.create" resource.labels.database_id="<项目ID>:<实例名>" - BigTable实例:过滤
resource.type="bigtable_instance" protoPayload.methodName="google.bigtable.admin.v2.BigtableInstanceAdmin.CreateInstance" resource.labels.instance_id="<实例ID>" - PubSub主题:过滤
resource.type="pubsub_topic" protoPayload.methodName="google.pubsub.v1.Publisher.CreateTopic" resource.labels.topic_id="<主题名>" - Cloud Functions函数:过滤
resource.type="cloud_function" protoPayload.methodName="google.cloud.functions.v1.CloudFunctionsService.CreateFunction" resource.labels.function_name="<函数名>" - Dataflow作业:过滤
resource.type="dataflow_step" protoPayload.methodName="google.dataflow.v1beta3.JobsV1Beta3.CreateJob" resource.labels.job_id="<作业ID>" - Memorystore(Redis)实例:过滤
resource.type="redis_instance" protoPayload.methodName="google.cloud.redis.v1.CloudRedis.CreateInstance" resource.labels.instance_id="<实例ID>"
以Compute Engine模块为例,原代码替换为如下内容即可同时输出实例名和创建人:
echo "----------- Compute Engine instances -----------" gcloud compute instances list --project=${PROJECT} --format="csv(name,id)" | grep -v NAME | while IFS=',' read -r INST_NAME INST_ID; do CREATOR=$(get_creator "${PROJECT}" "resource.type=\"gce_instance\" protoPayload.methodName=\"v1.compute.instances.insert\" resource.labels.instance_id=\"${INST_ID}\"") echo "Instance Name: ${INST_NAME}, Creator: ${CREATOR:-<无法查询,日志过期或权限不足>}" done
其余资源模块按照相同逻辑修改即可,注意拼接过滤规则时传入对应资源的ID/名称参数。
注意事项
- 若返回结果为空,优先检查当前账号是否有目标项目的日志查看权限,其次确认资源创建时间是否在400天日志保留期内
- GKE节点、托管服务自动生成的附属资源等平台自动创建的资产,创建人会显示为Google托管服务账号或项目默认服务账号,不属于异常资产
- 全量遍历多项目+日志查询的耗时远高于原脚本,项目数量较多时建议分批次执行,避免触发GCP API限流
- 若需要查询超过400天的历史创建记录,需提前配置审计日志 sink 导出到Cloud Storage长期存储,再从归档日志中检索
内容的提问来源于stack exchange,提问作者Cade Nelson
相关产品推荐
相关产品推荐

