es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Filtro de Envoy de Istio condicional basado en la presencia de Cookie

Actualmente estamos utilizando un EnvoyFilter para agregar una verificación de autenticación. Este filtro utiliza el filtro ext_authz de Envoy.

Tenemos un punto final de GraphQL que se utiliza tanto para llamadas anónimas como autorizadas. Dado que las llamadas públicas no requieren una verificación/ filtro de autenticación, me gustaría poder omitir este filtro según una cookie. Intenté buscar una solución en línea pero no pude encontrar una.

Consulte la configuración del filtro a continuación:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: oathkeeper
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      istio: ingressgateway
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: GATEWAY
        listener:
          filterChain:
            filter:
              name: "envoy.filters.network.http_connection_manager"
              subFilter:
                name: "envoy.filters.http.router"
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.filters.http.ext_authz
          typed_config:
            '@type': type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
            failure_mode_allow: false
            http_service:
              path_prefix: /decisions
              server_uri:
                uri: http://oathkeeper-api.default.svc.cluster.local:4456
                cluster: outbound|4456||oathkeeper-api.default.svc.cluster.local
                timeout: 10s
              authorization_request:
                allowed_headers:
                  patterns:
                  - exact: accept
                  - exact: authorization
                  - exact: cookie
                  - exact: content-type
                  - exact: x-forwarded-for
                  - exact: x-forwarded-proto
                  - exact: x-forwarded-host
              authorization_response:
                allowed_upstream_headers:
                  patterns:
                  - exact: authorization
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para omitir el EnvoyFilter basado en una cookie para llamadas públicas en un punto de conexión GraphQL, se puede agregar una configuración condicional al EnvoyFilter. Esto se puede lograr agregando un filtro lua antes del filtro ext_authz.

    Aquí tienes un ejemplo de configuración:

    apiVersion: networking.istio.io/v1alpha3
    kind: EnvoyFilter
    metadata:
      name: oathkeeper   
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          istio: ingressgateway
      configPatches:
        - applyTo: HTTP_FILTER
          match:
            context: GATEWAY
            listener:
              filterChain:
                filter:
                  name: "envoy.filters.network.http_connection_manager"
                  subFilter:
                    name: "envoy.filters.http.router"
          patch:
            operation: INSERT_BEFORE
            value:
              name: envoy.lua
              typed_config:
                '@type': 'type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua'
                inlineCode: |
                  function envoy_on_request(request_handle)
                    -- Verificar si la solicitud contiene la cookie "public"
                    if request_handle:headers():get("cookie") == "public" then
                      -- Eliminar el filtro ext_authz de la cadena
                      request_handle:streamInfo():filterState():set("envoy.filters.http.ext_authz:call_filter", nil)
                    end
                  end
              insertPosition:
                # Colocar el filtro lua antes de ext_authz
                index: 1
                relativeTo: envoy.filters.http.ext_authz
    

    Esta configuración agrega un filtro lua que verifica si la solicitud contiene una cookie llamada “public”. Si se encuentra la cookie, entonces el filtro elimina el filtro ext_authz de la cadena de filtros, omitiendo efectivamente la verificación de autenticación para esa solicitud.

Comments are closed.