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 . charger_module modules/ngx_http_js_module.so;charger_module modules/ngx_stream_js_module.so;
charger_module modules/ngx_http_app_protect_module.so;
app_protect_enable activé ;
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": "MODÈLE_POLITIQUE_BASE_NGINX"
},
"applicationLanguage": "utf-8",
"caseInsensitive": false,
"enforcementMode": "blocage",
"blocking-settings": {
"violations": [
{
"nom": "VIOL_GRAPHQL_FORMAT",
"alarme" : vrai,
"bloc" : faux
},
{
"nom" : "VIOL_GRAPHQL_MALFORMED",
"alarme" : vrai,
"bloc" : faux
},
{
"nom" : "VIOL_GRAPHQL_INTROSPECTION_QUERY",
"alarme" : vrai,
"bloc" : faux
},
{
"nom" : "VIOL_GRAPHQL_ERROR_RESPONSE",
"alarme" : vrai,
"blocage" : faux
}
]
}
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 :
utilisateur nginx ; processus_travailleurs 4 ;
module_chargement modules/ngx_http_js_module.so ;
module_chargement modules/ngx_stream_js_module.so ;
module_chargement modules/ngx_http_app_protect_module.so ;
journal_erreurs /var/log/nginx/error.log débogage ;
événements {
connexion_travailleurs 65536 ;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
serveur {
listen <port>;
nom_serveur <nom>;
app_protect_enable on;
app_protect_security_log_enable on; # Cette section active la capacité de journalisation
app_protect_security_log "/etc/app_protect/conf/log_sm.json" syslog:server=127.0.0.1:514; # C'est ici que le journal distant est défini en termes de : options de journalisation (définies dans le fichier référencé), IP du serveur de journalisation, port du serveur de journalisation
app_protect_security_log "/etc/app_protect/conf/log_default.json" /var/log/app_protect/security.log;
proxy_http_version 1.1;
emplacement / {
client_max_body_size 0;
type_par_défaut texte/html;
proxy_pass http://<adresse_ip>:<port>$request_uri;#<adresse IP> de l'unité Nginx
}
emplacement /graphql {
taille_max_du_corps_du_client 0 ;
type_par_défaut texte/html ;
fichier_politique_de_protection_de_l'application "/etc/app_protect/conf/graphql_policy.json" ;
proxy_pass http://<adresse_ip>:<port>$$uri_demande ; #<adresse IP> de l'unité Nginx
} } }
$ nginx -s recharger
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
{ "succès": "Reconfiguration effectuée."
}
$ curl -X POST http://3.X.X.X:4003/graphql/ -H "Content-Type:application/json" -d '{"query": "query {bonjour OU 1=1;} "}'
<html><head><title>Requête rejetée</title></head><body>L'URL demandée a été rejetée. Veuillez consulter votre administrateur.<br><br>Votre identifiant d'assistance est : 7313092578494613509<br><br><ahref='javascript:history.back();'>[Retour]</a></body><html>
attack_type="Client non-navigateur,Abus de fonctionnalité,Injection SQL,Autre activité d'application,Attaque d'analyseur HTTP",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="Critique",sig_cves="N/A,N/A",sig_ids="200002147,200002476",sig_names="Expressions SQL-INJ telles que ""ou 1=1"" (3),Expressions SQL-INJ telles que ""ou 1=1"" (6) (Paramètre)",sig_set_names="{Signatures d'injection SQL},{Signatures d'injection SQL}",src_port="64257",sub_violations="Échec de la conformité du protocole HTTP : l'en-tête de l'hôte contient l'adresse IP", 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."