BLOG | NGINX

Tutoriel : Fournissez et sécurisez les API GraphQL avec F5 NGINX

NGINX-Partie-de-F5-horiz-black-type-RGB
Akash Ananthanarayanan Vignette
Akash Ananthanarayanan
Publié le 20 juillet 2023

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.

La sécurité est essentielle pour les API GraphQL

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.

Présentation du didacticiel

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 :

Architecture avec NGINX fournissant la sécurité et l'authentification pour les API GraphQL, la surveillance des attaques et le serveur Apollo GraphQL exécuté sur l'unité NGINX
Figure 1 : Architecture avec NGINX Plus et NGINX App Protect WAF fournissant la sécurité et l'authentification pour les API GraphQL, la surveillance NGINX Management Suite pour les attaques et le serveur Apollo GraphQL exécuté sur NGINX Unit

Prérequis

Avant de commencer ce tutoriel, vous avez besoin des éléments suivants :

Installer et configurer la surveillance de sécurité de NGINX Management Suite

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 :

  • Suivez les instructions sur la page Machine virtuelle ou Bare Metal de la page d’installation . Cette page inclut le module Surveillance de sécurité (utilisé dans ce tutoriel) et d'autres modules que vous pouvez installer à votre guise.
  • Ajoutez la licence pour chaque module installé.
  • Installez le package NGINX Agent à partir de l'hôte NGINX Management Suite et configurez la surveillance de sécurité pour les instances NGINX App Protect en suivant les instructions ici .

Déployer l'unité NGINX et installer le serveur Apollo GraphQL

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 :

  1. Installez NGINX Unit sur un système d’exploitation pris en charge .
  2. Suivez le référentiel GitHub pour créer un serveur Apollo GraphQL et créer votre application hello Apollo GraphQL.

Déployez NGINX Plus en tant que passerelle API et installez NGINX App Protect WAF

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 :

  1. Installez NGINX Plus sur un système d’exploitation pris en charge .
  2. Installez le module JavaScript NGINX (njs).
  3. Ajoutez les load_modules dans le répertoire nginx.conf .
  4. charger_module modules/ngx_http_js_module.so;charger_module modules/ngx_stream_js_module.so;
    
  5. Installez NGINX App Protect WAF sur un système d’exploitation pris en charge.
  6. Ajoutez le module WAF NGINX App Protect au contexte principal dans le fichier nginx.conf :
  7. charger_module modules/ngx_http_app_protect_module.so;
  8. Activez NGINX App Protect WAF sur un contexte http/serveur/emplacement dans le fichier nginx.conf :
  9. app_protect_enable activé ;
  10. 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 :

  11. {   "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
                }
            ]
        } 
  12. 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 :

  13. 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         
            }     } }
  14. Redémarrez NGINX Plus en exécutant cette commande :
  15.    

    $ nginx -s recharger
    

Tester la configuration

Vous pouvez maintenant tester votre configuration en suivant ces étapes :

  1. Démarrez l'application Apollo GraphQL en accédant au serveur NGINX Unit et en saisissant cette commande :
  2. $ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
  3. Après une mise à jour réussie, vous devriez voir que l’application est disponible sur l’adresse IP et le port de l’écouteur :
  4. {          "succès": "Reconfiguration effectuée."
    }
  5. Pour accéder au serveur Apollo GraphQL, ouvrez votre navigateur Web et collez l'adresse IP publique de votre serveur. Par exemple : http://3.. X . X . X :4003/graphql (cet exemple utilise le port 4003).
  6. Pour tester l'application, entrez la requête GraphQL correcte et exécutez la requête.
  7. Capture d'écran de l'interface utilisateur d'Apollo GraphQL
    Figure 2 : Aire de jeux de l'interface utilisateur Apollo GraphQL
  8. Considérez une situation dans laquelle un individu saisit une injection SQL dans une requête. Dans ce cas, NGINX App Protect WAF protège le serveur Apollo GraphQL et produit un ID de support qui décrit la nature de l'attaque.
  9. $ 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>
  10. Pour vérifier les détails de l’attaque, reportez-vous aux journaux de l’instance NGINX Plus, qui se trouvent dans /var/log/app_protect/security.log.
  11. 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 ",
  12. 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 pour une protection optimale.
  13. Capture d'écran de la présentation du module de surveillance de la sécurité de NGINX Management Suite
    Figure 3 : Présentation du module de surveillance de la sécurité de NGINX Management Suite
    Capture d'écran du résumé complet des violations de sécurité dans le module Surveillance de la sécurité
    Figure 4 : Résumé complet des violations de sécurité dans le module Surveillance de la sécurité

Conclusion

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.

Ressources supplémentaires


« 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."