BLOG | NGINX

Tutorial: Entregue y proteja las API GraphQL con F5 NGINX

NGINX - Parte de F5 - horizontal, negro, tipo RGB
Miniatura de Akash Ananthanarayanan
Akash Ananthanarayanan
Publicado el 20 de julio de 2023

Los desarrolladores están adoptando cada vez más GraphQL como método preferido para crear API. GraphQL simplifica la recuperación de datos de múltiples fuentes, agilizando el acceso y la agregación de datos. Al consultar múltiples fuentes de datos con una solicitud POST desde un único punto final, los desarrolladores que utilizan GraphQL pueden solicitar con precisión los datos que necesitan de varias fuentes. Este enfoque ayuda a resolver las limitaciones que se encuentran en las arquitecturas de API REST , donde pueden ocurrir problemas como consultas insuficientes (solicitudes que carecen de todos los datos necesarios) o consultas excesivas (solicitudes que van a múltiples puntos finales y recopilan datos excesivos).

GraphQL es la opción óptima para las arquitecturas de microservicios, ya que otorga a los clientes la capacidad de recuperar solo los datos esenciales de cada servicio o fuente de datos. Esto fomenta una mayor flexibilidad y agilidad, que son componentes críticos para prosperar en un entorno empresarial moderno.

La seguridad es fundamental para las API de GraphQL

Con un mayor grado de acceso y flexibilidad, las API GraphQL también presentan una superficie de ataque más extensa que resulta atractiva para los actores maliciosos. A pesar de ser relativamente nuevo, GraphQL todavía es propenso a muchas de las mismas vulnerabilidades que se encuentran en otras arquitecturas de API. Afortunadamente, puedes proteger las API de GraphQL de estas amenazas comunes aprovechando algunas de tus herramientas e infraestructura existentes.

Descripción general del tutorial

Este tutorial ayuda a comprender cómo entregar y proteger las API GraphQL. Ilustramos cómo implementar un servidor Apollo GraphQL en una unidad F5 NGINX con F5 NGINX Plus como puerta de enlace API. Además, mostramos cómo implementar F5 NGINX App Protect WAF en la puerta de enlace API para seguridad avanzada y usar F5 NGINX Management Suite para configurar su WAF y monitorear amenazas potenciales. Esta configuración también le permite utilizar NGINX App Protect WAF para detectar ataques como la inyección SQL.

Siga los pasos de estas secciones para completar el tutorial:

Arquitectura con NGINX que proporciona seguridad y autenticación para las API GraphQL, monitoreo de ataques y el servidor GraphQL Apollo ejecutándose en la unidad NGINX
Figura 1: Arquitectura con NGINX Plus y NGINX App Protect WAF que proporciona seguridad y autenticación para las API GraphQL, monitoreo de NGINX Management Suite para detectar ataques y el servidor Apollo GraphQL ejecutándose en NGINX Unit

Requisitos previos

Antes de comenzar este tutorial, necesitará 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, monitoreo y solución de problemas de instancias NGINX. También facilita la gestión y gobernanza de las API, optimiza el equilibrio de carga de las aplicação y mejora la seguridad general de las organizaciones.

Siga estos pasos para instalar y configurar NGINX Management Suite:

  • Siga las instrucciones en la página de Máquina virtual o Metal desnudo de la página de Instalación . Esta página incluye el módulo de Monitoreo de Seguridad (utilizado en este tutorial) y otros módulos que puede instalar a su discreción.
  • Agregue la licencia para cada módulo instalado.
  • Instale el paquete del Agente NGINX desde el host de NGINX Management Suite y configure la Supervisión de seguridad para las instancias de NGINX App Protect siguiendo las instrucciones aquí .

Implementar la unidad NGINX e instalar el servidor Apollo GraphQL

NGINX Unit es una aplicação de ejecución en tiempo eficiente y optimizada con un diseño liviano, lo que la convierte en una opción ideal para organizaciones que buscan un alto rendimiento sin comprometer la velocidad ni la agilidad. Es un servidor de código abierto que puede manejar TLS, enrutamiento de solicitudes y ejecutar código de aplicação . Puede obtener más información sobre NGINX Unit en su página de Características clave .

En este tutorial, utilizamos Express como un marco de aplicação web Node.js en NGINX Unit que ofrece amplias capacidades para construir un servidor Apollo GraphQL. Al momento de escribir este artículo, la versión actual es Apollo Server 4.

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

  1. Instalar NGINX Unit en un sistema operativo compatible .
  2. Siga el repositorio de GitHub para crear un servidor Apollo GraphQL y crear su aplicación de saludo Apollo GraphQL.

Implemente NGINX Plus como API Gateway e instale NGINX App Protect WAF

Seleccione un entorno adecuado para implementar una instancia de NGINX Plus. En este tutorial, utilizamos una instancia de AWS Ubuntu y configuramos un proxy inverso de puerta de enlace de API usando NGINX Plus. Luego implementamos NGINX App Protect WAF frente a nuestra puerta de enlace API para mayor seguridad.

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

  1. Instale NGINX Plus en un sistema operativo compatible .
  2. Instalar el módulo JavaScript de NGINX (njs).
  3. Agregue load_modules en el directorio nginx.conf .
  4. módulo_de_carga módulos/ngx_http_js_module.so;módulo_de_carga módulos/ngx_stream_js_module.so;
    
  5. Instale NGINX App Protect WAF en un sistema operativo compatible.
  6. Agregue el módulo NGINX App Protect WAF al contexto principal en el archivo nginx.conf :
  7. módulo de carga módulos/ngx_http_app_protect_module.so;
  8. Habilite NGINX App Protect WAF en un contexto http/servidor/ubicación en el archivo nginx.conf :
  9. app_protect_enable activado;
  10. Cree una configuración de política GraphQL en el directorio /etc/app_protect/conf. Para obtener más información sobre cómo crear una política WAF de NGINX App Protect, consulte las pautas pertinentes .

    A continuación se muestra un ejemplo de configuración de política de GraphQL:

  11. {   "nombre": "graphql_policy",
        "plantilla": {
            "nombre": "POLÍTICA_TEMPLATE_NGINX_BASE"
    },
    "applicationLanguage": "utf-8",
    "mayúsculas/minúsculas": falso,
    "enforcementMode": "bloqueo",
    "blocking-settings": {
    "infracciones": [
    
    {{nombre}} "VIOL_GRAPHQL_FORMAT",
                    "alarma": verdadero,
                    "bloque": falso
                },
                {
                    "nombre": "VIOL_GRAPHQL_MALFORMADO",
                    "alarma": verdadero,
                    "bloque": falso
                },
                {
                    "nombre": "VIOL_GRAPHQL_INTROSPECTION_QUERY",
                    "alarma": verdadero,
                    "bloque": falso
                },
                {
                    "nombre": "VIOL_GRAPHQL_ERROR_RESPONSE",
                    "alarma": verdadero,
                    "bloqueo": falso
                }
            ]
        } 
  12. Para aplicar la configuración de GraphQL, actualice el campo app_protect_policy_file con el nombre de la política GraphQL en el archivo nginx.conf . Una vez que haya actualizado el archivo, realice una recarga de 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 protección de aplicaciones NGINX:

  13. usuario nginx; procesos_de_trabajador  4;
    módulo_de_carga módulos/ngx_http_js_module.so;
    módulo_de_carga módulos/ngx_stream_js_module.so;
    módulo_de_carga módulos/ngx_http_app_protect_module.so;
    registro_de_errores /var/log/nginx/error.log depuración;
    eventos {
        conexiones_de_trabajador  65536;
    }
    http { incluir /etc/nginx/mime.types; aplicação de tipo predeterminado /octet-stream; enviar archivo activado; tiempo de espera de mantenimiento 65; servidor { escuchar <puerto>; nombre_servidor <nombre>; app_protect_enable activado; app_protect_security_log_enable activado; # Esta sección habilita la capacidad de registro         app_protect_security_log "/etc/app_protect/conf/log_sm.json" syslog:server=127.0.0.1:514; # Aquí es donde se define el registrador remoto en términos de: opciones de registro (definidas en el archivo referenciado), IP del servidor de registro, puerto del servidor de registro         app_protect_security_log "/etc/app_protect/conf/log_default.json" /var/log/app_protect/security.log;         proxy_http_version 1.1;            ubicación / {            tamaño máximo del cuerpo del cliente 0;              tipo predeterminado text/html;             contraseña proxy http://<dirección IP>:<puerto>$uri_solicitud;#<dirección IP> de la unidad Nginx         } ubicación /graphql { tamaño máximo del cuerpo del cliente 0; tipo predeterminado text/html; archivo de política de protección de la aplicación "/etc/app_protect/conf/graphql_policy.json"; contraseña de proxy http://<dirección IP>:<puerto>$$uri_de_solicitud; #<dirección IP> de la unidad Nginx         
            }     } }
  14. Reinicie NGINX Plus ejecutando este comando:
  15.    

    $ nginx -s recargar
    

Probar la configuración

Ahora puedes probar tu configuración siguiendo estos pasos:

  1. Inicie la aplicação Apollo GraphQL navegando al servidor NGINX Unit y escribiendo este comando:
  2. $ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
  3. Después de una actualización exitosa, debería ver que la aplicación está disponible en la dirección IP y el puerto del oyente:
  4. {          "éxito": "Reconfiguración completada."
  5. Para acceder al servidor Apollo GraphQL, abra su navegador web y pegue la dirección IP pública de su servidor. Por ejemplo: http://3.. X . X . X :4003/graphql (este ejemplo utiliza el puerto 4003).
  6. Para probar la aplicação, ingrese la consulta GraphQL correcta y ejecútela.
  7. Captura de pantalla del área de juegos de interfaz de usuario GraphQL de Apollo
    Figura 2: Zona de juegos de interfaz de usuario GraphQL de Apollo
  8. Consideremos una situación en la que un individuo introduce una inyección SQL en una consulta. En este caso, NGINX App Protect WAF protege el servidor Apollo GraphQL y produce una ID de soporte que describe la naturaleza del ataque.
  9. $ curl -X POST <a href="http://3.X.X.X:4003/graphql/">http://3.XXX:4003/graphql/</a> -H "Tipo de contenido: aplicação/json" -d '{"consulta": "consulta {hola OR 1=1;} "}'
    <html><head><title>Solicitud rechazada</title></head><body>La URL solicitada fue rechazada. Consulte con su administrador.<br><br>Su ID de soporte es: 7313092578494613509<br><br><ahref='javascript:history.back();'>[Volver]</a></body><html>
  10. Para verificar los detalles del ataque, consulte los registros de la instancia NGINX Plus, que se encuentran en /var/log/app_protect/security.log.
  11. tipo_ataque="Cliente sin navegador, Abuso de funcionalidad, Inyección SQL, Otra actividad de la aplicação , Ataque de analizador HTTP", motivo_excepción_bloqueo="N/D", fecha_hora="05/07/2023 21:22:38", puerto_destino="4003", cliente_ip="99.187.244.63", truncamiento="falso", método="POST", nombre_política="graphql_policy", protocolo="HTTP", estado_solicitud="bloqueado", código_respuesta="0", gravedad="Crítico", cves_sig="N/D, N/D", ids_sig="200002147,200002476", nombres_sig="Expresiones SQL-INJ como ""o 1=1"" (3), expresiones SQL-INJ como ""o 1=1"" (6) (Parámetro)",sig_set_names="{Firmas de inyección SQL},{Firmas de inyección SQL}",src_port="64257",sub_violations="Error de cumplimiento del protocolo HTTP: el encabezado del host contiene una dirección IP", support_id="7313092578494613509 ",
  12. En el módulo de Monitoreo de Seguridad de Administración NGINX, puede monitorear los datos de sus instancias y revisar las amenazas potenciales, así como ajustar las políticas según sea necesario para una protección óptima.
  13. Captura de pantalla de la descripción general del módulo de monitoreo de seguridad de NGINX Management Suite
    Figura 3: Descripción general del módulo de monitoreo de seguridad de NGINX Management Suite
    Captura de pantalla del resumen completo de las violaciones de seguridad en el módulo de Monitoreo de seguridad
    Figura 4: Resumen completo de las violaciones de seguridad en el módulo de Monitoreo de Seguridad

CONCLUSIÓN

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

También puede utilizar el monitoreo de seguridad de NGINX Management Suite para identificar y bloquear amenazas avanzadas comunes antes de que comprometan sus API GraphQL. Esta arquitectura simple defiende las API de GraphQL de algunas de las vulnerabilidades de API más comunes, incluidas la falta de autenticación y autorización, ataques de inyección, consumo de recursos sin restricciones y más.

Pruebe NGINX hoy 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


"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.