Es gibt viele Möglichkeiten, die Authentifizierung in einem API-first-Produkt wie SparkPost zu erstellen, und die, die wir früh gewählt haben, ist die Verwendung von API-Schlüsseln. Das Einfügen Ihres API-Schlüssels als rohen Authorization-Header oder über die standardmäßige HTTP Basic Auth macht die Verwendung unserer APIs sehr einfach. API-Schlüssel wie dieser sind ein gängiger Standard für Webservices, aber wie sicher ist dieses System?
Die Risiken
Wenn Sie einen Webservice nutzen, kann ein Angreifer, falls er Ihren API-Schlüssel erhält, in Ihrem Namen handeln und Dinge tun wie (in unserem Fall):
seine E-Mail kostenlos über Ihr Konto senden
Ihre Empfängerliste herunterladen und sie an Spammer weitergeben (wenn sie nicht selbst Spammer sind)
Ihre Vorlagen bearbeiten, um Phishing-Links einzufügen
Spam oder Phishing in Ihrem Namen senden
Jedes dieser Ergebnisse könnte Ihrem Ruf und Ihrem Geschäft sehr schaden, und im Falle von Phishing könnte es potenziell direkt Ihren Endbenutzern schaden. Dies ist der Grund, warum es äußerst wichtig ist, sicherzustellen, dass niemand Ihren API-Schlüssel entdecken kann.
Die Chancen
Habe ich Bruteforce gehört? Unsere API-Schlüssel sind zufällig generierte 40-stellige hexadezimale Zeichenfolgen. Das ergibt insgesamt 1.4615e+48 API-Schlüssel. Wenn alle 3 Milliarden Computer und Smartphones in der Welt 100 API-Schlüssel pro Sekunde ausprobieren würden, vorausgesetzt, unsere Server würden das zulassen, würde es mehr als 150.000.000.000.000.000.000.000.000.000 Jahre dauern, alle möglichen API-Schlüssel zu durchlaufen. Daher macht es einfach keinen Sinn, den API-Schlüssel durch Bruteforce zu knacken.
Wie kann also jemand Ihren API-Schlüssel finden? Da der Schlüssel als Header übermittelt wird, kann er durch Man-in-the-Middle-Angriffe gelesen werden. Daher sollten Sie immer sicherstellen, dass Ihr Client die SSL-Zertifikate überprüft, wenn er eine Verbindung zu unseren APIs herstellt (dies ist ein Hauptgrund, warum wir HTTPS für API-Verbindungen verlangen). Auch wenn Sie unvorsichtig mit Ihrer Nutzung öffentlicher Code-Repositorys wie GitHub umgehen, kann Ihr API-Schlüssel leicht in der Wildnis exponiert werden. Dies ist kein akademisches Problem: Es sind bekannte Bots bekannt, die GitHub durchsuchen, um API-Schlüssel zu finden, und es gab erfolgreiche Angriffe durch diesen Vektor.
IP-Whitelisting zur Rettung
Wenn Sie einen API-Schlüssel erstellen, können Sie jetzt eine Liste von IPs angeben, die berechtigt sind, diesen Schlüssel zu verwenden. Sie können mehrere IPs sowie IP-Blöcke unter Verwendung der CIDR-Notation angeben, sodass Sie Ihre Server nicht einzeln auflisten müssen. Wenn der API-Schlüssel verwendet wird, für REST-APIs oder SMTP, vergleichen wir die verbindende IP mit dieser Liste, um den Zugriff zu gewähren oder zu verweigern.
Mit diesem Feature können, selbst wenn Ihr API-Schlüssel gefunden oder gestohlen wird, nur Ihre Server ihn verwenden. Angesichts der Risiken und wie einfach es ist, dies einzurichten, empfehlen wir unseren Kunden dringend, dieses Feature zu nutzen.
Letzte Worte
Ein paar persönliche Empfehlungen zur Sicherheit:
Bewahren Sie Ihre API-Schlüssel nicht im Code auf. Es gibt viele Vorteile, sie als Umgebungsvariablen zu halten, wie es Heroku tut
Sie können eine unbegrenzte Anzahl von API-Schlüsseln erstellen, und es ist am besten für die Sicherheit, die Verantwortlichkeiten auf mehrere API-Schlüssel zu verteilen, anstatt nur einen Schweizer Taschenmesser-Schlüssel zu verwenden. Dies würde Ihnen auch ermöglichen, verschiedene IP-Whitelists pro Schlüssel zu haben, um eine noch bessere Trennung der Anliegen zu erreichen
Wenn Sie mit Drittparteien arbeiten, teilen Sie Ihren API-Schlüssel nicht, sondern erstellen Sie einen neuen für sie, mit nur den notwendigen Berechtigungen und angehängt an deren IPs
Da API-Schlüssel nur über die Benutzeroberfläche erstellt werden können, ist die Aktivierung der 2-Faktor-Authentifizierung für Ihr SparkPost-Konto ein Muss und dauert nur 2 Minuten