【问题标题】:How can I restrict access to my cloud functions?如何限制对我的云功能的访问?
【发布时间】:2021-02-18 04:29:26
【问题描述】:

我有一些云功能。我还有一个在 AppEngine 中运行的 nodejs 服务器。我从那里调用我的云功能。目前我可以从任何地方调用我的云功能!

有什么方法可以限制对我的云功能的访问,使其仅在从运行在 Google App Engine 上的服务器调用时可用?

【问题讨论】:

标签: google-cloud-platform google-cloud-functions firebase-security


【解决方案1】:

有几种方法可以做到这一点。您可以创建一个服务帐户IAM & Admin -> Services accounts

您需要将Cloud Functions Invoker 角色应用到此服务帐户,您可以使用 gcloud cli 来完成此操作。

gcloud beta functions add-iam-policy-binding YOUCLOUDFUNCTIONAME --member serviceAccount:NAME-OF-YOUR-SERVICE-ACCOUNT@project-name.iam.gserviceaccount.com --role roles/cloudfunctions.invoker --region YOUR-REGION

系统会提示您这样的消息:

bindings:
- members:
  - allUsers
  - YOUR SERVICE ACCOUNT

理想情况下,您需要删除allUsers 角色。

gcloud beta functions remove-iam-policy-binding YOUFUNCTIONNAME --member allUsers --role roles/cloudfunctions.invoker --region us-central1

然后您需要确保您的 AppEngine 实例可以访问您刚刚创建的服务帐户,这应该可以解决问题。请注意,您可能需要根据您的情况进行更多配置,但这可以为您提供一个很好的起点。

【讨论】:

    【解决方案2】:

    您有 2 个解决方案

    1. 第一个是使用 AndresMijares 描述的服务帐户。但是,不是要创建一个新的。事实上,如果您创建了一个新的服务帐户并希望将其与应用引擎一起使用,您需要生成一个服务帐户密钥文件并使用您的代码部署此密钥。它不是很安全,因为您还需要安全地存储这个秘密等等。

    因此,解决方案是使用 App Engine 默认服务帐户作为此电子邮件模式

    <project_ID>@appspot.gserviceaccount.com
    

    在所有要在项目级别调用的函数上将此服务帐户授予 role/cloudfunctions.invoker


    1. 第二个解决方案不如第一个解决方案那么好,但它也是可能的。您可以更新您的 Cloud Functions 并设置 ingress parameter to internal。这意味着只有来自项目中 VPC 的流量才能到达 Cloud Functions,包括项目的其他资源(如 Compute Engine)。 -> 这就是为什么它不是一个很好的解决方案,但最终无法从任何地方调用 Cloud Functions。

    因此,要允许 App Engin 使用您的 VPC 调用 Cloud Function,您需要使用 serverless VPC connector 将无服务器世界与您的 VPC 连接起来。除了不太安全之外,此解决方案还涉及无服务器 VPC 连接器的额外成本。


    第二种解决方案的优点是您无需更新应用程序代码即可对云功能执行安全调用。您只需更新部署配置,并且您只能在内部调用函数。

    对于第一个解决方案,您需要更新代码以将安全令牌添加到您的请求标头。它类似于function to function authentication。我个人不喜欢这种实现方式,因为您无法在本地进行测试:在本地您没有元数据服务器!

    wrote an article 可以从中获得“避免元数据服务器”部分的灵感。


    编辑 1

    在深入了解 App Engine 无服务器 VPC 连接器和 this answer 之后,只能通过 Cloud Functions 或 Cloud Run 访问“仅限内部”Cloud Function(或 Cloud Run)入口。 App Engine 不会在无服务器 VPC 连接器内路由公共流量,因此第二个解决方案在 App Engine 案例中是不可能的。

    【讨论】:

    • 谢谢。我正在尝试使用 VPC 连接器来执行此操作。所以我按照建议使用默认设置创建了连接器。有没有关于如何将它连接到我的 CF 和 AppEngine 的教程?在我的 CF 上,我选择了“仅限所有内部流量”,但不确定在 Egress 设置中选择什么?我有两个单选按钮选项
    • 我在那里回答了你:stackoverflow.com/questions/66245642/… 并编辑了这个。
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 2020-05-29
    • 2011-06-02
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2012-07-31
    相关资源
    最近更新 更多