【发布时间】:2021-02-18 04:29:26
【问题描述】:
我有一些云功能。我还有一个在 AppEngine 中运行的 nodejs 服务器。我从那里调用我的云功能。目前我可以从任何地方调用我的云功能!
有什么方法可以限制对我的云功能的访问,使其仅在从运行在 Google App Engine 上的服务器调用时可用?
【问题讨论】:
标签: google-cloud-platform google-cloud-functions firebase-security
我有一些云功能。我还有一个在 AppEngine 中运行的 nodejs 服务器。我从那里调用我的云功能。目前我可以从任何地方调用我的云功能!
有什么方法可以限制对我的云功能的访问,使其仅在从运行在 Google App Engine 上的服务器调用时可用?
【问题讨论】:
标签: google-cloud-platform google-cloud-functions firebase-security
有几种方法可以做到这一点。您可以创建一个服务帐户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 个解决方案
因此,解决方案是使用 App Engine 默认服务帐户作为此电子邮件模式
<project_ID>@appspot.gserviceaccount.com
在所有要在项目级别调用的函数上将此服务帐户授予 role/cloudfunctions.invoker。
因此,要允许 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 案例中是不可能的。
【讨论】: