将python库用于GCP时如何切换项目目标?

Posted

技术标签:

【中文标题】将python库用于GCP时如何切换项目目标?【英文标题】:How to switch project target when using python libs for GCP? 【发布时间】:2020-10-17 04:30:11 【问题描述】:

我目前正在尝试开发一个脚本,该脚本将从 GCP 上的安全指挥中心获取所有调查结果。 我在使用为我创建的服务帐户时遇到问题。 服务帐户是在项目 X 上创建的,但具有组织查看和列出结果的权限。 这就是我带来的(来自 gcloud python 库的想法):

from google.cloud import securitycenter
from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file('svc-scc.json')

# Create a client.
client = securitycenter.SecurityCenterClient(credentials=credentials)

# organization_id is the numeric ID of the organization. e.g.:
organization_id = "XXXXXXXXX"
org_name = "organizations/org_id".format(org_id=organization_id)
# The "sources/-" suffix lists findings across all sources.  You
# also use a specific source_name instead.
all_sources = "org_name/sources/-".format(org_name=org_name)
finding_result_iterator = client.list_findings(all_sources)
for i, finding_result in enumerate(finding_result_iterator):
    print(": name:  resource: ".format(i, finding_result.finding.name, finding_result.finding.resource_name))

svc-scc.json 是带有从 GCP 上的 IAM 检索到的凭证的 json 文件:


    "type": "service_account",
    "project_id": "Project X",
    "private_key_id": "XXXXXXXXXXXXXXXXXXXXXXX",
    "private_key": "-----BEGIN PRIVATE KEY-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
---END PRIVATE KEY-----\n",
    "client_email": "svc-scc@xxxxxxxxxxxx.iam.gserviceaccount.com",
    "client_id": "XXXXXXXXXXXXXX",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://oauth2.googleapis.com/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/svc-scc%40xxxxxxxxxxx.iam.gserviceaccount.com"
    

这是该服务帐户通过 Terraform 获得的权限:

resource "google_organization_iam_member" "securitycenter-org-permissions" 
  for_each = toset(["securitycenter.assetsViewer", "securitycenter.findingsViewer"])
  org_id   = var.org_id
  role     = "roles/$each.value"
  member   = "serviceAccount:$module.service_accounts.service_account["svc-scc"].email"

我收到了这个错误:

google.api_core.exceptions.PermissionDenied: 403 Security Command Center API has not been used in project X before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/securitycenter.googleapis.com/overview?project=X then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

为 Project X 启用 securitycenter API 对我们来说并不是最佳选择。 代码中有没有办法将组织指定为 API 调用的默认项目? 如果没有,是否需要更改服务帐号?

感谢您的宝贵时间!

【问题讨论】:

为什么不能在项目 X 中激活 API?你有什么顾虑? 项目 X 是我们的 IAM 项目,我们通过 Terraform 为人员和服务帐户授予组织权限。我没有从我们的建筑师那里得到答案,但我想这是为了尽量减少曝光。 好的,那么,创建另一个项目并将其用于组织管理。最后,您应该应用组织策略,使用 CSS 及其新功能管理实时安全性,... 您有 1 个项目用于 IAM,另一个用于安全性。这是有道理的。 我们将在安全项目中重新创建帐户。 【参考方案1】:

当您使用客户端库时,这些库会在后台对您正在使用的产品进行 API 调用,并且这些调用是通过与服务帐户关联的项目进行的,因此必须在使用的项目中激活 API运行代码时。

如果您不想为 Project X 激活 securitycenter API,但您可能想使用已激活 securitycenter API 的 Project Y,您需要在 Project 中授予您的服务帐户 (svc-scc@xxxxxxxxxxxx.iam.gserviceaccount.com) 的权限Y 然后在创建credentials 时需要设置将要使用的项目。

credentials = service_account.Credentials.from_service_account_file('svc-scc.json', project_id='PROJECT-Y')

【讨论】:

TypeError: ABCMeta object got multiple values for keyword argument 'project_id' 这是我现在遇到的错误。 由于此错误消息与问题的原始范围不同,我建议创建一个引用此问题的新消息【参考方案2】:

所以, 按照你的建议,我想出了这个: 我们已经在我们的安全项目中创建了服务帐户,但是在 IAM 项目(问题中的项目 X)上设置了组织权限。 由于安全项目启用了 API,因此当我想从组织中获取所有调查结果时,脚本可以正常工作。

感谢大家的帮助。

【讨论】:

以上是关于将python库用于GCP时如何切换项目目标?的主要内容,如果未能解决你的问题,请参考以下文章

我有一个Xcode静态库项目,如何添加测试目标,以便我可以在那里运行它? (而不是在链接到它的项目中。)

GCP 显示没有组织

如何将 GCP Pubsub 订阅的消息转发到另一个主题?

如何在pycharm中切换python版本

如何使用 Python 创建/管理 GCP API 密钥

如何在 Python 中安装 gcp?