我目前正在尝试开发一个脚本,该脚本将从 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 是 JSON 文件,其中包含从 GCP 上的 IAM 检索的凭证:
{
"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 启用安全中心 API 对我们来说不是最佳选择。
有没有办法在代码中将组织指定为 API 调用的默认项目 ?
如果没有,我需要更改服务帐户吗?
谢谢你的时间!
使用客户端库时,这些库会在后台对正在使用的产品进行 API 调用,并且调用是通过与服务帐户关联的项目进行的,因此在运行代码时使用的项目中必须激活 API。
如果您不想为项目 X 激活安全中心 API,但可能希望使用已激活安全中心 API 的项目 Y,则需要在项目 Y 中向服务帐户 (svc-scc@xxxxxxxxxxxx.iam.gserviceaccount.com
授予权限,然后在创建credentials
时需要设置将使用的项目。
credentials = service_account.Credentials.from_service_account_file('svc-scc.json', project_id='PROJECT-Y')
所以, 按照你的建议,我想出了这个: 我们已在安全项目中创建了服务帐户,但组织权限是在 IAM 项目(问题中的项目 X(上设置的。 由于安全项目启用了 API,因此当我想从组织获取所有结果时,脚本可以正常工作。
谢谢大家的帮助。