Es gibt viele Möglichkeiten, die Authentifizierung in einem API-first Produkt wie SparkPost zu implementieren, und die, die wir frühzeitig gewählt haben, ist die Verwendung von API-Schlüsseln. Ihr API-Schlüssel kann als roter Authorization-Header oder über Standard-HTTP Basic Auth injectiert werden, was es sehr einfach macht, unsere APIs zu nutzen. API-Schlüssel wie dieser sind ein gängiger Standard für Webdienste, aber wie sicher ist dieses System?
Die Risiken
Wenn bei der Verwendung eines Webdienstes ein Angreifer Ihren API-Schlüssel erlangt, kann er in Ihrem Namen handeln und Dinge tun wie (in unserem Fall):
seine E-Mails kostenlos über Ihr Konto versenden
Ihre Empfängerliste herunterladen und sie Spammern zur Verfügung stellen (sofern 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 Ihrer Reputation und Ihrem Geschäft sehr schaden, und im Falle von Phishing möglicherweise direkt Ihren Endbenutzern schaden. Das ist der Grund, warum es äußerst wichtig ist, sicherzustellen, dass niemand Ihren API-Schlüssel entdeckt.
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 der Welt versuchen würden, 100 API-Schlüssel pro Sekunde einzugeben, vorausgesetzt, unsere Server würden das erlauben, würde es mehr als 150.000.000.000.000.000.000.000.000.000 Jahre dauern, um alle möglichen API-Schlüssel durchzugehen. Daher macht es keinen Sinn, den API-Schlüssel zu brute-forcen.
Wie kann also jemand Ihren API-Schlüssel finden? Da der Schlüssel als Header übergeben wird, kann er durch Man-in-the-Middle-Angriffe gelesen werden, sodass Sie immer sicherstellen sollten, dass Ihr Client die SSL-Zertifikate überprüft, wenn er sich mit unseren APIs verbindet (das ist ein wesentlicher Grund, warum wir HTTPS für API-Verbindungen verlangen). Außerdem, wenn Sie nachlässig im Umgang mit öffentlichen Code-Repositories wie GitHub sind, kann Ihr API-Schlüssel leicht im Internet exponiert werden. Dies ist kein akademisches Problem: Es gibt bekannte Bots, die GitHub durchsuchen, um API-Schlüssel zu finden, und es gab erfolgreiche Angriffe durch diesen Vektor.
IP-Whitelisting zur Rettung
Beim Erstellen eines API-Schlüssels können Sie jetzt eine Liste von IPs angeben, die autorisiert sind, diesen Schlüssel zu verwenden. Sie können mehrere IPs sowie IP-Blockadressen mithilfe der CIDR-Notation angeben, sodass Sie Ihre Server nicht einzeln aufführen müssen. Wenn der API-Schlüssel verwendet wird, werden die verbindende IP-Adresse mit dieser Liste abgeglichen, um den Zugriff zu gewähren oder zu verweigern.
Mit diesem Feature, selbst wenn Ihr API-Schlüssel gefunden oder gestohlen wird, können nur Ihre Server ihn verwenden. Angesichts der Risiken und wie einfach es ist, es einzurichten, empfehlen wir allen unseren Kunden, dieses Feature zu nutzen.
Letzte Worte
Einige persönliche Empfehlungen zur Sicherheit:
Bewahren Sie Ihre API-Schlüssel nicht im Code auf. Es gibt viele Vorteile, sie als Umgebungsvariablen zu speichern, 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 aufzuteilen, anstatt nur einen Schweizer Taschenmesser-Schlüssel zu verwenden. Dies würde Ihnen auch ermöglichen, verschiedene IP-Whitelists pro Schlüssel zu haben, für noch bessere Trennung der Verantwortlichkeiten
Wenn Sie mit Dritten arbeiten, teilen Sie Ihren API-Schlüssel nicht, sondern erstellen Sie einen neuen für sie, mit nur den benötigten Berechtigungen und angefügt an ihre IPs
Da API-Schlüssel nur über die Benutzeroberfläche erstellt werden können, ist die Aktivierung der Zwei-Faktor-Authentifizierung für Ihr SparkPost-Konto ein Muss und dauert nur 2 Minuten