Les développeurs adoptent de plus en plus GraphQL comme méthode privilégiée pour créer des API. GraphQL simplifie la récupération de données provenant de plusieurs sources, ce qui facilite leur accès et leur agrégation. En interrogeant plusieurs sources de données à l’aide d’une seule requête POST envoyée à un point de terminaison unique, les développeurs utilisant GraphQL peuvent demander précisément les données dont ils ont besoin auprès de différentes sources. Cette approche permet de remédier aux limites rencontrées dans les architectures d’API REST, où peuvent survenir des problèmes tels que la sous-interrogation (requêtes ne renvoyant pas toutes les données nécessaires) ou la sur-interrogation (requêtes envoyées à plusieurs points de terminaison et récupérant une quantité excessive de données).
GraphQL est le choix idéal pour les architectures de microservices, car il permet aux clients de récupérer uniquement les données essentielles de chaque service ou source de données. Cette approche favorise une flexibilité et une agilité accrues, deux qualités indispensables pour prospérer dans un environnement professionnel moderne.
La sécurité est essentielle pour les API GraphQL
En offrant davantage d’accès et de flexibilité, les API GraphQL présentent également une surface d’attaque plus étendue, susceptible d’attirer des acteurs malveillants. Bien que relativement récent, GraphQL reste exposé à bon nombre des vulnérabilités que l’on retrouve dans d’autres architectures d’API. Heureusement, vous pouvez protéger les API GraphQL contre ces menaces courantes en vous appuyant sur certains de vos outils et infrastructures existants.
Présentation du tutoriel
Ce tutoriel vous aide à comprendre comment déployer et sécuriser des API GraphQL. Nous vous montrons comment déployer un serveur Apollo GraphQL sur F5 NGINX Unit avec F5 NGINX Plus comme passerelle d’API. Nous vous expliquons également comment déployer F5 NGINX App Protect WAF au niveau de la passerelle d’API pour bénéficier d’une sécurité avancée, et comment 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 les injections SQL.
Suivez les étapes décrites dans ces sections pour terminer le tutoriel :
- Vérifier les prérequis
- Installer et configurer la surveillance de la sécurité de NGINX Management Suite
- Déployer NGINX Unit et installer le serveur Apollo GraphQL
- Déployer NGINX Plus en tant que passerelle API et installer NGINX App Protect WAF
- Tester la configuration
Figure 1 : architecture avec NGINX Plus et NGINX App Protect WAF assurant la sécurité et l’authentification des API GraphQL, NGINX Management Suite surveillant les attaques et le serveur Apollo GraphQL s’exécutant sur NGINX Unit
Prérequis
Avant de commencer ce tutoriel, vous aurez besoin des éléments suivants :
- L’essai gratuit de 30 jours d’API Connectivity Stack pour accéder à NGINX Plus, NGINX App Protect et NGINX Management Suite
- Linux/Unix ou un autre environnement compatible
- Connaissance de base de la ligne de commande Linux
- Un éditeur de texte (Vi ou Vim)
- Curl
Installer et configurer la surveillance de la sécurité de NGINX Management Suite
NGINX Management Suite intègre plusieurs fonctionnalités avancées au sein d’une plateforme unifiée afin de simplifier la configuration, la surveillance et le dépannage des instances NGINX. Elle facilite également la gestion et la gouvernance des API, optimise la répartition de charge des applications et renforce la sécurité globale des organisations.
Suivez ces étapes pour installer et configurer NGINX Management Suite :
- Suivez les instructions de la page « Machine virtuelle ou serveur physique » de la section « Installation ». Cette page inclut le module « Surveillance de la sécurité » (utilisé dans ce tutoriel), ainsi que d’autres modules que vous pouvez installer à votre convenance.
- Ajoutez la licence pour chaque module installé.
- Installez le package NGINX Agent depuis l’hôte NGINX Management Suite et configurez la surveillance de la sécurité pour les instances NGINX App Protect en suivant les instructions disponibles ici.
Déployer NGINX Unit et installer le serveur Apollo GraphQL
NGINX Unit est un environnement d’exécution efficace et optimisé, dont la conception légère en fait un choix idéal pour les organisations qui recherchent des performances élevées sans sacrifier la rapidité ni l’agilité. Ce serveur open source peut gérer le protocole TLS et le routage des requêtes, ainsi qu’exécuter du code applicatif. Pour en savoir plus sur NGINX Unit, consultez sa page consacrée aux fonctionnalités clés.
Dans ce tutoriel, nous utilisons Express comme framework d’application web Node.js sur NGINX Unit, qui offre de nombreuses fonctionnalités pour créer un serveur GraphQL Apollo. À l’heure où nous écrivons ces lignes, la version actuelle est Apollo Server 4.
Suivez ces étapes pour déployer NGINX Unit et installer le serveur Apollo GraphQL :
- Installez NGINX Unit sur un système d’exploitation pris en charge.
- Suivez les instructions du dépôt GitHub pour créer un serveur Apollo GraphQL et votre application Hello World Apollo GraphQL.
Déployer NGINX Plus en tant que passerelle API et installer le WAF NGINX App Protect
Sélectionnez un environnement adapté pour déployer une instance NGINX Plus. Dans ce tutoriel, nous utilisons une instance Ubuntu sur AWS et configurons un proxy inverse de passerelle d’API à l’aide de NGINX Plus. Nous déployons ensuite NGINX App Protect WAF en amont de notre passerelle d’API afin de renforcer sa sécurité.
Suivez ces instructions pour installer NGINX Plus et NGINX App Protect WAF :
- Installer NGINX Plus sur un système d’exploitation pris en charge.
- Installez le module JavaScript NGINX (njs).
- Ajoutez la directive «
load_modules» dans le fichier « nginx.conf ».
load_module modules/ngx_http_js_module.so;load_module modules/ngx_stream_js_module.so;- Installez NGINX App Protect WAF sur un système d’exploitation pris en charge.
- Ajoutez le module NGINX App Protect WAF au contexte principal dans le fichier « nginx.conf » :
load_module modules/ngx_http_app_protect_module.so;- Activez NGINX App Protect WAF dans un contexte http/server/location du fichier nginx.conf :
app_protect_enable on;- Créez une configuration de stratégie GraphQL dans le répertoire /etc/app_protect/conf. Pour plus d’informations sur la création d’une stratégie WAF NGINX App Protect, consultez les instructions correspondantes. Voici un exemple de configuration de stratégie 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 stratégie GraphQL dans le fichier nginx.conf. Une fois le fichier mis à jour, rechargez NGINX pour appliquer les paramètres GraphQL. Voici un exemple de fichier nginx.conf incluant une stratégie 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
}
}
}- Redémarrez NGINX Plus en exécutant cette commande :
$ nginx -s reloadTester la configuration
Vous pouvez maintenant tester votre configuration en suivant ces étapes :
- Démarrez l’application Apollo GraphQL en accédant au serveur NGINX Unit et en saisissant la commande suivante :
$ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config- Après une mise à jour réussie, vous devriez constater que l’application est accessible à l’adresse IP et sur le port de l’écouteur :
{ "success": "Reconfiguration done."
}- Pour accéder au serveur Apollo GraphQL, ouvrez votre navigateur web et saisissez l’adresse IP publique de votre serveur. Par exemple : http://3..X.X.X:4003/graphql (cet exemple utilise le port 4003).
- Pour tester l’application, saisissez la requête GraphQL appropriée, puis exécutez-la.
Figure 2 : interface de test Apollo GraphQL
- Prenons le cas où une personne injecte du code SQL dans une requête. Dans ce cas, le WAF NGINX App Protect protège le serveur Apollo GraphQL et génère un identifiant de support décrivant la nature de l’attaque.
$ 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>- Pour consulter les détails de l’attaque, reportez-vous aux journaux de l’instance NGINX Plus, situés dans /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",- Dans le module NGINX Management Security Monitoring, vous pouvez surveiller les données de vos instances et examiner les menaces potentielles, ainsi qu’ajuster les politiques selon les besoins afin de garantir une protection optimale.
Figure 3 : Vue d’ensemble du module Security Monitoring de NGINX Management SuiteFigure 4 : Synthèse complète des violations de sécurité dans le module Security Monitoring
Conclusion
Dans ce tutoriel, vous avez appris à configurer un serveur Apollo GraphQL sur NGINX Unit, à déployer NGINX Plus en tant que passerelle d’API et à sécuriser vos API GraphQL avec NGINX App Protect WAF en amont de votre passerelle d’API.
Vous pouvez également utiliser NGINX Management Suite Security Monitoring pour identifier et bloquer les menaces avancées courantes avant qu’elles ne compromettent vos API GraphQL. Cette architecture simple protège les API GraphQL contre certaines des vulnérabilités les plus courantes des API, notamment l’absence d’authentification et d’autorisation, les attaques par injection, la consommation illimitée de ressources, et bien plus encore.
Essayez NGINX dès aujourd’hui grâce à un essai gratuit de 30 jours de l’API Connectivity Stack, qui comprend NGINX Plus, NGINX App Protect et NGINX Management Suite.
Ressources supplémentaires
- Blog
: Sécurisez votre passerelle d’API avec NGINX App Protect WAF - Blog : Sécurisez vos API GraphQL et vos API de streaming bidirectionnel gRPC avec F5 NGINX App Protect WAF
À propos de l’auteur

Articles de blog associés

Tendances actuelles des technologies cloud natives, de l’ingénierie de plateforme et de l’IA
Découvrez les principaux enseignements tirés des réponses à l’enquête annuelle F5 NGINX sur les dernières tendances en matière de technologies cloud natives, de sécurité, d’ingénierie de plateforme et d’IA.
Quels contrôleurs Ingress NGINX sont affectés par les vulnérabilités CVE-2022-4886, CVE-2023-5043 et CVE-2023-5044 ?
Lorsque de nouvelles CVE sont signalées, il est facile de ne plus savoir si elles concernent un outil de contrôleur Ingress NGINX particulier, car il existe plusieurs projets. Cet article présente les CVE et explique comment distinguer les différents projets de contrôleurs Ingress afin de dissiper toute confusion.
Votre API est-elle en temps réel ? Testez sa latence avec l’outil rtapi de NGINX
Votre API répond-elle aux requêtes en moins de 30 ms ? Si ce n’est pas le cas, il ne s’agit pas d’une API en temps réel offrant la faible latence exigée par la grande majorité des organisations. Mesurez la latence de votre API avec l’outil rtapi de NGINX et découvrez comment NGINX peut l’aider à offrir une réactivité en temps réel.

Un testeur d’expressions régulières pour NGINX et NGINX Plus
Le testeur d’expressions régulières (regex) pour NGINX et NGINX Plus vous évite de tâtonner en vous indiquant si une expression régulière utilisée dans un bloc location ou map correspond aux valeurs comme prévu. Il génère la configuration appropriée et affiche les valeurs des groupes de capture.
Caches partagés avec les clusters de cache NGINX Plus, partie 1
Optimisez la capacité de votre cache web en le répartissant entre plusieurs serveurs de cache web NGINX ou NGINX Plus. Découvrez comment procéder dans cet article.
Introduction aux microservices
Les microservices suscitent actuellement beaucoup d’intérêt. Cet article de blog est le premier d’une série de sept consacrée à la conception, au développement et au déploiement de microservices.