Envoy外部授权使用Golang GRPC服务
#go #grpc #envoy #istio

Envoy是云本机OpenSource代理服务器。特使代理提供了各种HTTP过滤器来处理传入请求。

External authorisation是一种过滤类型,将传入请求引导到外部服务并等待其授权继续该请求。外部服务能够修改或暂停传入请求,可以是grpc_service或http_service。

工作示例:prakashchokalingam/envoy_ext_auth_grpc_go

envoy filter to go flow diagram

让我们看使用Envoy外部验证过滤器连接基于GRPC的Golang服务。

创建基于Golang GRPC的服务器:

main.go
package main

import (
  "fmt"
  "net"
  "google.golang.org/grpc"
)

func main() {
  endPoint := fmt.Sprintf("localhost:%d", 3001)
  listen, err := net.Listen("tcp", endPoint)

  grpcServer := grpc.NewServer()
  grpcServer.Serve(listen)
}

用go-Control-Plane Protobuf扩展

上面的服务器应扩展并在EnvoyProxy go-control-Plane Protabuf Server上进行注册,并具有检查函数定义的结构。

main.go
package main

import (
  "fmt"
  "net"

   auth_pb "github.com/envoyproxy/go-control-plane/envoy/service/auth/v3"
  "google.golang.org/grpc"
)

func main() {
  // struct with check method
  type AuthServer struct {}

  func (server *AuthServer) Check(
    ctx context.Context, 
    request *auth_pb.CheckRequest,
  ) (*auth_pb.CheckResponse, error) {
    fmt.println("All request goes through me")

    // block if path is /private
    path = request.Attributes.Request.Http.Path[1:]
    if path == 'private' {
      return nil, fmt.Errorf('private request not allowed')
    }

    // allow all other requests
    return &auth_pb.CheckResponse{}, nil
  }


  endPoint := fmt.Sprintf("localhost:%d", 3001)
  listen, err := net.Listen("tcp", endPoint)

  grpcServer := grpc.NewServer()

  // register envoy proto server
  server := &AuthServer{}
  auth_pb.RegisterAuthorizationServer(grpcServer, server)

  grpcServer.Serve(listen)
}

如果在检查方法而不是&auth_pb.checkresponse中返回零,则该请求将使用403错误代码暂停。

注意:如果服务离线或无法实现的话,特使还将返回403。

最后但并非最不重要的一点是,设置您的使节

在您的特使配置中,添加过滤器envoy.filters.http.ext_authzand将其指向Go Service cluster

Envoy.yml
static_resources:
  listeners:
    - name: listener_0
      address:
        socket_address: { address: 0.0.0.0, port_value: 80 }
      filter_chains:
        - filters:
            - name: envoy.filters.network.http_connection_manager
              typed_config:
                "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                codec_type: auto
                stat_prefix: ingress_http
                route_config:
                  name: local_route
                  virtual_hosts:
                   ...
                http_filters:
                  - name: envoy.filters.http.ext_authz
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
                      transport_api_version: v3
                      grpc_service:
                        envoy_grpc:
                          cluster_name: go_grpc_cluster
                      include_peer_certificate: true
                        ...
  clusters:
    - name: go_grpc_cluster
      connect_timeout: 0.25s
      type: LOGICAL_DNS
      typed_extension_protocol_options:
        envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
          "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
          explicit_http_config:
            http2_protocol_options: {}
      load_assignment:
        cluster_name: go_grpc_cluster
        endpoints:
        - lb_endpoints:
          - endpoint:
              address:
                socket_address:
                  address: 127.0.0.1
                  port_value: 3001

要查看用于自定义标题的示例片段,click here

查看此存储库以获取功能齐全的代码示例

GitHub logo prakashchokalingam / envoy_ext_auth_grpc_go

Engoy外部验证过滤器的工作示例与Go Lang Grpc服务

Screenshot 2023-06-20 at 10 16 03 PM

用Golang GRPC服务演示Envoy外部授权的示例回购

此存储库提供了一个envoy configuration文件,并为端口8080

的所有传入路线激活了外部验证过滤器

特使配置了两个簇,

go_grpc_filter

特使中的过滤器envoy.filters.http.ext_authz指向此GO GRPC群集。所有传入的请求将转发到此集群。

在请求期间将调用Check method;然后,它将自定义标头添加到所有其他请求中,并使用路径'/private'拒绝请求。

请求 grpc_filter 状态 http_response
/ x-custom-header =“ Hello world” 200 你好world
/ private 403 - -

use_simple_http

这是一个直接的golang http服务器,仅发射通过go_grpc_filter cluster添加的自定义标题x-custom-header

运行此示例

  1. 启动Envoy Server
 Envoy -C Envoy.yml 
  1. 启动GO_GRPC_FILTER和GO_GRPC_FILTER服务器,通过导航到群集根。
 Go Run Main.go 
Allon Stuler oyk“ 3” h hyon“ s Huanuebo®