【发布时间】:2019-08-21 16:44:18
【问题描述】:
我在 python 中开发了一个Google Cloud Function (GCF),我想从部署在 AWS 上的 Web 服务访问它(用 python 编写)。在GCF 的开发阶段,它的Cloud Function Invoker 权限设置为allUsers。我想这就是为什么它在调用时没有要求Authorization Token。
我想撤销此公共访问权限并使其只能从 Web 服务代码中调用此函数,并且无法公开访问。
可能的方法:在我的研究中,我发现这可以通过以下步骤来完成:
- 删除所有有权访问 GCF 的不必要成员。
- 创建一个新的服务帐户,该帐户的访问权限受到限制,只能使用 GCF。
- 下载服务账户密钥 (json) 并在 AWS Web 应用程序中使用它
- 将环境变量
GOOGLE_APPLICATION_CREDENTIALS设置为该服务帐户密钥 (json) 文件的路径。
问题
如何使用服务帐户生成访问令牌,然后在对
GCF进行的 HTTP 调用中将其附加为Authorization Bearer?如果没有这个标记,GCF应该会抛出错误。docs 表示不要将服务帐户密钥放在源代码中。那么最好的方法是什么。他们建议使用 KMS,这似乎有点过头了。
请勿在源代码中嵌入与身份验证相关的机密,例如 API 密钥、OAuth 令牌和服务帐户凭据。您可以使用指向应用程序源代码之外的凭据的环境变量,例如 Cloud Key Management Service。
- 服务帐户需要的最低权限是多少?
如果您认为我的理解有误,请随时纠正我,并且有更好、更可取的方法来纠正我。
更新:AWS 上的 Web 服务将以服务器到服务器的方式调用 GCF。无需传播客户端(最终用户)凭据。
【问题讨论】:
-
Cloud Functions 的授权不使用访问令牌,而是使用 OIDC 身份令牌。使用的是用户的身份,而不是权限。这意味着服务帐户本身不需要任何权限(角色)。身份的权限是通过应用于 Cloud Function 的 Invoker 角色而非服务帐户(或用户帐户)授予的。
-
#2。这意味着您需要在 AWS 中为您的服务提供服务账户 JSON 密钥文件。您将使用此服务帐户生成身份令牌并将此令牌包含在 HTTP 标头
authorization: bearer <token>中。 -
#3) 为确保 AWS 服务账户的安全,请使用 AWS Secrets Manager 存储和检索服务账户的 JSON 内容。
-
非常感谢@JohnHanley,我会试试这个,如果有一些困惑会发表评论。为了清楚起见,在 2# 你指的是这样的东西? github.com/salrashid123/salrashid123.github.io/blob/master/…请看
GetIDTokenFromServiceAccount函数 -
该示例代码将生成一个身份令牌。 Google 还提供了一个端点来获取身份令牌,这在 AWS 上可能是一个更好的选择。这是一个 curl 示例:
curl -H "Authorization: Bearer $ACCESS_TOKEN" https://www.googleapis.com/oauth2/v3/userinfo使用您最喜欢的请求库,您可以使用访问令牌向该端点发出 HTTP GET 请求以进行授权。返回的 JSON 包含身份令牌。
标签: python amazon-ec2 google-cloud-platform google-cloud-functions service-accounts