You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:42:58