我目前正在管理一个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.
对于他们运行的每个需要与GCP交互的脚本,都会重复此警告,这往往会使他的终端变得混乱。
链接的问题解释了如何使警告消失,但需要授予用户serviceusage.services.use
权限,该权限不与默认的Viewer
角色捆绑在一起。
阅读文档并没有真正向我澄清一些事情:为什么我要使用与我连接的项目不同的计费项目?
我的问题分为两部分:
- 授予同事
serviceusage.services.use
的用途/风险是什么?为什么默认情况下不与Viewer
角色链接? - 是否有其他解决方案来禁用此警告(仅此警告)?
TL;DR因为否则gcloud auth application-default
颁发的凭据会在google拥有的项目中消耗配额,而该项目可能(不)启用了该服务。
对于需要身份验证和授权的Google api,使用OAuth。在Google的实现中,Google服务(特定的api)必须在使用前启用,api在Google项目中启用(和聚合)。
有两种重要的"身份"类型,(人类)用户(例如gmail)和软件(有时称为机器人)用户。非辅助(!)软件用户由服务帐户标识。
gcloud
是软件,但它主要代表(人类)用户操作。因为gcloud
通常需要能够识别它的人类用户(例如你的gmail.com帐户),它以委托的方式运作。gcloud
确实有自己的身份,但它(主要)是作为人类用户操作的。
注意你也可以使用gcloud服务帐户。
重要的是,gcloud
是一个所谓的安装应用程序。当用户发出gcloud
命令时,gcloud
提供用户的(!)身份和它自己的身份(称为OAuth客户端ID)到谷歌拥有的谷歌项目(!)|运行。
注意这就解释了为什么你可以用
gcloud
创建项目并启用服务,因为另一个项目(启用了正确的服务)正在代表你影响这些API调用。
当你针对谷歌的服务开发应用程序时,你必须决定代码如何向谷歌进行身份验证。如果它代表用户,那么您还需要创建一个Client ID,并通过该ID路由用户的请求。如果它作为一个独立的解决方案运行(没有用户干预),那么它将作为一个服务帐户运行。
Google的sdk包含一个优雅的功能,叫做应用程序默认凭证(Application Default Credentials, adc)。adc自动发现服务帐户凭证,减少(从而简化)代码,提供可移植性和保持安全。如果你可以使用adc,那么你应该使用。
这会产生(!)一个挑战。对于编写非用户代码的开发人员,如果不创建服务帐户(并下载密钥),他们如何测试软件?解决方案是(!)gcloud auth application-default
.
当你使用gcloud auth application-default
时,用户(例如gmail.com)凭据被用来创建行为就像adc的凭据。开发人员可以测试他们的代码而不需要必须创建服务帐户和密钥。
然而(!)Google被动地(!)不鼓励使用gcloud auth application-default
。
- 支持使用
gcloud auth application-default
请求的Google项目是Google拥有的项目而不是你的项目;谷歌被"计费"了。不是你。 - 产生的凭据具有经过认证的用户凭据所具有的所有权力,而不是(希望)更具体(通常是iam控制的)服务帐户的权限
- google拥有的Projectmay 没有启用您要使用的服务。
- 这个过程是不透明的,独立的代码可以神奇地通过使用
gcloud auth application-defaut
的adc对Google Cloud进行身份验证,这可能令人惊讶(也不应该如此)。
你应该不基于上述原因,请使用gcloud auth application-default
凭据。
如果您正在使用gcloud auth application-default
凭证,您应该考虑为什么并选择更好的替代方案:
- 直接使用用户凭证 或使用服务帐户
如果从Google Cloud,最好通过Workload Identity Federation使用Service Account