配置授权扩展程序

借助 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

      借助 forwardAttributes 字段,您可以指定要转发给授权服务的请求、连接和位置属性。您最多可以为每个扩展程序配置 16 个属性。如需详细了解支持的属性, 请参阅 支持的属性

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

      gcloud service-extensions authz-extensions import my-authz-ext \
          --source=authz-extension.yaml \
          --location=global
      
  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. 配置标注后端服务 名为 lb-request-authz-serviceus-west1 中,并使用转发规则 名为 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_authz 协议,但 ext_proc 协议也受支持。

      默认情况下,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 的转发规则。

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

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

  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
      

授权扩展程序的限制

以下是授权扩展程序的一些限制:

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

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

后续步骤