Tutorial: Publica y protege API de GraphQL con F5 NGINX

NGINX | 20 de julio de 2023

Los desarrolladores adoptan cada vez más GraphQL como método preferido para crear API. GraphQL simplifica la obtención de datos de múltiples fuentes, agilizando el acceso a los datos y su agregación. Al consultar varias fuentes de datos mediante una única solicitud POST desde un solo endpoint, los desarrolladores que utilizan GraphQL pueden solicitar con precisión los datos que necesitan de distintas fuentes. Este enfoque ayuda a resolver las limitaciones de las arquitecturas de API REST, en las que pueden surgir problemas como la consulta insuficiente (solicitudes que no incluyen todos los datos necesarios) o la consulta excesiva (solicitudes dirigidas a varios endpoints que recopilan demasiados datos).

GraphQL es la opción óptima para las arquitecturas de microservicios, ya que permite a los clientes recuperar únicamente los datos esenciales de cada servicio o fuente de datos. Esto favorece una mayor flexibilidad y agilidad, dos aspectos fundamentales para prosperar en un entorno empresarial moderno.

La seguridad es fundamental para las API de GraphQL

Al ofrecer un mayor grado de acceso y flexibilidad, las API de GraphQL también presentan una superficie de ataque más amplia que resulta atractiva para los actores maliciosos. A pesar de ser relativamente nuevo, GraphQL sigue siendo susceptible a muchas de las mismas vulnerabilidades presentes en otras arquitecturas de API. Afortunadamente, puede proteger las API de GraphQL frente a estas amenazas habituales aprovechando parte de su infraestructura y sus herramientas actuales.

Descripción general del tutorial

Este tutorial ayuda a comprender cómo distribuir y proteger las API de GraphQL. Mostramos cómo implementar un servidor Apollo GraphQL en F5 NGINX Unit con F5 NGINX Plus como puerta de enlace de API. Además, mostramos cómo implementar F5 NGINX App Protect WAF en la puerta de enlace de API para proporcionar seguridad avanzada y usar F5 NGINX Management Suite para configurar el WAF y supervisar posibles amenazas. Esta configuración también permite usar NGINX App Protect WAF para detectar ataques como la inyección de SQL.

Siga los pasos de estas secciones para completar el tutorial:

Figura 1: Arquitectura con NGINX Plus y NGINX App Protect WAF, que proporcionan seguridad y autenticación para las API de GraphQL, NGINX Management Suite, que supervisa los ataques, y el servidor Apollo GraphQL, que se ejecuta en NGINX Unit

Requisitos previos

Antes de comenzar este tutorial, necesitarás lo siguiente:

Instalar y configurar la supervisión de seguridad de NGINX Management Suite

NGINX Management Suite integra varias funciones avanzadas en una plataforma unificada para simplificar el proceso de configuración, supervisión y resolución de problemas de las instancias de NGINX. También facilita la gestión y la gobernanza de las API, optimiza el equilibrio de carga de las aplicaciones y mejora la seguridad general de las organizaciones.

Siga estos pasos para instalar y configurar NGINX Management Suite:

  • Siga las instrucciones de la página Máquina virtual o servidor físico de la sección de Instalación. Esta página incluye el módulo de Supervisión de seguridad (utilizado en este tutorial), así como otros módulos que puede instalar si lo desea.
  • Añada la licencia para cada módulo instalado.
  • Instale el paquete NGINX Agent desde el host de NGINX Management Suite y configure la supervisión de seguridad para las instancias de NGINX App Protect siguiendo las instrucciones que encontrará aquí.

Implementar NGINX Unit e instalar Apollo GraphQL Server

NGINX Unit es una aplicación de ejecución eficiente, optimizada y de diseño ligero, lo que la convierte en la opción ideal para las organizaciones que buscan un alto rendimiento sin renunciar a la velocidad ni a la agilidad. Es un servidor de código abierto capaz de gestionar TLS, enrutar solicitudes y ejecutar código de aplicaciones. Puede obtener más información sobre NGINX Unit en su página de Características principales.

En este tutorial, utilizamos Express como framework de aplicaciones web Node.js en NGINX Unit, que ofrece amplias funcionalidades para crear un servidor GraphQL de Apollo. En el momento de redactar este tutorial, la versión actual es Apollo Server 4.

Siga estos pasos para implementar NGINX Unit e instalar el servidor Apollo GraphQL:

  1. Instale NGINX Unit en un sistema operativo compatible.
  2. Sigue las instrucciones del repositorio de GitHub para crear un servidor Apollo GraphQL y tu aplicación «Hola, mundo» de Apollo GraphQL.

Implemente NGINX Plus como puerta de enlace de API e instale NGINX App Protect WAF

Seleccione un entorno adecuado para implementar una instancia de NGINX Plus. En este tutorial, utilizamos una instancia de Ubuntu en AWS y configuramos un proxy inverso de puerta de enlace de API mediante NGINX Plus. A continuación, implementamos NGINX App Protect WAF delante de nuestra puerta de enlace de API para reforzar la seguridad.

Siga estas instrucciones para instalar NGINX Plus y NGINX App Protect WAF:

  1. Instale NGINX Plus en un sistema operativo compatible.
  2. Instale el módulo JavaScript de NGINX (njs).
  3. Añada load_modules en el directorio nginx.conf.
load_module modules/ngx_http_js_module.so;load_module modules/ngx_stream_js_module.so;
  1. Instale NGINX App Protect WAF en un sistema operativo compatible.
  2. Añada el módulo NGINX App Protect WAF al contexto principal del archivo nginx.conf :
load_module modules/ngx_http_app_protect_module.so;
  1. Habilite NGINX App Protect WAF en un contexto http/server/location del archivo nginx.conf:
app_protect_enable on;
  1. Cree una configuración de política de GraphQL en el directorio /etc/app_protect/conf. Para obtener más información sobre cómo crear una política de WAF de NGINX App Protect, consulte las directrices pertinentes. A continuación se muestra un ejemplo de configuración de política de GraphQL:
{   "name": "graphql_policy",
      "template": {
          "name": "POLICY_TEMPLATE_NGINX_BASE"
      },
      "applicationLanguage": "utf-8",
      "caseInsensitive": false,
      "enforcementMode": "blocking",
      "blocking-settings": {
          "violations": [
              {
                  "name": "VIOL_GRAPHQL_FORMAT",
                  "alarm": true,
                  "block": false
              },
              {
                  "name": "VIOL_GRAPHQL_MALFORMED",
                  "alarm": true,
                  "block": false
              },
              {
                  "name": "VIOL_GRAPHQL_INTROSPECTION_QUERY",
                  "alarm": true,
                  "block": false
              },
              {
                  "name": "VIOL_GRAPHQL_ERROR_RESPONSE",
                  "alarm": true,
                  "block": false
              }
          ]
      } 
  1. Para aplicar la configuración de GraphQL, actualice el campo app_protect_policy_file con el nombre de la política de GraphQL en el archivo nginx.conf. Una vez actualizado el archivo, vuelva a cargar NGINX para aplicar la configuración de GraphQL. A continuación se muestra un ejemplo del archivo nginx.conf que incluye una política de NGINX App Protect:
user nginx;  worker_processes  4;
  load_module modules/ngx_http_js_module.so;
  load_module modules/ngx_stream_js_module.so; 
  load_module modules/ngx_http_app_protect_module.so;
  error_log /var/log/nginx/error.log debug;
  events {
      worker_connections  65536;
  }
http {
      include       /etc/nginx/mime.types;
      default_type  application/octet-stream;
      sendfile        on;
      keepalive_timeout  65;
      server {
          listen       <port>;
          server_name  <name>; 
          app_protect_enable on;
          app_protect_security_log_enable on; # This section enables the logging capability
          app_protect_security_log "/etc/app_protect/conf/log_sm.json" syslog:server=127.0.0.1:514; # This is where the remote logger is defined in terms of: logging options (defined in the referenced file), log server IP, log server port
          app_protect_security_log "/etc/app_protect/conf/log_default.json" /var/log/app_protect/security.log;
          proxy_http_version 1.1;    
          location / {
              client_max_body_size 0;
              default_type text/html;
              proxy_pass http://<ip addr>:<port>$request_uri;#<ip addr> of Nginx unit
          }
          location /graphql {
              client_max_body_size 0;
              default_type text/html;
              app_protect_policy_file "/etc/app_protect/conf/graphql_policy.json";
              proxy_pass http://<ip addr>:<port>$$request_uri; #<ip addr> of Nginx unit
           
          }
      }
  }
  1. Reinicie NGINX Plus ejecutando este comando:

$ nginx -s reload

Probar la configuración

Ahora puede probar su configuración siguiendo estos pasos:

  1. Inicia la aplicación Apollo GraphQL accediendo al servidor NGINX Unit y escribiendo este comando:
$ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
  1. Tras una actualización correcta, debería ver que la aplicación está disponible en la dirección IP y el puerto del listener:
{          "success": "Reconfiguration done."
  }
  1. Para acceder al servidor Apollo GraphQL, abra su navegador web e introduzca la dirección IP pública de su servidor. Por ejemplo: http://3..X.X.X:4003/graphql (en este ejemplo se utiliza el puerto 4003).
  2. Para probar la aplicación, introduce la consulta GraphQL correcta y ejecútala.

Figura 2: entorno de pruebas de la interfaz de usuario de Apollo GraphQL

  1. Supongamos que una persona introduce una inyección SQL en una consulta. En este caso, NGINX App Protect WAF protege el servidor Apollo GraphQL y genera un identificador de soporte que describe la naturaleza del ataque.
$ curl -X POST http://3.X.X.X:4003/graphql/ -H "Content-Type:application/json" -d '{"query": "query {hello OR 1=1;} "}'<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 7313092578494613509<br><br><ahref='javascript:history.back();'>[GoBack]</a></body><html>
  1. Para consultar los detalles del ataque, revise los registros de la instancia de NGINX Plus, que se encuentran en /var/log/app_protect/security.log.
attack_type="Non-browser Client,Abuse of Functionality,SQL-Injection,Other Application Activity,HTTP Parser Attack",blocking_exception_reason="N/A",date_time="2023-07-05 21:22:38",dest_port="4003",ip_client="99.187.244.63",is_truncated="false",method="POST",policy_name="graphql_policy",protocol="HTTP",request_status="blocked",response_code="0",severity="Critical",sig_cves="N/A,N/A",sig_ids="200002147,200002476",sig_names="SQL-INJ expressions like ""or 1=1"" (3),SQL-INJ expressions like ""or 1=1"" (6) (Parameter)",sig_set_names="{SQL Injection Signatures},{SQL Injection Signatures}",src_port="64257",sub_violations="HTTP protocol compliance failed:Host header contains IP address",support_id="7313092578494613509",
  1. En el módulo de supervisión de seguridad de NGINX Management, puede supervisar los datos de sus instancias y revisar posibles amenazas, así como ajustar las políticas según sea necesario para obtener una protección óptima.

Figura 3: Descripción general del módulo Security Monitoring de NGINX Management SuiteFigura 4: Resumen completo de las infracciones de seguridad en el módulo Security Monitoring

Conclusión

En este tutorial, ha aprendido a configurar un servidor Apollo GraphQL en NGINX Unit, implementar NGINX Plus como puerta de enlace de API y proteger sus API de GraphQL con NGINX App Protect WAF delante de su puerta de enlace de API.

También puede utilizar NGINX Management Suite Security Monitoring para identificar y bloquear amenazas avanzadas habituales antes de que pongan en peligro sus API de GraphQL. Esta sencilla arquitectura protege las API de GraphQL frente a algunas de las vulnerabilidades de API más comunes, como la ausencia de autenticación y autorización, los ataques de inyección, el consumo de recursos sin restricciones y muchas otras.

Prueba NGINX hoy mismo con una prueba gratuita de 30 días de API Connectivity Stack, que incluye NGINX Plus, NGINX App Protect y NGINX Management Suite.

Recursos adicionales


Compartir
Etiquetas: API, F5 NGINX, Tech

Sobre el autor

Akash Ananthanarayanan
Akash AnanthanarayananResponsable de marketing técnico | F5 NGINX

Más artículos de Akash Ananthanarayanan

Artículos relacionados del blog

Únete a F5 NGINX en AppWorld 2024
NGINX | 04/01/2024

Únete a F5 NGINX en AppWorld 2024

Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
NGINX | 26/09/2023

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source

La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.

Exposición de APIs en Kubernetes
NGINX | 10/03/2022

Exposición de APIs en Kubernetes

La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
NGINX | 23/08/2021

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto

Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.

Presentamos NGINX Plus R22
NGINX | 09/06/2020

Presentamos NGINX Plus R22

NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.

Presentamos NGINX Plus R17
NGINX | 11/12/2018

Presentamos NGINX Plus R17

NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.