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.
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.
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:
Antes de comenzar este tutorial, necesitará lo siguiente:
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:
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:
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:
load_modules
en el directorio nginx.conf . 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;
app_protect_enable activado;
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:
{ "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
}
]
}
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:
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
}
}
}
$ nginx -s recargar
Ahora puedes probar tu configuración siguiendo estos pasos:
$ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
{ "éxito": "Reconfiguración completada."
$ 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>
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 ",
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.
"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.