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

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 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 :

  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.

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.

Ressources complé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."