将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时如何切换项目目标?的主要内容,如果未能解决你的问题,请参考以下文章