如何通过服务账号JSON密钥在Python中查询GCP服务账号创建者邮箱?
解决方案
方法一:优化Cloud Logging API查询(提升日志命中率)
之前查询失败大概率是过滤条件、日志范围或权限设置问题,调整后可精准定位服务账号创建事件:
- 必要权限:确保服务账号拥有
roles/logging.viewer角色,允许读取项目日志数据。 - 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日志已超出保留期,可尝试通过资产清单查询资源创建历史:
- 必要权限:服务账号需拥有
roles/cloudasset.viewer角色。 - 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
相关产品推荐
相关产品推荐

