配置授权扩展程序

借助 Service Extensions,应用负载平衡器可以向后端服务发送标注,以便在处理路径中插入自定义处理。当负载均衡器收到请求标头且 网址映射选择后端服务后,授权扩展程序会在请求处理路径中运行。本页面介绍了如何配置授权扩展服务,以使用在授权政策中定义的自定义授权引擎。

如需大致了解应用负载平衡器扩展程序,请参阅 Cloud Load Balancing 扩展程序概览

简介

借助 Cloud Load Balancing,您可以配置授权政策,以对进入负载平衡器的流量强制执行访问权限控制。有时,复杂的授权决策无法使用授权政策轻松表达。

您可以配置包含授权扩展服务的授权政策,以将授权决策委托给自定义授权引擎。在数据路径中,授权扩展会在路由扩展之后执行,但在流量扩展之前执行。如需详细了解授权政策,请参阅授权政策概览

对于每个授权请求,代理都会将请求标头转发给扩展程序。根据提供商的响应,代理会转发或拒绝请求。

预览版中,对于区域级外部应用负载平衡器和区域级内部应用负载平衡器,您可以分别为请求授权政策和内容授权政策单独配置授权扩展程序。基于请求授权政策的扩展程序配置为在基于内容授权政策的扩展程序之前运行。

如需了解与应用负载平衡器扩展相关的限制,请参阅配额和限制页面。

配置基本授权扩展程序

以下示例展示了如何配置授权扩展程序 my-authz-ext 和授权政策,以委托全球外部应用负载平衡器的授权决策。

gcloud

  1. 按照配置插播广告后端服务中的说明创建所需资源。

    在此练习中,您将创建一个全球外部应用负载平衡器。将服务命名为 authz-service,并将转发规则命名为 fr1

  2. 配置授权扩展程序。

    1. 在 YAML 文件中定义扩展程序,将其与后端服务 authz-service 相关联。使用提供的示例值。

      cat >authz-extension.yaml <<EOF
          name: my-authz-ext
          authority: ext11.com
          loadBalancingScheme: EXTERNAL_MANAGED
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/authz-service
          forwardHeaders:
            - Authorization
          failOpen: false
          timeout: "0.1s"
          forwardAttributes:
          - request.mcp_param
          - connection.client_cert_leaf
      EOF
      

      PROJECT_ID 替换为项目 ID

      如需详细了解 YAML 文件中的字段,请参阅 API 文档中的 ExtensionChain。如需了解支持的属性,请参阅支持的属性

    2. 导入授权扩展服务。使用 gcloud service-extensions authz-extensions import 命令以及以下示例值。

      gcloud service-extensions authz-extensions import my-authz-ext \
          --source=authz-extension.yaml \
          --location=global
      

      如果您想将协议设置为 ext_authz,请改用 gcloud beta service-extensions authz-extensions import 命令

  3. 使用扩展程序配置授权政策。

    1. 定义一项授权政策,将扩展程序 my-authz-ext 与转发规则 fr1 相关联。使用提供的示例值。CUSTOM 操作表示正在使用扩展服务。

      cat >authz-policy.yaml <<EOF
          name: my-authz-policy
          target:
            loadBalancingScheme: EXTERNAL_MANAGED
            resources:
              - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/fr1"
          action: CUSTOM
          customProvider:
            authzExtension:
              resources:
                - "projects/PROJECT_ID/locations/global/authzExtensions/my-authz-ext"
      EOF
      
    2. 将授权政策导入到项目中。使用 gcloud network-security authz-policies import 命令和以下示例值。

      gcloud network-security authz-policies import my-authz-policy \
          --source=authz-policy.yaml \
          --location=global
      

根据个人资料配置授权扩展程序

您可以为请求授权政策和内容授权政策分别配置授权扩展服务。

对于请求授权政策

以下示例展示了如何配置授权扩展程序,该扩展程序会将请求授权政策应用于 us-west1 中的转发规则。该政策要求流量在到达目标位置 example.com/mcp 之前,必须通过来自特定主账号的双向 TLS 身份验证。

gcloud

  1. us-west1配置名为 lb-request-authz-service 的标注后端服务,并使用名为 fr2 的转发规则。

    对于该服务,设置具有虚拟机实例组后端的区域级外部应用负载平衡器

  2. 配置授权扩展程序。

    1. 在 YAML 文件中定义将扩展程序与后端服务相关联的扩展程序,lb-request-authz-service。使用提供的示例值。

      cat >lb-request-authz-extension.yaml <<EOF
      name: my-lb-request-authz-ext
      authority: ext11.com
      loadBalancingScheme: INTERNAL_MANAGED
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/lb-authz-request-service
      forwardHeaders:
        - Authorization
      failOpen: false
      timeout: "0.1s"
      wireFormat: EXT_AUTHZ_GRPC
      EOF
      

      PROJECT_ID 替换为项目 ID

      扩展程序必须与后端服务位于同一区域。

      默认情况下,所有 Service Extensions 调用都使用 Envoy 外部处理或 ext_proc 协议。对于授权调出,预览版还支持外部授权或 ext_authz 协议。当 wireFormat 选项设置为 EXT_AUTHZ_GRPC 时,相应调用使用 ext_authz 协议。如果未指定该选项,则调用使用 ext_proc 协议。

      对于请求授权政策,wireFormat 值可以是 EXT_AUTHZ_GRPC,这样一来,即使 ext_proc 协议也受支持,但分出仍会使用 ext_authz 协议。

      默认情况下,failOpen 设置为 false。 如果扩展程序超时或失败,请求处理会停止。如果安全性或完整性比可用性更重要,建议选择此默认选项。

    2. 导入授权扩展服务。使用 gcloud beta service-extensions authz-extensions import 命令,并提供以下示例值。

      gcloud beta service-extensions authz-extensions import my-lb-request-authz-ext \
          --source=lb-request-authz-extension.yaml \
          --location=us-west1
      
  3. 在同一项目中,配置包含扩展程序的授权政策。

    对于向 example.com/mcp 发出的任何请求,该政策要求特定主账号进行双向 TLS 身份验证,并进一步将授权决策委托给授权扩展程序 my-lb-authz-request-ext

    1. 定义一项授权政策,将 my-lb-request-authz-ext 扩展程序与转发规则 fr2 相关联。使用提供的示例值。

      cat >lb-request-authz-policy.yaml <<EOF
      name: my-lb-request-authz-policy
      target:
        resources:
          - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr2"
      policyProfile: REQUEST_AUTHZ
      httpRules:
      - to:
          operations:
          - hosts:
            - exact: "example.com"
          - paths:
            - prefix: "/mcp"
        from:
          sources:
          - principals:
            - principal_selector: CLIENT_CERT_DNS_NAME_SANS
              principal:
                exact: "spiffe://p.global.123.workload.id.goog/ns/ns1/sa/hellomcp"
      action: CUSTOM
      customProvider:
        authzExtension:
          resources:
            - "projects/PROJECT_ID/locations/us-west1/authzExtensions/my-lb-request-authz-ext"
      EOF
      

      对于请求授权政策,policyProfile 的值必须为 REQUEST_AUTHZ。此值表示自定义政策提供程序根据请求允许或拒绝流量。

      CUSTOM 操作表示扩展程序与代理相关联。

      如需详细了解授权政策资源,请参阅authzPolicy 参考文档

    2. 将授权政策导入到项目中。使用 gcloud beta network-security authz-policies import 命令和以下示例值。

      gcloud beta network-security authz-policies import my-lb-request-authz-policy \
          --source=lb-request-authz-policy.yaml \
          --location=us-west1
      

对于内容授权政策

以下示例展示了如何配置授权扩展程序,以将内容授权政策应用于 us-west1 中的转发规则。该政策要求内容清理服务对应用载荷执行深度检查,以允许或拒绝请求,或根据需要更改请求和响应。

gcloud

  1. us-west1配置名为 lb-content-authz-service 的标注后端服务,并使用名为 fr3 的转发规则。

    对于该服务,设置具有虚拟机实例组后端的区域级外部应用负载平衡器

    FULL_DUPLEX_STREAMED 正文处理模式下,使用 ext_proc 协议配置扩展服务,并支持所有事件。

  2. 配置授权扩展程序。

    1. 在 YAML 文件中定义将扩展程序与后端服务相关联的扩展程序,lb-content-authz-service。使用提供的示例值。

      cat >lb-content-authz-extension.yaml <<EOF
      name: my-lb-content-authz-ext
      authority: ext11.com
      loadBalancingScheme: INTERNAL_MANAGED
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/lb-authz-sdp-service
      failOpen: false
      timeout: "0.1s"
      EOF
      

      对于内容授权政策,policyProfile 的值必须为 CONTENT_AUTHZ

      对于 CONTENT_AUTHZ 政策,wireFormat 值无需明确设置为 EXT_PROC_GRPC。默认情况下,调用使用 ext_proc 协议。

    2. 导入授权扩展服务。使用 gcloud beta service-extensions authz-extensions import 命令和以下示例值。

      gcloud beta service-extensions authz-extensions import my-lb-content-authz-ext \
          --source=lb-content-authz-extension.yaml \
          --location=us-west1
      
  3. 使用扩展程序配置授权政策。

    1. 定义将扩展程序 my-lb-content-authz-ext 与转发规则 fr3 相关联的授权政策。使用提供的示例值。

      cat >lb-content-authz-policy.yaml <<EOF
      name: lb-content-authz-policy
      target:
        resources:
          - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr3"
      policyProfile: CONTENT_AUTHZ
      httpRules:
      - to:
          operations:
          - hosts:
            - exact: "example.com"
          - paths:
            - prefix: "/sensitive-stuff"
      action: CUSTOM
      customProvider:
        authzExtension:
          resources:
            - "projects/PROJECT_ID/locations/us-west1/authzExtensions/my-lb-authz-content-ext"
      EOF
      

      policyProfile 的值必须为 CONTENT_AUTHZ

    2. 将授权政策导入到项目中。使用 gcloud beta network-security authz-policies import 命令和以下示例值。

      gcloud beta network-security authz-policies import my-lb-content-authz-policy \
          --source=lb-content-authz-policy.yaml \
          --location=us-west1
      

授权扩展的限制

授权扩展程序存在以下一些限制:

  • 一个授权政策只能有一个授权扩展。
  • 转发规则可与多个授权政策搭配使用,但其中只能有一个自定义授权政策。

如需了解适用于所有扩展程序的限制,请参阅扩展程序的限制

后续步骤