我们有一个用户可以通过 SSH 连接到谷歌云平台上的虚拟机。
他的密钥被添加到虚拟机,他可以使用 SSH
gcloud compute ssh name-of-vm
但是,以这种方式连接将始终让 gcloud 尝试更新项目范围的元数据
更新项目 ssh 元数据...失败
失败,因为他只有访问和管理此 VM 的权限
然而很烦人的是,每次他必须以这种方式连接时,他都必须等待 GCP 尝试更新元数据,这是不允许的,然后检查机器上的 sshkeys。
是的,我们可以在实例上“阻止项目范围内的 ssh 密钥”,但这意味着其他项目管理员无法再登录。
我还尝试尽量减少对该用户的访问。
我正在尝试使用 Google Cloud Storage JSON API 通过 http 调用从存储桶中检索文件。
我在与存储桶位于同一项目中的 GCE 中的 Container 中卷曲,并且服务帐户具有对存储桶的读取访问权限
这是请求的模式:
https://storage.googleapis.com/{bucket}/{object}
Run Code Online (Sandbox Code Playgroud)
根据 API 控制台,我不需要任何特别的东西,因为服务帐户提供了应用程序默认凭据。但是,我一直有这个:
Anonymous caller does not have storage.objects.get
Run Code Online (Sandbox Code Playgroud)
我还尝试为项目创建一个 API 密钥并将其附加到 url ( https://storage.googleapis.com/{bucket}/{object}?key={key}) 但我仍然遇到相同的 401 错误。
如何授权查询此 API 的请求?
所以我试图在谷歌云的人工智能平台上运行一个训练作业,用于通过命令行用张量流编写的图像分类器:
gcloud ai-platform jobs submit training my_job \
--module-name trainer.final_task \
--staging-bucket gs://project_bucket \
--package-path trainer/ \
Run Code Online (Sandbox Code Playgroud)
但我不断收到错误:(gcloud.ai-platform.jobs.submit.training) User [myemail@gmail.com] does not have permission to access project [my_project] (or it may not exist): Permission denied on 'locations/value' (or it may not exist).
我不明白这是怎么可能的,因为我在 gcloud 上拥有该项目(使用该电子邮件地址),甚至在 IAM 策略绑定上明确链接到它。有谁之前经历过这个吗?
额外信息:
我以个人身份使用 gcloud,不涉及任何组织。因此,IAM 策略绑定中链接的唯一成员是我和 gcloud 服务帐户。
gcloud ai-platform local train当使用相同参数进行本地训练(使用 )时,该代码可以完美运行。
google-cloud-platform gcloud google-cloud-iam gcp-ai-platform-training
我已经与我的 Google 服务帐户电子邮件共享了一个 Google 表格,它看起来像:
myappname-service@myappname-266229.iam.gserviceaccount.com
这允许我的应用程序访问该 Google 表格。
我希望能够使用别名为丑陋的自动生成的服务帐户电子邮件 ( myappname-service@myappname-266229.iam.gserviceaccount.com)的自定义电子邮件地址(例如 google@myappname.com)共享 Google 表格。
我怎么能去做这件事?
编辑:
用于与 Google API 交互的代码示例
from google_auth_httplib2 import AuthorizedHttp
from google.oauth2 import service_account
import pygsheets
def _get_gc():
scope = ['https://www.googleapis.com/auth/spreadsheets']
credentials = service_account.Credentials.from_service_account_file(
settings.GOOGLE_SERVICE_AUTH_FILE,
scopes=scope,
)
http = AuthorizedHttp(credentials, http=HTTP)
logger.info('Created GC creds, returning...')
return pygsheets.authorize(custom_credentials=credentials, http=http)
def do_something(url):
gc = _get_gc()
spreadsheet = gc.open_by_url(url)
Run Code Online (Sandbox Code Playgroud) 我发现自己使用了很多Roles/storage.legacyBucketWriter,它具有以下权限:
也许没关系,但使用一个名称中带有遗产的角色对我来说感觉很奇怪......
我也不想创建自定义角色,因为这似乎有点矫枉过正,因为这个角色适合需要。
是的,有一个角色Roles/storage.objectAdmin但它缺少storage.buckets.get权限。
你怎么认为 ?
我的 Google Cloud Platform (GCP) 项目中有 2 个 ServiceAccounts
所有者 ServiceAccount 附加了 1 个项目范围的角色:
执行者 ServiceAccount 仅附加了 2 个特定角色(如下所示):
现在,我有了 Executor ServiceAccount 的 JSON 密钥文件。我将使用该凭证文件来“模拟”所有者 ServiceAccount。然后我将运行gcloud命令。
这就是我正在做的事情。
#!/bin/bash
# --------------------------------------------------------------
export GOOGLE_APPLICATION_CREDENTIALS="$(pwd)/my-executor-sa-key.json"
echo $GOOGLE_APPLICATION_CREDENTIALS
cat $GOOGLE_APPLICATION_CREDENTIALS
OWNER_EMAIL="owner@my-gcp-project.iam.gserviceaccount.com"
echo $OWNER_EMAIL
# --------------------------------------------------------------
CLUSTER="my-k8s-cluster"
ZONE="asia-east1-a"
PROJECT="my-gcp-project"
MY_COMMAND="gcloud container clusters get-credentials ${CLUSTER} --zone ${ZONE} --project ${PROJECT} --impersonate-service-account=${OWNER_EMAIL}"
echo $MY_COMMAND
# --------------------------------------------------------------
`$MY_COMMAND`
# --------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
运行上述命令后,这是我得到的输出
# -------------------------------------------------------------- …Run Code Online (Sandbox Code Playgroud) impersonation service-accounts google-cloud-platform gcloud google-cloud-iam
我正在尝试像这样部署 Firebase 功能:
firebase deploy --only functions
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
错误:缺少部署功能所需的权限。您必须拥有服务帐户 xyz@appspot.gserviceaccount.com 的 iam.serviceAccounts.ActAs 权限。要解决此错误,请要求项目所有者通过以下 URL 为您的帐户分配“服务帐户用户”角色: https: //console.cloud.google.com/iam-admin/iam?xyz
我已经通过访问授予自己服务帐户用户权限
身份 -> 服务帐户 -> xyz@appspot.gserviceaccount.com -> 权限 -> + 授予访问权限
我已在 中添加了链接的电子邮件和服务帐户GOOGLE_APPLICATION_CREDENTIALS。我仍然遇到同样的错误。
有任何想法吗?
firebase service-accounts google-cloud-functions google-cloud-iam google-cloud-identity
我已经设置了一个新的 Firestore 环境,当尝试通过云功能上传然后从存储中读取数据时,出现以下错误:
project_id@appspot.gserviceaccount.com does not have storage.objects.get access to the Google Cloud Storage object。
我在网上查看并在 Google 云控制台中添加了Storage Admin此服务帐户的 IAM 权限,但我仍然遇到同样的错误。
以前有人遇到过这个问题吗?我也尝试过只Owner向服务帐户授予角色,但仍然遇到相同的错误。
google-cloud-storage firebase google-cloud-functions google-developers-console google-cloud-iam
在GCP上,我尝试使用下面的Terraform代码启用“身份和访问管理(IAM)API”:
provider "google" {
credentials = file("myCredentials.json")
project = "myproject-173831"
region = "asia-northeast1"
}
resource "google_project_service" "project" {
service = "iam.googleapis.com"
}
Run Code Online (Sandbox Code Playgroud)
但我收到了这个错误:
读取或编辑 Project Service 时出错:请求
List Project Services myproject-173831返回错误:无法列出项目 myproject-173831 启用的服务:googleapi:错误 403:列出使用者容器服务的权限被拒绝 [projects/335478934851]
然后我就无法启用它
所以现在,我尝试添加一个角色来解决上面的这个错误,但是有太多角色可供选择:
我需要选择什么角色?
google-cloud-platform terraform devops google-cloud-iam terraform-provider-gcp
这是我来自 Google 的 JSON 服务帐户密钥的形状。
{
"type": "service_account",
"project_id": "",
"private_key_id": "",
"private_key": "",
"client_email": "",
"client_id": "",
"auth_uri": "",
"token_uri": "",
"auth_provider_x509_cert_url": "",
"client_x509_cert_url": "",
}
Run Code Online (Sandbox Code Playgroud)
哪些字段应该保密?我的意思是,我会将其中的大部分添加到我的 Git 存储库中,并将私有位添加为环境变量。
保护private_key够了吗?
例如:
帐户.ts
{
"type": "service_account",
"project_id": "VALUE",
"private_key_id": "VALUE",
"private_key": process.env.PRIVATE_KEY, // Populating it via env variables
"client_email": "VALUE",
"client_id": "VALUE",
"auth_uri": "VALUE",
"token_uri": "VALUE",
"auth_provider_x509_cert_url": "VALUE",
"client_x509_cert_url": "VALUE",
}
Run Code Online (Sandbox Code Playgroud)
我也应该隐藏吗private_key_id?
security service-accounts google-cloud-platform google-cloud-iam