Ingress Controller de Citrix ADC

Llamada HTTP con la directiva de reescritura y respuesta

Una llamada HTTP permite a Citrix ADC generar y enviar una solicitud HTTP o HTTPS a un servidor externo (agente de llamada) como parte de la evaluación de directivas. La información que se recupera del servidor (agente de llamada) se puede analizar mediante expresiones de directiva avanzadas y se puede realizar una acción apropiada. Para obtener más información sobre la llamada HTTP, consulte la documentación de Citrix ADC.

Puede iniciar la llamada HTTP a través de las siguientes expresiones con la CRD de reescritura y respuesta proporcionada por Citrix:

  • sys.http_callout(): Esta expresión se usa para bloquear la llamada cuando se necesita evaluar la respuesta del agente httpcallout.

  • sys.non_blocking_http_callout(): Esta expresión se usa para llamadas sin bloqueo (por ejemplo: duplicación de tráfico)

Estas expresiones aceptan el httpcallout_policy nombre definido en la CRD como un parámetro, donde el nombre debe especificarse entre comillas dobles.

Por ejemplo: sys.http_callout("callout_name"). En esta expresión, callout_name se refiere a la httpcallout_policy definición apropiada en el archivo YAML CRD de reescritura y respuesta.

En la siguiente tabla se explican los atributos de la solicitud de llamada HTTP en el CRD de reescritura y respuesta.

Parámetro Descripción
name Especifica el nombre de la llamada; el máximo es de 32 caracteres.
server_ip Especifica la dirección IP del servidor (agente de llamada) al que se envía la llamada.
server_port Especifica el puerto del servidor (agente de llamada) al que se envía la llamada.
http_method Especifica el método utilizado en la solicitud HTTP que envía esta llamada. El valor predeterminado es GET.
host_expr Especifica la expresión de texto para configurar el encabezado del host. Esta expresión puede ser un valor literal (por ejemplo, 192.101.10.11) o puede ser una expresión avanzada (por ejemplo, http.req.header (“Host”)) que deriva el valor. El valor literal puede ser una dirección IP o un nombre de dominio completo. Se excluyen mutuamente con la expresión de solicitud HTTP completa.
url_stem_expr Especifica una expresión de cadena para generar la raíz de la URL. La expresión de cadena puede contener una cadena literal (por ejemplo, “/mysite/index.html “) o una expresión que deriva el valor (por ejemplo, http.req.url).
headers Especifica uno o más encabezados para insertarlos en la solicitud HTTP. Cada encabezado name y exp, donde exp es una expresión que se evalúa en tiempo de ejecución para proporcionar el valor del encabezado con nombre.
parameters Especifica uno o más parámetros de consulta para insertarlos en la URL de la solicitud HTTP (para una solicitud GET) o en el cuerpo de la solicitud (para una solicitud POST). Cada parámetro está representado por una name y una expr, donde expr es una expresión que se evalúa en tiempo de ejecución para proporcionar el valor del parámetro nombrado (nombre=valor). Los valores de los parámetros están codificados por URL.
body_expr Expresión de cadena avanzada para generar el cuerpo de la solicitud. La expresión puede contener una cadena literal o una expresión que deriva el valor (por ejemplo, client.ip.src).
full_req_expr Especifica la solicitud HTTP exacta, en forma de expresión, que Citrix ADC envía al agente de llamada. La expresión de solicitud está limitada por la función para la que se utiliza la llamada. Por ejemplo, una expresión HTTP.RES no se puede utilizar en un banco de directivas de tiempo de solicitud ni en un banco de directivas de conmutación de contenido TCP.
scheme Especifica el tipo de esquema para el servidor de llamadas. Ejemplo: HTTP, HTTPS
return_type Especifica el tipo de datos que el agente de llamada de destino devuelve en respuesta a la llamada. La configuración disponible funciona de la siguiente manera: TEXTO: trata el valor devuelto como una cadena de texto. NUM: trata el valor devuelto como un número. BOOL: trata el valor devuelto como un valor booleano.
cache_for_secs Especifica la duración, en segundos, durante la que se almacena en caché la respuesta de llamada. Las respuestas almacenadas en caché se almacenan en un grupo de contenido de almacenamiento en caché integrado denominado calloutContentGroup. Si la duración no está configurada, las respuestas de llamada no se almacenan en caché a menos que se utilice una configuración de almacenamiento en caché normal para almacenarlas en caché. Este parámetro tiene prioridad sobre cualquier configuración normal de almacenamiento en caché que de otro modo se aplicaría a estas respuestas.
result_expr Especifica la expresión que extrae los resultados de la llamada de la respuesta enviada por el agente de llamada HTTP. Esta expresión debe ser una expresión basada en respuestas, es decir, debe empezar por HTTP.RES. Las operaciones de esta expresión deben coincidir con el tipo de devolución. Por ejemplo, si configura un tipo de devolución de TEXT, la expresión resultante debe ser una expresión basada en texto. Si el tipo de devolución es NUM, la expresión resultante (result_expr) debe devolver un valor numérico, como en el siguiente ejemplo: http.res.body(10000).length
comment Especifica cualquier comentario para conservar la información sobre esta llamada HTTP.

Usar la CRD de reescritura y respuesta para validar si la dirección IP de un cliente está en la lista bloqueada

En esta sección se muestra cómo iniciar una llamada HTTP con la CRD de reescritura y respuesta para validar si la dirección IP de un cliente está en la lista de bloqueo o no y tomar las medidas adecuadas.

El siguiente diagrama explica el flujo de trabajo de una solicitud en el que cada número del diagrama indica un paso en el flujo de trabajo: Llamada HTTP

  1. Solicitud del cliente

  2. Solicitud de llamada HTTP para comprobar si el cliente está en la lista bloqueada (la dirección IP del cliente se envía como un parámetro de consulta con el nombre Cip)

  3. Respuesta del servidor de llamadas HTTP

  4. La solicitud se reenvía al servicio si la respuesta en el paso 3 indica una dirección IP segura (la dirección IP del cliente no coincide con las direcciones IP incluidas en la lista de bloqueo en el servidor de llamadas).

  5. Responda al cliente como Access deniedsi la respuesta del paso 3 indica una dirección IP incorrecta (la dirección IP del cliente coincide con las direcciones IP incluidas en la lista de bloqueo en el servidor de llamadas).

A continuación se muestra un archivo YAML de ejemplo (ip_validate_responder.yaml) para validar una dirección IP en la lista de bloqueo:

Nota:

Debe implementar la CRD de reescritura y respuesta antes de implementar el archivo ip_validate_responder YAML.

apiVersion: citrix.com/v1
kind: rewritepolicy
metadata:
  name: validateip
spec:
  responder-policies:
    - servicenames:
        - frontend
      responder-policy:
        respondwith:
          http-payload-string: '"HTTP/1.1 401 Access denied\r\n\r\n"'
        respond-criteria: 'sys.http_callout("blocklist_callout").CONTAINS("IP Matched")' #Callout name needs to be given in double quotes to pick httpcallout_policy
        comment: 'Invalid access'

  httpcallout_policy:
    - name: blocklist_callout
      server_ip: "192.2.156.160"
      server_port: 80
      http_method: GET
      host_expr: '"192.2.156.160"'
      url_stem_expr: '"/validateIP.pl"'
      headers:
      - name: X-Request
        expr: '"Callout Request"'
      parameters:
      - name: Cip
        expr: 'CLIENT.IP.SRC'
      return_type: TEXT
      result_expr: 'HTTP.RES.BODY(100)'
<!--NeedCopy-->

Usar la CRD de reescritura y respuesta para actualizar la URL con una ruta válida solicitada por el cliente

En esta sección se muestra cómo iniciar una llamada HTTP con el CRD de reescritura y respuesta cuando una ruta expuesta al cliente es diferente de la ruta real por motivos de seguridad.

El flujo de trabajo de una solicitud se explica en el siguiente diagrama, donde cada número del diagrama indica un paso en el flujo de trabajo.

Llamada HTTP

  1. Solicitud del cliente

  2. Solicitud de llamada HTTP para obtener la ruta válida (la ruta solicitada al cliente se envía como un parámetro de consulta con la ruta de acceso de nombre al servidor de llamadas)

  3. Respuesta del servidor de llamadas HTTP

  4. La solicitud de URL se reescribe con una ruta válida y se reenvía al servicio (donde la ruta válida se menciona entre las etiquetas newpath en la respuesta de llamada).

A continuación se muestra un archivo YAML (path_rewrite) de ejemplo.

Nota:

Debe implementar la CRD de reescritura y respuesta antes de implementar el archivo path_rewrite YAML.

apiVersion: citrix.com/v1
kind: rewritepolicy
metadata:
  name: getvalidpath
spec:
  rewrite-policies:
    - servicenames:
        - frontend
      rewrite-policy:
        operation: replace
        target: http.req.url
        modify-expression: 'sys.http_callout("mapping_callout")' #Callout name needs to be given in double quotes to pick httpcallout_policy
        comment: 'Get the valid path'
        direction: REQUEST
        rewrite-criteria: 'TRUE'

  httpcallout_policy:
    - name: mapping_callout
      server_ip: "192.2.156.160"
      server_port: 80
      http_method: GET
      host_expr: '"192.2.156.160"'
      url_stem_expr: '"/getPath.pl"'
      headers:
      - name: X-Request
        expr: '"Callout Request"'
      parameters:
      - name: path
        expr: 'http.req.url'
      return_type: TEXT
      result_expr: '"HTTP.RES.BODY(500).AFTER_STR("<newpath>").BEFORE_STR("</newpath>")"'
<!--NeedCopy-->
Llamada HTTP con la directiva de reescritura y respuesta