【问题标题】:Secure Google Cloud Functions Calls from Server-Side, Authentication strategy?从服务器端保护 Google Cloud Functions 调用,身份验证策略?
【发布时间】:2019-08-21 16:44:18
【问题描述】:

我在 python 中开发了一个Google Cloud Function (GCF),我想从部署在 AWS 上的 Web 服务访问它(用 python 编写)。在GCF 的开发阶段,它的Cloud Function Invoker 权限设置为allUsers。我想这就是为什么它在调用时没有要求Authorization Token

我想撤销此公共访问权限并使其只能从 Web 服务代码中调用此函数,并且无法公开访问。

可能的方法:在我的研究中,我发现这可以通过以下步骤来完成:

  1. 删除所有有权访问 GCF 的不必要成员。
  2. 创建一个新的服务帐户,该帐户的访问权限受到限制,只能使用 GCF。
  3. 下载服务账户密钥 (json) 并在 AWS Web 应用程序中使用它
  4. 将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为该服务帐户密钥 (json) 文件的路径。

问题

  1. 如何使用服务帐户生成访问令牌,然后在对 GCF 进行的 HTTP 调用中将其附加为 Authorization Bearer?如果没有这个标记,GCF 应该会抛出错误。

  2. docs 表示不要将服务帐户密钥放在源代码中。那么最好的方法是什么。他们建议使用 KMS,这似乎有点过头了。

请勿在源代码中嵌入与身份验证相关的机密,例如 API 密钥、OAuth 令牌和服务帐户凭据。您可以使用指向应用程序源代码之外的凭据的环境变量,例如 Cloud Key Management Service。

  1. 服务帐户需要的最低权限是多少?

如果您认为我的理解有误,请随时纠正我,并且有更好、更可取的方法来纠正我。

更新: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


【解决方案1】:
  1. 在您的描述中,您没有提及谁/什么将调用您的 GCF。用户?计算?另一个 GCF?不过这个page可以帮你找到代码示例

  2. 是的,纯文本中的秘密并推送到 GIT 上还不是秘密!再说一次,我不知道是什么在执行呼叫。如果是计算、函数、云运行或 GCP 的任何服务,不要使用 JSON 文件密钥,而是使用组件标识。我会说,创建一个服务帐户并将其设置为此组件。如果您需要更多帮助,请告诉我更多关于您在哪里部署的信息!

  3. 相关2:如果你有服务账号,最小角色是什么:cloudfunctions.Invoker。这是调用函数的最小角色

gcloud beta functions add-iam-policy-binding RECEIVING_FUNCTION \
  --member='serviceAccount:CALLING_FUNCTION_IDENTITY' \
  --role='roles/cloudfunctions.invoker'

【讨论】:

  • 感谢您的回答。 1-抱歉,我没有提到那部分。它实际上是服务器到服务器的事情。我也更新了这个问题。 2-将调用该函数的网络服务是一个烧瓶服务,但部署在aws上,因此我不能使用谷歌云生态系统中使用的ADS身份验证。 3-我认为您共享的代码是指一个 gcf 调用另一个 gcf。这意味着两者都存在于谷歌云平台中。但在我的情况下,网络服务在 AWS 中
  • 没问题,但如果您从 GCP 拨打电话,您就有答案。更喜欢@JohnHanley 的 cmets,他是 GCP 和 AWS 上的杀手!
猜你喜欢
  • 2018-07-09
  • 2018-07-23
  • 2020-04-22
  • 1970-01-01
  • 2020-02-29
  • 2020-08-16
  • 2020-10-25
  • 2015-03-31
  • 2019-09-07
相关资源
最近更新 更多