BLOG | NGINX

Anleitung: Bereitstellung und Sicherung von GraphQL-APIs mit F5 NGINX

NGINX-Teil-von-F5-horiz-schwarz-Typ-RGB
Akash Ananthanarayanan Miniaturansicht
Akash Ananthanarayanan
Veröffentlicht am 20. Juli 2023

Entwickler nutzen zunehmend GraphQL als bevorzugte Methode zum Erstellen von APIs. GraphQL vereinfacht das Abrufen von Daten aus mehreren Quellen und optimiert den Datenzugriff und die Datenaggregation. Durch die Abfrage mehrerer Datenquellen mit einer POST-Anfrage von einem einzigen Endpunkt aus können Entwickler, die GraphQL verwenden, gezielt die Daten anfordern, die sie aus verschiedenen Quellen benötigen. Mit diesem Ansatz lassen sich Einschränkungen in REST-API -Architekturen lösen, bei denen es beispielsweise zu Unterabfragen (Anfragen, denen alle erforderlichen Daten fehlen) oder Überabfragen (Anfragen werden an mehrere Endpunkte gesendet und erfassen zu viele Daten) kommen kann.

GraphQL ist die optimale Wahl für Microservices-Architekturen, da es Clients die Möglichkeit gibt, von jedem Dienst oder jeder Datenquelle nur die wesentlichen Daten abzurufen. Dies fördert eine erhöhte Flexibilität und Agilität, die entscheidende Komponenten für den Erfolg in einer modernen Geschäftsumgebung sind.

Sicherheit ist für GraphQL-APIs von entscheidender Bedeutung

Durch den höheren Zugriff und die größere Flexibilität bieten GraphQL-APIs auch eine größere Angriffsfläche, die für böswillige Akteure verlockend ist. Obwohl GraphQL relativ neu ist, weist es immer noch viele der gleichen Schwachstellen auf, die auch in anderen API-Architekturen zu finden sind. Glücklicherweise können Sie GraphQL-APIs vor diesen gängigen Bedrohungen schützen, indem Sie einige Ihrer vorhandenen Infrastrukturen und Tools nutzen.

Tutorialübersicht

Dieses Tutorial vermittelt ein Verständnis für die Bereitstellung und Sicherung von GraphQL-APIs. Wir veranschaulichen, wie ein Apollo GraphQL- Server auf einer F5 NGINX Unit mit F5 NGINX Plus als API-Gateway bereitgestellt wird. Darüber hinaus zeigen wir, wie Sie F5 NGINX App Protect WAF am API-Gateway für erweiterte Sicherheit bereitstellen und die F5 NGINX Management Suite verwenden, um Ihr WAF zu konfigurieren und auf potenzielle Bedrohungen zu überwachen. Mit diesem Setup können Sie außerdem NGINX App Protect WAF verwenden, um Angriffe wie SQL-Injection zu erkennen.

Befolgen Sie die Schritte in diesen Abschnitten, um das Tutorial abzuschließen:

Architektur mit NGINX, die Sicherheit und Authentifizierung für GraphQL-APIs, Überwachung auf Angriffe und den Apollo GraphQL-Server bietet, der auf NGINX Unit läuft
Abbildung 1: Architektur mit NGINX Plus und NGINX App Protect WAF, die Sicherheit und Authentifizierung für GraphQL-APIs bieten, NGINX Management Suite zur Überwachung auf Angriffe und den Apollo GraphQL-Server, der auf NGINX Unit läuft

Voraussetzungen

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

Installieren und Konfigurieren der Sicherheitsüberwachung der NGINX Management Suite

Die NGINX Management Suite integriert mehrere erweiterte Funktionen in eine einheitliche Plattform, um die Konfiguration, Überwachung und Fehlerbehebung von NGINX-Instanzen zu vereinfachen. Darüber hinaus erleichtert es die Verwaltung und Steuerung von APIs, optimiert den Anwendungslastausgleich und verbessert die allgemeine Sicherheit für Unternehmen.

Befolgen Sie diese Schritte, um die NGINX Management Suite zu installieren und zu konfigurieren:

Stellen Sie die NGINX-Einheit bereit und installieren Sie den Apollo GraphQL-Server

NGINX Unit ist eine effiziente und optimierte Laufzeitanwendung mit leichtem Design und damit die ideale Wahl für Unternehmen, die hohe Leistung ohne Kompromisse bei Geschwindigkeit oder Agilität suchen. Es handelt sich um einen Open-Source-Server, der TLS und Anforderungsrouting verarbeiten und Anwendungscode ausführen kann. Weitere Informationen zu NGINX Unit finden Sie auf der Seite „Hauptfunktionen“ .

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

Befolgen Sie diese Schritte, um die NGINX-Einheit bereitzustellen und den Apollo GraphQL-Server zu installieren:

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

Stellen Sie NGINX Plus als API-Gateway bereit und installieren Sie NGINX App Protect WAF

Wählen Sie eine geeignete Umgebung zum Bereitstellen einer NGINX Plus-Instanz aus. In diesem Tutorial verwenden wir eine AWS Ubuntu-Instanz und richten mit NGINX Plus einen API-Gateway-Reverse-Proxy ein. Für zusätzliche Sicherheit stellen wir dann NGINX App Protect WAF vor unserem API-Gateway bereit.

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

  1. Installieren Sie NGINX Plus auf einem unterstützten Betriebssystem .
  2. Installieren Sie das NGINX JavaScript-Modul (njs).
  3. Fügen Sie die load_modules im Verzeichnis nginx.conf hinzu.
  4. lade_Modulmodule/ngx_http_js_module.so;lade_Modulmodule/ngx_stream_js_module.so;
    
  5. Installieren Sie NGINX App Protect WAF auf einem unterstützten Betriebssystem.
  6. Fügen Sie das NGINX App Protect WAF-Modul zum Hauptkontext in der Datei nginx.conf hinzu:
  7. Lademodulmodule/ngx_http_app_protect_module.so;
  8. Aktivieren Sie NGINX App Protect WAF in einem http/server/location-Kontext in der Datei nginx.conf :
  9. app_protect_enable ein;
  10. Erstellen Sie eine GraphQL-Richtlinienkonfiguration im Verzeichnis /etc/app_protect/conf. Weitere Informationen zum Erstellen einer NGINX App Protect WAF-Richtlinie finden Sie in den entsprechenden Richtlinien .

    Hier ist ein Beispiel für eine GraphQL-Richtlinienkonfiguration:

  11. {   "Name": "graphql_policy",
        "Vorlage": {
            "Name": "POLICY_TEMPLATE_NGINX_BASE"
        },
        "Anwendungssprache": "utf-8",
        "caseInsensitive": false,
        "Durchsetzungsmodus": "blockieren",
        "Blockierungseinstellungen": {
            "Verstöße": [
                {
                    "Name": "VIOL_GRAPHQL_FORMAT",
                    "Alarm": wahr,
                   "Block": falsch
                },
                 {
                   "Name": "VIOL_GRAPHQL_MALFORMED",
                    "Alarm": wahr,
                   "Block": falsch
                },
                {
                   "Name": "VIOL_GRAPHQL_INTROSPECTION_QUERY",
                    "Alarm": wahr,
                   "Block": falsch
                },
                {
                   "Name": "VIOL_GRAPHQL_ERROR_RESPONSE",
                    „Alarm“: wahr,
                   „Block“: falsch
                }
            ]
        } 
  12. Um GraphQL-Einstellungen durchzusetzen, aktualisieren Sie das Feld app_protect_policy_file mit dem GraphQL-Richtliniennamen in der Datei nginx.conf . Nachdem Sie die Datei aktualisiert haben, führen Sie einen NGINX-Neuladevorgang durch, um die GraphQL-Einstellungen durchzusetzen.

    Hier ist ein Beispiel der Datei nginx.conf , die eine NGINX App Protect-Richtlinie enthält:

  13. Benutzer nginx; Arbeitsprozesse  4;
    Lademodulmodule/ngx_http_js_module.so;
    Lademodulmodule/ngx_stream_js_module.so; 
    Lademodulmodule/ngx_http_app_protect_module.so;
    Fehlerprotokoll /var/log/nginx/error.log debug;
    Ereignisse {
        Arbeitsverbindungen  65536;
    }
    http {     include       /etc/nginx/mime.types;     Standardtyp  Anwendung/Oktett-Stream;     Sendedatei        ein;     Keepalive_Timeout  65;     Server {         hören      <Port>;         Servername  <Name>;         app_protect_enable ein;         app_protect_security_log_enable ein; # Dieser Abschnitt aktiviert die Protokollierungsfunktion         app_protect_security_log "/etc/app_protect/conf/log_sm.json" syslog:server=127.0.0.1:514; # Hier wird der Remote-Logger definiert hinsichtlich: Protokollierungsoptionen (definiert in der referenzierten Datei), IP des Protokollservers, Port des Protokollservers         app_protect_security_log "/etc/app_protect/conf/log_default.json" /var/log/app_protect/security.log;         proxy_http_version 1.1;             Standort / {             client_max_body_size 0;              Standardtyp Text/HTML;              proxy_pass http://<IP-Adresse>:<Port>$request_uri;#<IP-Adresse> der Nginx-Einheit         }         Standort /graphql {             client_max_body_size 0;              Standardtyp Text/HTML;              app_protect_policy_file "/etc/app_protect/conf/graphql_policy.json";              Proxy-Passwort http://<IP-Adresse>:<Port>$$Request_URI; #<IP-Adresse> der Nginx-Einheit         
            }     } }
  14. Starten Sie NGINX Plus neu, indem Sie diesen Befehl ausführen:
  15.    

    $ nginx -s neu laden
    

Testen der Konfiguration

Jetzt können Sie Ihre Konfiguration testen, indem Sie die folgenden Schritte ausführen:

  1. Starten Sie die Apollo GraphQL-Anwendung, indem Sie zum NGINX Unit-Server navigieren und diesen Befehl eingeben:
  2. $ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
  3. Nach einem erfolgreichen Update sollten Sie sehen, dass die App unter der IP-Adresse und dem Port des Listeners verfügbar ist:
  4. {          "Erfolg": "Neukonfiguration abgeschlossen."
    }
  5. Um auf den Apollo GraphQL-Server zuzugreifen, öffnen Sie Ihren Webbrowser und fügen Sie die öffentliche IP-Adresse Ihres Servers ein. Beispiel: http://3.. X . X . X :4003/graphql (dieses Beispiel verwendet Port 4003).
  6. Um die Anwendung zu testen, geben Sie die richtige GraphQL-Abfrage ein und führen Sie die Abfrage aus.
  7. Screenshot des Apollo GraphQL UI-Spielplatzes
    Abbildung 2: Apollo GraphQL UI-Spielplatz
  8. Stellen Sie sich eine Situation vor, in der eine Person eine SQL-Injection in eine Abfrage eingibt. In diesem Fall schützt NGINX App Protect WAF den Apollo GraphQL-Server und erstellt eine Support-ID, die die Art des Angriffs beschreibt.
  9. $ curl -X POST http://3.X.X.X:4003/graphql/ -H "Content-Type:application/json" -d '{"query": "query {hallo ODER 1=1;} "}'
    <html><head><title>Anfrage abgelehnt</title></head><body>Die angeforderte URL wurde abgelehnt. Bitte wenden Sie sich an Ihren Administrator.<br><br>Ihre Support-ID lautet: 7313092578494613509<br><br><ahref='javascript:history.back();'>[Zurück]</a></body><html>
  10. Um die Details des Angriffs zu überprüfen, konsultieren Sie die Protokolle der NGINX Plus-Instanz unter /var/log/app_protect/security.log.
  11. attack_type="Nicht-Browser-Client, Missbrauch von Funktionen, SQL-Injection, Andere Anwendungsaktivität, HTTP-Parser-Angriff",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-Ausdrücke wie ""or 1=1"" (3),SQL-INJ-Ausdrücke wie ""or 1=1"" (6) (Parameter)",sig_set_names="{SQL Injection Signatures},{SQL Injection Signatures}",src_port="64257",sub_violations="HTTP-Protokollkonformität fehlgeschlagen: Host-Header enthält IP-Adresse", support_id="7313092578494613509 ",
  12. Im Modul „NGINX Management Security Monitoring“ können Sie die Daten Ihrer Instanzen überwachen, potenzielle Bedrohungen überprüfen sowie bei Bedarf Richtlinien für optimalen Schutz anpassen.
  13. Screenshot der Übersicht über das Sicherheitsüberwachungsmodul der NGINX Management Suite
    Abbildung 3: Übersicht über das Security Monitoring-Modul der NGINX Management Suite
    Screenshot einer umfassenden Zusammenfassung der Sicherheitsverletzungen im Modul „Sicherheitsüberwachung“
    Abbildung 4: Umfassende Übersicht über Sicherheitsverletzungen im Modul Security Monitoring

Abschluss

In diesem Tutorial haben Sie gelernt, 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 sichern.

Sie können auch die Sicherheitsüberwachung der NGINX Management Suite verwenden, um gängige erweiterte Bedrohungen zu identifizieren und zu blockieren, bevor sie Ihre GraphQL-APIs gefährden. 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 mehr.

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

Weitere Ressourcen


„Dieser Blogbeitrag kann auf Produkte verweisen, die nicht mehr verfügbar und/oder nicht mehr unterstützt werden. Die aktuellsten Informationen zu verfügbaren F5 NGINX-Produkten und -Lösungen finden Sie in unserer NGINX-Produktfamilie . NGINX ist jetzt Teil von F5. Alle vorherigen NGINX.com-Links werden auf ähnliche NGINX-Inhalte auf F5.com umgeleitet."