TLDR;我在为服务帐号分配 IAM 权限时遇到问题。
我正在构建一个测试,涉及使用 firebase Auth 生成自定义令牌。当我打:
const token = await admin.auth().createCustomToken('test', {
isAdmin: true,
})
Run Code Online (Sandbox Code Playgroud)
抛出以下错误
Permission iam.serviceAccounts.signBlob is required to perform
this operation on service account
projects/-/serviceAccounts/dashboard@appspot.gserviceaccount.com.;
Please refer to
https://firebase.google.com/docs/auth/admin/create-custom-tokens
for more details on how to use and troubleshoot this feature
Run Code Online (Sandbox Code Playgroud)
在引用的文档中,它说将服务帐户令牌创建者角色添加到服务帐户。我已经添加了该角色(以及尝试服务帐户管理员无济于事。

我可以验证我的权限似乎设置正确,当我运行时,
gcloud projects get-iam-policy project我可以看到我的服务帐户附加到所需的角色
- members:
- serviceAccount:dashboard@appspot.gserviceaccount.com
role: roles/iam.serviceAccountTokenCreator
Run Code Online (Sandbox Code Playgroud)
但是,如果我查看该特定服务帐户,它似乎显示为空,这与我的错误一致:
gcloud iam service-accounts get-iam-policy dashboard@appspot.gserviceaccount.com
etag: ACAB
Run Code Online (Sandbox Code Playgroud)
我认为导致我的服务帐户权限显示为空白的原因是罪魁祸首,但我不确定在哪里进一步调试。在我看来,唯一的区别是一个命令被调用,其中包含一个项目,但我使用项目 ID 初始化了我的 firebase 应用程序,并已对其进行了验证,(firebase-admin).apps[0].options因此这似乎是一个死胡同。
google-cloud-platform firebase-authentication google-iam google-cloud-iam
我们可以与服务帐户共享 BigQuery 数据集,我们可以通过为服务帐户分配特定角色来将服务帐户作为成员添加到特定存储桶......使用图形界面。
火力商店怎么样?我们可以与服务帐户共享特定的集合吗?我在网络界面中找不到任何这样的选项..
备注:我无权向服务帐户授予全局权限,但我有权向资源添加成员并授予他们对该特定资源的角色。
谢谢你!
service-accounts firebase-security google-iam google-cloud-firestore
我想允许用户模拟服务帐户来对长时间运行的进程执行操作。但是,所有代码示例都说明了一个服务帐户模拟另一个服务帐户。
用户可以直接冒充服务帐号吗?如果是这样,怎么办?
我正在遵循这个示例代码。
初始化一个无权访问列表桶的源凭证:
from google.oauth2 import service_acccount
target_scopes = [
'https://www.googleapis.com/auth/devstorage.read_only']
source_credentials = (
service_account.Credentials.from_service_account_file(
'/path/to/svc_account.json',
scopes=target_scopes))
Run Code Online (Sandbox Code Playgroud)
现在使用源凭据来获取凭据以模拟另一个服务帐户:
from google.auth import impersonated_credentials
target_credentials = impersonated_credentials.Credentials(
source_credentials=source_credentials,
target_principal='impersonated-account@_project_.iam.gserviceaccount.com',
target_scopes = target_scopes,
lifetime=500)
Run Code Online (Sandbox Code Playgroud) impersonation service-accounts google-cloud-platform google-iam google-cloud-iam
这是我的用例。
但是,在我的本地环境中,我需要使用服务帐户密钥文件来实现此目的。(例如,当我设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量时)
但是,我无法使用我的用户帐户凭据。
Java、Node 或 Go 中的日志跟踪非常清晰:不可能在用户凭证类型上生成身份令牌。
所以,
还有一段上下文:我们希望避免使用服务帐户密钥文件。今天,这是我们的重大安全漏洞(文件被复制、通过电子邮件发送、甚至公开提交到 Github 上......)。用户帐户默认凭据适用于所有 Google Cloud API,但不适用于 IAP 和 CLoud Run/Functions。
编辑
这是一些错误的例子。
爪哇
我这样做
Credentials credentials = GoogleCredentials.getApplicationDefault().createScoped("https://www.googleapis.com/auth/cloud-platform");
IdTokenCredentials idTokenCredentials = IdTokenCredentials.newBuilder()
.setIdTokenProvider((IdTokenProvider) credentials)
.setTargetAudience(myUri).build();
HttpRequestFactory factory = new NetHttpTransport().createRequestFactory(new HttpCredentialsAdapter(idTokenCredentials));
Run Code Online (Sandbox Code Playgroud)
我的用户凭证不符合IdTokenProvider接口
Caused by: java.lang.ClassCastException: class com.google.auth.oauth2.UserCredentials cannot be cast to class com.google.auth.oauth2.IdTokenProvider (com.google.auth.oauth2.UserCredentials and com.google.auth.oauth2.IdTokenProvider …Run Code Online (Sandbox Code Playgroud) google-cloud-platform google-cloud-functions google-iam google-cloud-run
我有一个全新的 GCP 帐户,我是该帐户的唯一所有者,这是一个个人/干净的全新项目。
\n我专门使用 terraform 管理基础设施,并尝试创建一个 HTTPS 负载均衡器来将请求路由到固定 ip,然后我想将其转发到我有 web 应用程序的存储桶,我过去通过以下方式设置了这种类型的基础设施UI 但不是通过 terraform。
\n当尝试创建这个基础设施时:
\nresource "google_compute_global_address" "main" {\n name = "main"\n}\n\nresource "google_compute_forwarding_rule" "lb" {\n name = "lb"\n provider = google-beta\n region = "europe-west2"\n project = "owlee-software"\n ip_protocol = "TCP"\n load_balancing_scheme = "EXTERNAL_MANAGED"\n port_range = "443"\n target = google_compute_global_address.main.address\n network_tier = "PREMIUM"\n}\nRun Code Online (Sandbox Code Playgroud)\n这会抛出
\n\xe2\x94\x82 Response: {\n\xe2\x94\x82 "error": "invalid_grant",\n\xe2\x94\x82 "error_description": "Account has been deleted"\n\xe2\x94\x82 }\nRun Code Online (Sandbox Code Playgroud)\n对于全新的服务帐户 - 我已删除该帐户并创建了另一个帐户 - 使用另一个文件,如果我删除此资源,则所有内容都会通过 GCP 帐户中的服务帐户进行实例化。这也是我在该项目中拥有的唯一“谷歌测试版”提供商。
\n我不确定这是因为资源配置错误还是服务帐户发生了一些问题。
\n当我尝试检查我刚刚创建并在项目上创建编辑器的服务帐户时,我不能,它显示为灰色,并显示以下文本: …
google-cloud-platform terraform google-iam terraform-provider-gcp gcp-load-balancer
在Google Cloud Compute上使用容器优化操作系统(COS),从Docker容器中访问VM项目的默认服务帐户凭据的最佳方法是什么?
$ gcloud compute instances create test-instance \
--image=cos-stable --image-project=cos-cloud
$ ssh (ip of the above)
# gcloud ...
Command not found
# docker run -ti google/cloud-sdk:alpine /bin/sh
# gcloud auth activate-service-account
... --key-file: Must be specified.
Run Code Online (Sandbox Code Playgroud)
如果凭据在VM上,那么Docker可以安装这些凭据.通常凭证将在.config/gcloud/,并执行此操作docker run -v ~/.config/gcloud:~/.config/gcloud image.容器操作系统中是否有这样的凭证,特别是因为缺少这些凭证,这一点并不明显gcloud.
如果VM上的凭据失败并且可安装,则选项似乎包括:
.json然后,为服务帐户创建凭证文件
.json到容器;gcloud auth activate-service-account是否有规范或最佳实践方法为Docker容器提供VM项目的服务帐户凭据?
Google Cloud已经拥有了一个安全策略模型,即所需的模型:项目中的VM应具有服务帐户提供的访问权限.为了避免复杂性以及错误配置或事故的可能性,正确的解决方案将采用此现有安全模型,即不涉及创建,下载,分发和维护凭证文件.
感觉这将是一个需要用COS,Docker和Kubernetes解决的常规问题,所以我假设我错过了一些直截了当的东西 - 但是解决方案对我来说并不明显.
编辑 - 注意set-service-account API …
google-compute-engine google-cloud-platform google-container-registry google-container-os google-iam
我想用一个存在于'eu.gcr.io'(相同项目)上的新映像来更新我在kubernetes上的部署,我之前已经做过。但是现在,吊舱无法拉动图像,因为它们无权这样做。这是我们在pod日志中得到的错误。
Failed to pull image "eu.gcr.io/my-gcp-project/my-image:v1.009":
rpc error: code = Unknown desc = Error response from daemon:
unauthorized: You don't have the needed permissions to perform this operation,
and you may have invalid credentials.
Run Code Online (Sandbox Code Playgroud)
群集上的服务帐户具有kubernetes admin和storage admin角色,这应该足够。但是,即使我制作了服务帐户项目编辑器(出于调试目的),它仍然不起作用(相同的错误)。
我也尝试过创建一个新的新集群(默认设置)并在那里应用我的部署,但是随后出现了完全相同的问题。
我不确定我可以尝试什么。
任何帮助或建议,我们将不胜感激。
编辑:
我只是发现我仍然可以拉出并部署旧映像。但是,我创建的每个新映像都不能被kubernetes容器所吸引。
google-cloud-platform kubernetes google-kubernetes-engine google-container-registry google-iam
我目前正在管理一个GCP项目,并授予一位同事访问权限,以便Viewer他可以使用其中的资源(主要是从存储中下载文件)。
我遇到了一个问题,这里也有解释。
基本上,运行后gcloud auth application-default login,他们可以访问资源,但会收到警告
WARNING:
Cannot add the project "lixodata" to ADC as the quota project because the account in ADC does not have the "serviceusage.services.use" permission on this project. You might receive a "quota_exceeded" or "API not enabled" error
. Run $ gcloud auth application-default set-quota-project to add a quota project.
Run Code Online (Sandbox Code Playgroud)
对于他们运行的每个需要与 GCP 交互的脚本都会重复此警告,这往往会使他的终端变得有点混乱。
链接的问题解释了如何使警告消失,但需要授予用户权限serviceusage.services.use,该权限不与默认Viewer角色捆绑。
阅读文档并没有真正让我明白一些事情:为什么我要使用与我所连接的计费项目不同的计费项目?
我的问题是两部分:
serviceusage.services.use?为什么它默认不与Viewer角色链接?gcloud auth print-access-token给我一个Bearer令牌,以后可以使用;但是,这是一个shell命令。如何通过Google Cloud Python API以编程方式获取一个?
我看到了使用oauth2client的先前示例,但现在已弃用。如何使用google.auth和oauthlib做到这一点?oauth2client
根据控制台弹出窗口,项目浏览器角色具有对项目资源的浏览访问权限,而项目查看器具有对这些资源的读取访问权限。
这是否意味着使用浏览器角色我只能列出存储在项目存储桶中的文件名,但我需要查看器角色来下载这些文件?