Tutorial: GraphQL-APIs mit F5 NGINX bereitstellen und absichern

NGINX | 20. Juli 2023

Entwickler setzen zunehmend auf GraphQL als bevorzugte Methode zur Entwicklung von APIs. GraphQL vereinfacht das Abrufen von Daten aus mehreren Quellen und optimiert so den Datenzugriff und die Datenaggregation. Durch die Abfrage mehrerer Datenquellen mit einer einzigen POST-Anfrage an einen zentralen Endpunkt können Entwickler mit GraphQL gezielt genau die Daten aus verschiedenen Quellen anfordern, die sie benötigen. Dieser Ansatz hilft dabei, Einschränkungen von REST-API-Architekturen zu überwinden, bei denen Probleme wie Under-Querying (Anfragen, die nicht alle erforderlichen Daten liefern) oder Over-Querying (Anfragen an mehrere Endpunkte, bei denen übermäßig viele Daten abgerufen werden) auftreten können.

GraphQL ist die optimale Wahl für Microservices-Architekturen, da Clients damit nur die tatsächlich benötigten Daten aus den einzelnen Diensten oder Datenquellen abrufen können. Dies sorgt für mehr Flexibilität und Agilität – entscheidende Voraussetzungen, um in einem modernen Geschäftsumfeld erfolgreich zu sein.

Sicherheit ist für GraphQL-APIs von entscheidender Bedeutung

Mit einem höheren Maß an Zugriffsmöglichkeiten und Flexibilität bieten GraphQL-APIs zugleich eine größere Angriffsfläche, die für böswillige Akteure attraktiv ist. Obwohl GraphQL noch relativ neu ist, weist es viele der gleichen Schwachstellen auf wie andere API-Architekturen. Glücklicherweise können Sie GraphQL-APIs vor diesen gängigen Bedrohungen schützen, indem Sie Teile Ihrer vorhandenen Infrastruktur und Ihre bestehenden Tools nutzen.

Tutorialübersicht

Dieses Tutorial vermittelt ein grundlegendes Verständnis dafür, wie GraphQL-APIs bereitgestellt und abgesichert werden. Wir zeigen, wie Sie einen Apollo GraphQL-Server auf F5 NGINX Unit mit F5 NGINX Plus als API-Gateway bereitstellen. Darüber hinaus zeigen wir, wie Sie F5 NGINX App Protect WAF am API-Gateway für erweiterte Sicherheit bereitstellen und F5 NGINX Management Suite verwenden, um Ihre WAF zu konfigurieren und potenzielle Bedrohungen zu überwachen. Mit dieser Konfiguration können Sie außerdem NGINX App Protect WAF verwenden, um Angriffe wie SQL-Injection zu erkennen.

Führen Sie die Schritte in diesen Abschnitten aus, um das Tutorial abzuschließen:

Abbildung 1: Architektur mit NGINX Plus und NGINX App Protect WAF zur Absicherung und Authentifizierung von GraphQL-APIs, NGINX Management Suite zur Überwachung auf Angriffe und dem auf NGINX Unit ausgeführten Apollo GraphQL-Server

Voraussetzungen

Bevor Sie mit diesem Tutorial beginnen, benötigen Sie Folgendes:

NGINX Management Suite Security Monitoring installieren und konfigurieren

NGINX Management Suite vereint mehrere fortschrittliche Funktionen auf einer zentralen Plattform und vereinfacht so die Konfiguration, Überwachung und Fehlerbehebung von NGINX-Instanzen. Darüber hinaus erleichtert sie die Verwaltung und Governance von APIs, optimiert den Anwendungslastenausgleich und verbessert die allgemeine Sicherheit von Organisationen.

Führen Sie die folgenden Schritte aus, um die NGINX Management Suite zu installieren und zu konfigurieren:

  • Befolgen Sie die Anweisungen auf der Seite „Virtuelle Maschine oder Bare Metal“ im Abschnitt „Installation“. Diese Seite enthält das Modul „Sicherheitsüberwachung“ (das in diesem Tutorial verwendet wird) sowie weitere Module, die Sie nach Bedarf installieren können.
  • Lizenz hinzufügen für jedes installierte Modul.
  • Installieren Sie das NGINX-Agent-Paket vom NGINX-Management-Suite-Host und richten Sie die Sicherheitsüberwachung für NGINX App Protect-Instanzen gemäß den Anweisungen hier ein.

NGINX Unit bereitstellen und den Apollo GraphQL Server installieren

NGINX Unit ist eine effiziente, schlanke Laufzeitumgebung mit ressourcenschonendem Design und damit die ideale Wahl für Unternehmen, die hohe Leistung benötigen, ohne Abstriche bei Geschwindigkeit oder Agilität zu machen. Der Open-Source-Server unterstützt TLS und Anfragen-Routing und kann Anwendungscode ausführen. Weitere Informationen zu NGINX Unit finden Sie auf der Seite „Wichtigste Funktionen“.

In diesem Tutorial verwenden wir Express als Node.js-Webanwendungs-Framework auf NGINX Unit, das umfangreiche Funktionen zum Erstellen eines Apollo-GraphQL-Servers bietet. Zum Zeitpunkt der Erstellung dieses Artikels ist Apollo Server 4 die aktuelle Version.

Führen Sie die folgenden Schritte aus, um NGINX Unit bereitzustellen und den Apollo-GraphQL-Server zu installieren:

  1. Installieren Sie NGINX Unit auf einem unterstützten Betriebssystem.
  2. Folgen Sie den Anweisungen im GitHub-Repository, um einen Apollo-GraphQL-Server einzurichten und Ihre Apollo-GraphQL-Hello-App zu erstellen.

NGINX Plus als API-Gateway bereitstellen und NGINX App Protect WAF installieren

Wählen Sie eine geeignete Umgebung für die Bereitstellung einer NGINX Plus-Instanz aus. In diesem Tutorial verwenden wir eine AWS-Ubuntu-Instanz und richten mit NGINX Plus einen Reverse-Proxy für das API-Gateway ein. Anschließend stellen wir NGINX App Protect WAF vor unserem API-Gateway bereit, um die Sicherheit zusätzlich zu erhöhen.

Befolgen Sie diese Anweisungen, um NGINX Plus und NGINX App Protect WAF zu installieren:

  1. NGINX Plus installieren auf einem unterstützten Betriebssystem.
  2. Installieren Sie das NGINX-JavaScript-Modul (njs).
  3. Fügen Sie die Direktive „load_modules“ im Verzeichnis „nginx.conf“ hinzu.
load_module modules/ngx_http_js_module.so;load_module modules/ngx_stream_js_module.so;
  1. Installieren Sie NGINX App Protect WAF auf einem unterstützten Betriebssystem.
  2. Fügen Sie das NGINX App Protect WAF-Modul dem Hauptkontext in der Datei „nginx.conf “ hinzu:
load_module modules/ngx_http_app_protect_module.so;
  1. Aktivieren Sie NGINX App Protect WAF in einem http/server/location-Kontext in der Datei nginx.conf:
app_protect_enable on;
  1. Erstellen Sie im Verzeichnis /etc/app_protect/conf eine GraphQL-Richtlinienkonfiguration. Weitere Informationen zum Erstellen einer NGINX App Protect WAF-Richtlinie finden Sie in den entsprechenden Richtlinien. Hier sehen Sie ein Beispiel für eine GraphQL-Richtlinienkonfiguration:
{   "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
              }
          ]
      } 
  1. Um die GraphQL-Einstellungen durchzusetzen, aktualisieren Sie das Feld „app_protect_policy_file“ in der Datei „nginx.conf“ mit dem Namen der GraphQL-Richtlinie. Nachdem Sie die Datei aktualisiert haben, laden Sie NGINX neu, um die GraphQL-Einstellungen durchzusetzen. Hier sehen Sie ein Beispiel für die Datei „nginx.conf“, die eine NGINX App Protect-Richtlinie enthält:
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
           
          }
      }
  }
  1. Starten Sie NGINX Plus mit folgendem Befehl neu:

$ nginx -s reload

Konfiguration testen

Jetzt können Sie Ihre Konfiguration mit den folgenden Schritten testen:

  1. Starten Sie die Apollo-GraphQL-Anwendung, indem Sie zum NGINX-Unit-Server navigieren und den folgenden Befehl eingeben:
$ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
  1. Nach einer erfolgreichen Aktualisierung sollte die App unter der IP-Adresse und dem Port des Listeners verfügbar sein:
{          "success": "Reconfiguration done."
  }
  1. Um auf den Apollo-GraphQL-Server zuzugreifen, öffnen Sie Ihren Webbrowser und geben Sie die öffentliche IP-Adresse Ihres Servers ein. Beispiel: http://3..X.X.X:4003/graphql (in diesem Beispiel wird Port 4003 verwendet).
  2. Um die Anwendung zu testen, geben Sie die richtige GraphQL-Abfrage ein und führen Sie sie aus.

Abbildung 2: Apollo GraphQL UI Playground

  1. Stellen Sie sich eine Situation vor, in der eine Person eine SQL-Injection in eine Abfrage einschleust. In diesem Fall schützt NGINX App Protect WAF den Apollo-GraphQL-Server und erzeugt eine Support-ID, die die Art des Angriffs beschreibt.
$ 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>
  1. Um die Details des Angriffs zu überprüfen, sehen Sie in den Protokollen der NGINX Plus-Instanz nach. Diese befinden sich unter /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",
  1. Im Modul „NGINX Management Security Monitoring“ können Sie die Daten Ihrer Instanzen überwachen, potenzielle Bedrohungen überprüfen und die Richtlinien nach Bedarf anpassen, um einen optimalen Schutz zu gewährleisten.

Abbildung 3: Übersicht über das Security-Monitoring-Modul der NGINX Management SuiteAbbildung 4: Umfassende Zusammenfassung der Sicherheitsverstöße im Security-Monitoring-Modul

Fazit

In diesem Tutorial haben Sie erfahren, wie Sie einen Apollo GraphQL Server auf NGINX Unit einrichten, NGINX Plus als API-Gateway bereitstellen und Ihre GraphQL-APIs mit NGINX App Protect WAF vor Ihrem API-Gateway schützen.

Sie können auch NGINX Management Suite Security Monitoring verwenden, um gängige komplexe Bedrohungen zu erkennen und zu blockieren, bevor sie Ihre GraphQL-APIs kompromittieren. Diese einfache Architektur schützt GraphQL-APIs vor einigen der häufigsten API-Schwachstellen, darunter fehlende Authentifizierung und Autorisierung, Injection-Angriffe, uneingeschränkter Ressourcenverbrauch und weitere.

Testen Sie NGINX noch heute mit einer 30-tägigen kostenlosen Testversion des API Connectivity Stack, die NGINX Plus, NGINX App Protect und NGINX Management Suite umfasst.

Weitere Ressourcen


Teilen
Schlagwörter: API, F5 NGINX, Tech

Über den Autor

Ähnliche Blogbeiträge

Die Zukunft von NGINX: Zurück zu unseren Open-Source-Wurzeln
NGINX | 23.08.2022

Die Zukunft von NGINX: Zurück zu unseren Open-Source-Wurzeln

Beim NGINX Sprint 2022 besinnen wir uns auf unsere Open-Source-Wurzeln. Erfahren Sie mehr über die Initiativen, die wir im kommenden Jahr verfolgen, und teilen Sie uns mit, was Sie sich wünschen.

Ein Leitfaden zur Auswahl eines Ingress-Controllers, Teil 1: Ermitteln Sie Ihre Anforderungen
NGINX | 08.09.2021

Ein Leitfaden zur Auswahl eines Ingress-Controllers, Teil 1: Ermitteln Sie Ihre Anforderungen

Ein Ingress-Controller kann eines der leistungsstärksten Tools in Ihrem Kubernetes-Stack sein. Erfahren Sie, wie Sie Ihre Ingress-Anforderungen ermitteln, um die beste Option auszuwählen.

Bereitstellung des NGINX Ingress Controllers auf Amazon EKS: So haben wir getestet
NGINX | 16.08.2021

Bereitstellung des NGINX Ingress Controllers auf Amazon EKS: So haben wir getestet

Wir haben kürzlich den Lösungsleitfaden zum NGINX Ingress Controller um Empfehlungen zur Dimensionierung für Amazon Elastic Kubernetes Service (EKS) ergänzt. In diesem Blogbeitrag erläutern wir, wie wir diese Empfehlungen erarbeitet haben, und stellen Ihnen alle Informationen zur Verfügung, die Sie benötigen, um selbst ähnliche Tests durchzuführen.

Protokollierung des Datenverkehrs zwischen NGINX und Upstream-Servern bei CDN77
NGINX | 12.12.2018

Protokollierung des Datenverkehrs zwischen NGINX und Upstream-Servern bei CDN77

Bei der Fehlersuche bei Datenverkehrsproblemen zwischen NGINX und Upstream-Servern konnte CDN77 die benötigten Daten nur aus dem Fehlerprotokoll mit aktivierter Debug-Ausgabe beziehen, was die Leistung beeinträchtigt und riesige Dateien erzeugt. Daher entwickelte das Team ein neues benutzerdefiniertes Modul, das ausschließlich die benötigten Daten protokolliert.

Ankündigung von NGINX Plus R16
NGINX | 05.09.2018

Ankündigung von NGINX Plus R16

NGINX Plus R16 ist eine einheitliche, elastische Ingress- und Egress-Schicht für Anwendungen, die die Funktionen eines Load Balancers, API-Gateways und einer WAF vereint und neue Features wie clusterfähige Ratenbegrenzung, Schlüssel-Wert-Speicher, „Random with Two Choices“, verbessertes UDP-Load-Balancing und vieles mehr bietet.

5 Gründe für den Umstieg auf softwarebasiertes Load Balancing
NGINX | 13.10.2016

5 Gründe für den Umstieg auf softwarebasiertes Load Balancing

Entdecken Sie fünf Gründe für den Wechsel zu einem softwarebasierten Load Balancer wie NGINX Plus, darunter Kosteneinsparungen, die Einführung von DevOps und eine einheitliche Lösung für alle Umgebungen.