0

我正在从我的 GCP 项目中调用云功能。

当功能配置为Allow internal traffic only时,我收到 403(Permission Denied) ,请参阅 https://cloud.google.com/functions/docs/networking/network-settings#ingress_settings

删除入口控制没有问题时,该函数以状态 200 响应。该函数不允许未经身份验证的访问,配置IAM 策略。

按照https://cloud.google.com/functions/docs/securing/authenticating#function-to-function的示例:

# main.py
import requests

# TODO<developer>: set these values
# REGION = None
# PROJECT_ID = None

RECEIVING_FUNCTION = 'hello-get'

# Constants for setting up metadata server request
# See https://cloud.google.com/compute/docs/instances/verifying-instance-identity#request_signature
function_url = f'https://{REGION}-{PROJECT_ID}.cloudfunctions.net/{RECEIVING_FUNCTION}'

metadata_server_url = \
    'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience='
token_full_url = metadata_server_url + function_url
token_headers = {'Metadata-Flavor': 'Google'}


def hello_trigger(request):
    token_response = requests.get(token_full_url, headers=token_headers)
    jwt = token_response.text

    function_headers = {'Authorization': f'bearer {jwt}'}
    function_response = requests.get(function_url, headers=function_headers)

    function_response.raise_for_status()

    return function_response.text


def hello_get(req):
    return 'Hello there...'

使用所需的入口设置部署函数和触发函数:

gcloud functions deploy hello-get --trigger-http --entry-point hello_get --runtime python37 --ingress-settings internal-only
gcloud functions deploy hello-trigger --trigger-http --entry-point hello_trigger --runtime python37 --ingress-settings all --allow-unauthenticated

调用hello-trigger返回 403。

改变 ingress ofhello-get解决了这个问题:

gcloud functions deploy hello-get --trigger-http --entry-point hello_get --runtime python37 --ingress-settings all

现在调用hello-trigger返回 200。

用于 Cloud Functions 的服务帐户被赋予了此设置的 Functions Invoker 角色。

4

1 回答 1

1

当您将入口流量设置为仅限内部时,仅接受来自您的 VPC 或来自 VPC SC(服务控制)的流量。

在这里,在您的触发函数中,您不是来自您的 vpc,而是来自另一个 vpc(由 Google 管理的无服务器 VPC,云函数部署的地方)。因此,不遵守入口设置,您会得到 403。

因此,为此,您有 2 个解决方案:

  1. 仅使用 IAM 服务来过滤谁可以调用或不能调用您的函数,并使用 ingress=all 让“公开”您的函数。(约翰在他的第二条评论中提出的解决方案)。它已经是高级别的安全性。

但是,有时出于监管原因(或出于旧式安全团队设计),首选网络控制。

  1. 如果你想通过你的 VPC,你需要

像这样,您的触发函数的所有传出流量都将通过无服务器 VPC 连接器,因此,流量在尝试到达您的“入口内部”云函数之前在您的 VPC 中路由。它会被接受。


如果您的函数使用 ingress=all 设置,则任何人都可以从 Internet 访问它。

但是,如果您不使该功能可公开访问,我的意思是,授权给未经身份验证的用户,则只有有效的请求(通过角色 cloudfunctions.invoker 进行身份验证和授权)将由您的 Cloud Functions 处理

事实上,任何 Google 服务名称GFE 都有一个通用层:Google Front End。该层负责许多事情(在 HTTPS 中公开您的服务,管理您的证书,丢弃 DDoS 攻击 OSI 第 4 层,...),检查身份验证标头和针对 IAM 服务的授权检查。

因此,在第 4 层受到 DDoS 攻击的情况下,GFE 默认过滤这些攻击。在第 7 层攻击的情况下,只允许授权请求(有效),您只需为它们付费。GFE 执行的过滤器是免费的。

于 2020-12-02T09:25:57.430 回答