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 à partir de plusieurs sources, rationalisant l'accès aux données et l'agrégation. En interrogeant plusieurs sources de données avec une seule requête POST à partir d'un seul point de terminaison, les développeurs utilisant GraphQL peuvent demander précisément les données dont ils ont besoin à partir de diverses sources. Cette approche permet de résoudre les limitations rencontrées dans les architectures d'API REST , où des problèmes tels que des requêtes insuffisantes (requêtes manquant de toutes les données nécessaires) ou des requêtes excessives (requêtes allant à plusieurs points de terminaison et collectant des données excessives) peuvent survenir.
GraphQL est le choix optimal pour les architectures de microservices, car il offre aux clients la possibilité de récupérer uniquement les données essentielles de chaque service ou source de données. Cela favorise une flexibilité et une agilité accrues, qui sont des éléments essentiels pour prospérer dans un environnement commercial moderne.
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 est une application d'exécution efficace et rationalisée avec une conception légère, ce qui en fait un choix idéal pour les organisations recherchant des performances élevées sans compromettre la vitesse ou l'agilité. Il s'agit d'un serveur open source capable de gérer TLS, le routage des requêtes et d'exécuter du code d'application. Vous pouvez en savoir plus sur NGINX Unit sur sa page Principales fonctionnalité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.
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 défend les API GraphQL contre certaines des vulnérabilités d'API les plus courantes, notamment l'authentification et l'autorisation manquantes, les attaques par injection, la consommation illimitée de ressources, etc.
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."