Les développeurs choisissent de plus en plus GraphQL comme méthode privilégiée pour concevoir des API. GraphQL facilite la récupération de données issues de plusieurs sources, en simplifiant l'accès et l'agrégation des données. En interrogeant plusieurs sources avec une seule requête POST depuis un point de terminaison unique, vous pouvez demander précisément les données dont vous avez besoin. Cette méthode répond aux limites des architectures REST API, où les requêtes peuvent manquer d’informations essentielles ou, à l’inverse, solliciter plusieurs points de terminaison pour recueillir trop de données.
GraphQL constitue le meilleur choix pour les architectures microservices, car il vous permet d’extraire uniquement les données indispensables de chaque service ou source de données. Vous gagnez ainsi en flexibilité et en agilité, deux atouts essentiels pour réussir dans un environnement commercial actuel.
Avec un plus grand degré d’accès et de flexibilité, les API GraphQL présentent également une surface d’attaque plus étendue, attrayante pour les mauvais acteurs. Bien qu'il soit relativement nouveau, GraphQL est toujours exposé à de nombreuses vulnérabilités similaires à celles trouvées dans d'autres architectures d'API. Heureusement, vous pouvez protéger les API GraphQL contre ces menaces courantes en exploitant certaines de vos infrastructures et outils existants.
Ce didacticiel permet de comprendre comment fournir et sécuriser les API GraphQL. Nous illustrons comment déployer un serveur Apollo GraphQL sur F5 NGINX Unit avec F5 NGINX Plus comme passerelle API. De plus, nous montrons comment déployer F5 NGINX App Protect WAF au niveau de la passerelle API pour une sécurité avancée et utiliser F5 NGINX Management Suite pour configurer votre WAF et surveiller les menaces potentielles. Cette configuration vous permet également d'utiliser NGINX App Protect WAF pour détecter des attaques telles que l'injection SQL.
Suivez les étapes de ces sections pour terminer le didacticiel :
Avant de commencer ce tutoriel, vous avez besoin des éléments suivants :
NGINX Management Suite intègre plusieurs fonctionnalités avancées dans une plate-forme unifiée pour simplifier le processus de configuration, de surveillance et de dépannage des instances NGINX. Il facilite également la gestion et la gouvernance des API, optimise l’équilibrage de la charge des applications et améliore la sécurité globale des organisations.
Suivez ces étapes pour installer et configurer NGINX Management Suite :
NGINX Unit offre une exécution efficace et épurée avec un design léger, ce qui en fait un choix parfait pour les organisations qui veulent des performances élevées tout en restant rapides et agiles. C’est un serveur open source capable de gérer TLS, le routage des requêtes et d’exécuter du code d’application. Explorez davantage NGINX Unit sur sa page Fonctionnalités clés.
Dans ce didacticiel, nous utilisons Express comme framework d'application Web Node.js sur NGINX Unit qui offre des capacités étendues pour la construction d'un serveur Apollo GraphQL. Au moment de la rédaction de cet article, la version actuelle est Apollo Server 4.
Suivez ces étapes pour déployer NGINX Unit et installer le serveur Apollo GraphQL :
Sélectionnez un environnement approprié pour déployer une instance NGINX Plus. Dans ce didacticiel, nous utilisons une instance AWS Ubuntu et configurons un proxy inverse de passerelle API à l'aide de NGINX Plus. Nous déployons ensuite NGINX App Protect WAF devant notre passerelle API pour plus de sécurité.
Suivez ces instructions pour installer NGINX Plus et NGINX App Protect WAF :
load_modules
dans le répertoire 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;
Créez une configuration de politique GraphQL dans le répertoire /etc/app_protect/conf. Pour plus d'informations sur la création d'une politique WAF NGINX App Protect, veuillez vous référer aux directives correspondantes .
Voici un exemple de configuration de politique 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
}
]
}
Pour appliquer les paramètres GraphQL, mettez à jour le champ app_protect_policy_file
avec le nom de la politique GraphQL dans le fichier nginx.conf . Une fois le fichier mis à jour, effectuez un rechargement NGINX pour appliquer les paramètres GraphQL.
Voici un exemple du fichier nginx.conf qui inclut une politique 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
}
}
}
$ nginx -s reload
Vous pouvez maintenant tester votre configuration en suivant ces étapes :
$ 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",
Dans ce didacticiel, vous avez appris à configurer un serveur Apollo GraphQL sur NGINX Unit, à déployer NGINX Plus en tant que passerelle API et à sécuriser vos API GraphQL avec NGINX App Protect WAF devant votre passerelle API.
Utilisez la surveillance de sécurité de NGINX Management Suite pour repérer et bloquer rapidement les menaces avancées fréquentes avant qu’elles ne compromettent vos API GraphQL. Cette architecture simple protège efficacement vos API GraphQL contre les vulnérabilités courantes telles qu’une authentification ou une autorisation manquante, les attaques par injection, la consommation illimitée de ressources, et bien plus.
Testez NGINX dès aujourd'hui avec un essai gratuit de 30 jours de l'API Connectivity Stack , qui comprend NGINX Plus, NGINX App Protect et NGINX Management Suite.
« Cet article de blog peut faire référence à des produits qui ne sont plus disponibles et/ou qui ne sont plus pris en charge. Pour obtenir les informations les plus récentes sur les produits et solutions F5 NGINX disponibles, explorez notre famille de produits NGINX . NGINX fait désormais partie de F5. Tous les liens NGINX.com précédents redirigeront vers un contenu NGINX similaire sur F5.com."