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

如何通过服务账号JSON密钥在Python中查询GCP服务账号创建者邮箱?

解决方案

方法一:优化Cloud Logging API查询(提升日志命中率)

之前查询失败大概率是过滤条件、日志范围或权限设置问题,调整后可精准定位服务账号创建事件:

  1. 必要权限:确保服务账号拥有 roles/logging.viewer 角色,允许读取项目日志数据。
  2. Python代码实现:
    使用google-cloud-logging库,精准匹配服务账号创建的审计日志:
import google.auth
from google.cloud import logging_v2
from google.oauth2.service_account import Credentials

# 加载目标服务账号的JSON密钥
credentials = Credentials.from_service_account_file("path/to/your/service-account-key.json")
client = logging_v2.LoggingServiceV2Client(credentials=credentials)

# 配置目标信息
target_sa_email = "your-service-account@project-id.iam.gserviceaccount.com"
project_id = "your-project-id"

# 构建过滤条件:匹配服务账号创建事件,锁定当前目标服务账号
filter_str = (
    f'resource.type="service_account" '
    f'AND protoPayload.methodName="google.iam.admin.v1.CreateServiceAccount" '
    f'AND protoPayload.resourceName="projects/{project_id}/serviceAccounts/{target_sa_email}"'
)

# 查询最近90天的日志(Cloud Logs默认保留周期)
response = client.list_log_entries(
    request={
        "resource_names": [f"projects/{project_id}"],
        "filter": filter_str,
        "order_by": "timestamp desc"
    }
)

# 提取创建者邮箱
for entry in response:
    creator_email = entry.proto_payload.authentication_info.principal_email
    print(f"创建该服务账号的用户邮箱:{creator_email}")
    break
else:
    print("未找到创建日志(可能日志已过期或服务账号权限不足)")

方法二:Cloud Asset Inventory API(备选方案)

若Logging日志已超出保留期,可尝试通过资产清单查询资源创建历史:

  1. 必要权限:服务账号需拥有 roles/cloudasset.viewer 角色。
  2. Python代码实现:
import google.auth
from google.cloud import asset_v1
from google.oauth2.service_account import Credentials

credentials = Credentials.from_service_account_file("path/to/your/service-account-key.json")
client = asset_v1.AssetServiceClient(credentials=credentials)

project_id = "your-project-id"
target_sa_name = f"//iam.googleapis.com/projects/{project_id}/serviceAccounts/your-service-account@project-id.iam.gserviceaccount.com"

# 查询目标服务账号的创建信息
response = client.search_all_resources(
    request={
        "scope": f"projects/{project_id}",
        "query": f'name:"{target_sa_name}" AND createTime:*',
        "read_mask": "name, createTime, creator"
    }
)

for resource in response:
    if hasattr(resource, 'creator'):
        print(f"创建该服务账号的用户邮箱:{resource.creator}")
        break
else:
    print("未获取到创建者信息(部分早期创建的服务账号可能未留存该字段)")

关键注意事项

  • 日志保留限制:Cloud Logs默认仅保留90天日志,超期无法查询。
  • 权限校验:必须确保服务账号已被授予对应角色,否则会返回权限错误。
  • 旧账号限制:部分创建时间较早的服务账号,可能未留存完整的创建日志或创建者信息,此类情况无法通过API获取数据。

内容的提问来源于stack exchange,提问作者Vik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:25:29