限制访问Google Cloud Function

3
我已经成功部署了一个云函数,该函数对一些数据进行基本的预处理并将其上传到gSheet。
现在,触发器url接受外部未经身份验证的调用,这会导致账单过高的风险,如果url落入错误的手中。
我想知道是否有办法在IAM中限制只能由Cloud Scheduler调用,从而防止外部调用服务。
阅读相关文档后发现,在请求中包含某些标头并在函数中进行检查可能是实施基本身份验证的一种基本方法。

您是否希望拥有一个仅可被 Cloud Scheduler 调用的函数,以确保只有 Cloud Scheduler(和经过身份验证和授权的用户)才能调用它? - guillaume blaquiere
@guillaumeblaquiere 确实是这种情况。 - anddt
2个回答

9

为了防止外部未经身份验证的调用,您可以将函数设置为私有。非常容易做到,使用--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角色,您的服务帐户将能够访问项目中所有函数。 通过我的命令行,我只在特定函数上授予该角色。 您可以通过控制台完成此操作,方法是进入函数列表,选择一个函数(复选框)并单击显示信息面板。 这里有一个权限选项卡。

  • 然后使用服务帐户创建您的调度程序
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

感谢Guillaume提供详尽的回复。另一个非常天真的解决方案(将被嵌入Python脚本中)是在执行任何作业之前检查请求头中的某个值。不知道从安全角度来看是否存在风险(请求无论如何都会在https上)。 - anddt
1
它代表着两个风险:首先,您的函数会检查标头,并且您将被收取此处理时间的费用。如果有大量请求,您的账单会爆炸。其次,在中间人攻击的情况下,安全性较低。使用JWT令牌,如果令牌被盗,其生命周期很短(通常为5分钟)。如果您的标头值被盗,您更新它的频率是多少?您可以查看API密钥安全方法,这是相同的问题。 - guillaume blaquiere
谢谢指出。我接受这个答案,因为它非常有效。除了弄清楚如何部署与 master 不同的分支之外,一切都只花了不到五分钟。 - anddt
很高兴能帮忙! :) - guillaume blaquiere

0

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

Cloud Functions:验证开发人员、函数和终端用户

大多数应用程序处理来自终端用户的请求,最佳做法是仅限允许的终端用户访问。为了实现这一点,您可以集成Google Sign-In并授予用户roles/cloudfunctions.invoker IAM角色,或者实施Firebase身份验证并手动验证其凭据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接