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 . 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;
app_protect_enable on;
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:
{ "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
}
]
}
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:
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
}
}
}
$ nginx -s reload
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
{ "success": "Reconfiguration done."
}
$ 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>
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",
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.