外部授权

外部授权服务通过调用外部 gRPC 或者 HTTP 服务来检查传入的 HTTP 请求是否被授权。 如果该请求被视为未授权,则通常会以 403 (禁止)响应拒绝该请求。 注意,从授权服务向上游、下游或者授权服务发送其他自定义元数据也是被允许的。在 HTTP 过滤器 中有更多详细的解释。

传递给授权服务的请求内容由 CheckRequest 指定。

使用 gRPC/HTTP 服务的 HTTP 过滤器配置如下。你可以在 HTTP 过滤器 看到所有的配置选项。

配置示例

gRPC 授权服务器的过滤器配置示例:

http_filters:
  - name: envoy.filters.http.ext_authz
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
      grpc_service:
        envoy_grpc:
          cluster_name: ext-authz

        # Default is 200ms; override if your server needs e.g. warmup time.
        timeout: 0.5s
      include_peer_certificate: true
clusters:
  - name: ext-authz
    type: static
    http2_protocol_options: {}
    load_assignment:
      cluster_name: ext-authz
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 10003

    # This timeout controls the initial TCP handshake timeout - not the timeout for the
    # entire request.
    connect_timeout: 0.25s

Note

这个过滤器的一个特性就是将 HTTP 请求体作为 检查请求 的一部分发送到配置的 gRPC 授权服务器。

简单配置如下:

http_filters:
  - name: envoy.filters.http.ext_authz
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
      grpc_service:
        envoy_grpc:
          cluster_name: ext-authz
      with_request_body:
        max_request_bytes: 1024
        allow_partial_message: true
        pack_as_bytes: true

注意,默认情况下,check request 以 UTF-8 字符串的形式携带 HTTP 请求体,并同时填充 body 字段。 如果需要将请求体打包为原始字节,则需要将 pack_as_bytes 设置为 true。 事实上,raw_body 字段会被赋值,而 body 会被设为空。

原始 HTTP 授权服务器的过滤器配置示例:

http_filters:
  - name: envoy.filters.http.ext_authz
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
      http_service:
          server_uri:
            uri: 127.0.0.1:10003
            cluster: ext-authz
            timeout: 0.25s
            failure_mode_allow: false
      include_peer_certificate: true
clusters:
  - name: ext-authz
    connect_timeout: 0.25s
    type: logical_dns
    lb_policy: round_robin
    load_assignment:
      cluster_name: ext-authz
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 10003

按路由独立配置

虚拟主机和路由过滤器的简单配置示例。 在示例中,我们为虚拟主机添加了其他的上下文,并且禁用了前缀为 /static 的路由过滤器。

route_config:
  name: local_route
  virtual_hosts:
  - name: local_service
    domains: ["*"]
    typed_per_filter_config:
      envoy.filters.http.ext_authz:
        "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthzPerRoute
        check_settings:
          context_extensions:
            virtual_host: local_service
    routes:
    - match: { prefix: "/static" }
      route: { cluster: some_service }
      typed_per_filter_config:
        envoy.filters.http.ext_authz:
          "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthzPerRoute
          disabled: true
    - match: { prefix: "/" }
      route: { cluster: some_service }

统计信息

HTTP 过滤器输出的统计信息 cluster.<route target cluster>.ext_authz. 命名空间中。

名称

类型

描述

ok

Counter

过滤器的响应总数。

error

Counter

联系外部服务(包含超时)的异常总数。

timeout

Counter

联系外部服务的超时总数(仅计算在创建请求时判定为超时)。

denied

Counter

授权服务的拒绝通信的响应总数。

disabled

Counter

由于过滤器被禁用,不调用外部服务而允许的请求总数。

failure_mode_allowed

Counter

出现异常但由于 failure_mode_allow 被设置为 true 而允许通过的请求总数。

动态元数据

Note

外部授权服务器仅在使用 gRPC 服务作为授权服务器时才会发出动态元数据。

当 gRPC 授权服务器返回一个带有 dynamic_metadata 字段的 CheckResponse 时,外部授权过滤器会将动态元数据作为不透明的 google.protobuf.Struct 发出。

运行时

可以通过 filter_enabled 字段的 runtime_key 值来配置启用过滤器的请求百分比。