3

我已经成功部署了一个云函数,它对一些数据进行一些基本的预处理并将其上传到 gSheet。
现在,触发 url 接受外部未经身份验证的调用,如果 url 落入坏人之手,就会导致账单过多的风险。

我想知道是否有任何方法可以限制 IAM 中对 Cloud Scheduler 的调用,从而完全阻止对服务的外部调用。
阅读它似乎在请求中包含一些标头并在函数中检查它可能是强制执行真正基本身份验证的基本方法。

4

2 回答 2

7

为了防止外部未经身份验证的呼叫,您可以将函数设置为私有。很容易做到,使用--no-allow-unauthenticated参数部署它

gcloud functions deploy my-function --no-allow-unauthenticated --trigger... -- region... --runtime...

但是现在,调度器不能调用它。现在你必须执行两件事

  • 创建具有正确角色的服务帐户。您可以通过 GUI 或命令行来完成
# Create the service account
gcloud iam service-accounts create your-service-account-name

# Grant the role for calling the function
gcloud functions add-iam-policy-binding \
  --member=serviceAccount:your-service-account-name@YOUR_PROJECT_ID.iam.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker your-function-name

使用 GUI,如果您cloudfunctions.invoker在项目级别授予角色,您的服务帐户将能够访问项目中的所有功能。使用我的命令行,我只授予特定功能的角色。您可以通过控制台执行此操作,方法是转到功能列表,选择一个功能(复选框)并单击show info panel。在这里你有一个权限选项卡

  • 然后使用服务帐户创建您的调度程序
gcloud scheduler jobs create http your-job name --schedule="0 0 * * *" \
  --uri=your-function-URI \
  --oidc-service-account-email=your-service-account-name@YOUR_PROJECT_ID.iam.gserviceaccount.com

如果它不起作用,那是因为您的云调度程序服务代理未授权使用服务帐户生成令牌。

gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
  --member=serviceAccount:service-[project-number]@gcp-sa-cloudscheduler.iam.gserviceaccount.com \
  --role roles/cloudscheduler.serviceAgent
于 2020-01-21T10:05:12.873 回答
0

如果您想限制最终用户请求访问您的 Google Cloud Functions,您可以将 Google Sign-In 与 Cloud IAM 集成或实施 Firebase 身份验证

云功能:对开发人员、功能和最终用户进行身份验证

大多数应用程序处理来自最终用户的请求,最好的做法是将访问权限限制为仅允许的最终用户。为了实现这一点,您可以集成 Google 登录并授予用户角色/cloudfunctions.invoker IAM 角色,或实施 Firebase 身份验证并手动验证他们的凭据。

于 2020-01-20T14:52:57.273 回答