REST-API-Sicherheitsleitfaden

Das Wissen über das Sichern von REST-APIs ist ebenso wichtig wie das Schreiben der APIs selbst. Die meisten REST-APIs basieren auf dem HTTP-Protokoll, und jeder Benutzer mit Internetverbindung kann darauf zugreifen, ebenso wie schlechte Benutzer. Es ist sehr wichtig, sichere APIs zu schreiben, um das Geschäft zu schützen.

Bevor wir mit der Sicherung von RESTful-APIs beginnen, sollten wir verstehen, welche Optionen wir als Entwickler haben? Was passt gut zu unserem Anwendungsfall?

Table of Contents1. Authentication vs. Authorization2. Four Ways to Secure RESTful Web Services- BASIC Authentication- DIGEST Authentication- Client CERT Authentication- OAUTH2 API Keys3. RESTful Web Services Security Implementations- Using SecurityContext- Using Annotations4. Best Practices

Unterschied zwischen Authentifizierung vs. authorization

Bevor wir in die Hauptdiskussion einsteigen, wollen wir unsere Fakten klarstellen, was Authentifizierung und was Autorisierung ist.

In einfachem Englisch ist Authentifizierung der Prozess der Feststellung, dass „der Benutzer wirklich jemand ist, der er zu sein behauptet“. Technisch gesehen handelt es sich um die Anmeldung beim System über Benutzername / Passwort oder ähnliche Mechanismen, z. B. Fingerabdruckscannen, Sicherheitstoken, Sicherheitsfragen oder SAML-Token, die vom SSO-Login empfangen werden. Es muss etwas geben, das den Benutzer von anderen identifizieren kann.

Sobald sich der Benutzer im System befindet, bezieht sich die Autorisierung auf Regeln, die bestimmen, „was der Benutzer tun darf“ und was nicht, z. B. kann ein normaler Benutzer eine Nachricht in einer öffentlichen Gruppe posten, aber Benutzer nur mit Editorrolle können etwas löschen. Autorisierung wird häufig sowohl als einleitende Einrichtung von Berechtigungen durch einen Systemadministrator als auch als Überprüfung der Berechtigungswerte angesehen, die bereits eingerichtet wurden, wenn ein Benutzer Zugriff auf das System erhält.

Wenn wir RESTful-Webdienste sichern, müssen wir uns um beide Faktoren kümmern. Die beiden Konzepte sind völlig orthogonal und unabhängig, aber beide sind von zentraler Bedeutung für das Sicherheitsdesign, und das Versäumnis, eines der beiden zu korrigieren, erhöht die Wahrscheinlichkeit eines kompromittierten Systems..

Vier Möglichkeiten zum Sichern von RESTful-Webdiensten

Es gibt mehrere Möglichkeiten, eine RESTful-API in Java zu sichern. Lassen Sie uns die 4 beliebtesten Optionen durchgehen:

2.1. BASIC Authentication

Es ist die einfachste aller Techniken und wahrscheinlich auch die am häufigsten verwendete. Sie verwenden Anmelde– / Kennwortformulare – es handelt sich nur um die Standardauthentifizierung. Sie geben Ihren Benutzernamen und Ihr Passwort ein und senden das Formular an den Server, und die Anwendung identifiziert Sie als Benutzer.

Das Hauptproblem bei dieser Sicherheitsimplementierung besteht darin, dass Anmeldeinformationen auf einfache Weise vom Client an den Server weitergegeben werden. Anmeldeinformationen werden bei der Übertragung lediglich mit Base64 codiert, jedoch in keiner Weise verschlüsselt oder gehasht. Auf diese Weise kann jeder Sniffer die gesendeten Pakete über das Netzwerk lesen.

HTTPS wird daher typischerweise der Standardauthentifizierung vorgezogen oder in Verbindung mit dieser verwendet, wodurch die Konversation mit dem Webserver vollständig verschlüsselt wird. Das Beste daran ist, dass niemand von außen erraten kann, dass eine grundlegende Authentifizierung stattfindet.

2.2. DIGEST Authentication

Diese Authentifizierungsmethode verwendet Hashing-Algorithmen, um das vom Benutzer eingegebene Kennwort (Password Hash genannt) zu verschlüsseln, bevor es an den Server gesendet wird. Dies macht es offensichtlich viel sicherer als die Standardauthentifizierungsmethode, bei der das Kennwort des Benutzers im Klartext übertragen wird, der von jedem, der es abfängt, leicht gelesen werden kann.

Lesen Sie mehr: Verschlüsselte Passwörter generieren

Es gibt viele solcher Hashing-Algorithmen in Java auch, die wirklich effektiv für die Passwortsicherheit wie MD5, SHA, BCrypt, SCrypt und PBKDF2WithHmacSHA1 Algorithmen beweisen kann.

Bitte denken Sie daran, dass, sobald dieses Passwort Hash generiert und in der Datenbank gespeichert, Sie können es nicht zurück zum ursprünglichen Passwort konvertieren. Jedes Mal, wenn sich der Benutzer bei der Anwendung anmeldet, müssen Sie den Passwort-Hash erneut generieren und mit dem in der Datenbank gespeicherten Hash abgleichen. Wenn der Benutzer sein Passwort vergessen hat, müssen Sie ihm ein temporäres Passwort senden und ihn bitten, es mit seinem neuen Passwort zu ändern. Nun, es ist heutzutage ein allgemeiner Trend.

2.3. Clientzertifikatauthentifizierung

Dies ist ein Mechanismus, bei dem eine Vertrauensvereinbarung zwischen dem Server und dem Client über Zertifikate hergestellt wird. Sie müssen von einer Agentur unterzeichnet werden, die eingerichtet wurde, um sicherzustellen, dass das zur Authentifizierung vorgelegte Zertifikat legitim ist.

Wenn der Client mit dieser Technik versucht, auf eine geschützte Ressource zuzugreifen, stellt er dem Server das Zertifikat vor, anstatt einen Benutzernamen oder ein Kennwort anzugeben. Das Zertifikat enthält neben einem eindeutigen privat-öffentlichen Schlüsselpaar die Benutzerinformationen für die Authentifizierung einschließlich der Sicherheitsanmeldeinformationen. Der Server bestimmt dann, ob der Benutzer über die Zertifizierungsstelle legitim ist. Darüber hinaus muss überprüft werden, ob der Benutzer Zugriff auf die Ressource hat. Dieser Mechanismus muss HTTPS als Kommunikationsprotokoll verwenden, da wir keinen sicheren Kanal haben, um zu verhindern, dass jemand die Identität des Clients stiehlt.

Ein vollständiges Tutorial zum Generieren von Sicherheitszertifikaten finden Sie in offiziellen Oracle-Dokumenten.

2.4. OAUTH2 API-Schlüssel

Wenn Sie jemals Anwendungen entwickelt haben, die über die Cloud mit anderen Anwendungen interagieren, z. B. Facebook-Integration oder Twitter-Authentifizierung usw. dann haben Sie dies bereits verwendet. Sie benötigen einen API-Schlüssel und ein API-Geheimnis, um Sie richtig zu identifizieren. Dieser API-Schlüssel und dieses Geheimnis sind eine zufällig codierte Zeichenfolge, die nicht zu erraten ist.

Um zu verstehen, wie es funktioniert, nehmen wir an, Sie verwenden eine Flickr (Foto-Sharing-Anwendung) und möchten einige Ihrer Fotos mit der REST-API veröffentlichen. Sie erstellen die Anfrage wie in Flickr-Dokumenten dokumentiert und senden sie dann.

Beim Empfang der Anfrage authentifiziert Flickr den Benutzer, indem es die Informationen aus dem API-Schlüssel mit dem geheimen Schlüssel liest, der dem Benutzer gehört. Sobald diese Validierungen erfolgreich sind, liefert der Server die Antwort an den Client. So erhalten wir eine Antwort mit allen Fotos, die kürzlich in Flickr gepostet wurden.

Wie Sie feststellen werden, können Sie auf diese Weise problemlos Anwendungen mithilfe der API des Anbieters erstellen. Außerdem ermöglicht Ihnen der Anbieter die Authentifizierung und den Zugriff auf öffentliche Informationen.

Wenn jemand beginnt, Vereinbarungen zu missachten, z. B. Junk-Traffic zu senden oder gegen Richtlinien zu verstoßen, entzieht der Anbieter den API-Schlüssel und verhindert die missbräuchliche Verwendung seiner APIs.

REST-API-Sicherheitsimplementierungen

Abgesehen von den oben genannten Konzepten müssen Sie Ihre RESTful-APIs in Ihrem Unternehmen normalerweise mit den folgenden Methoden sichern.

3.1. JAX-RS SecurityContext-Instanz

Die javax.ws.rs.core.SecurityContext -Schnittstelle bietet Zugriff auf sicherheitsrelevante Informationen für eine Anforderung und ist javax.servlet.http.HttpServletRequest sehr ähnlich.

Sie greifen auf den SecurityContext zu, indem Sie eine Instanz in ein Klassenfeld, eine Setter-Methode oder einen Methodenparameter einfügen, indem Sie die Annotation javax.ws.rs.core.Context verwenden, z. B. im folgenden Code sc.isUserInRole() wird verwendet, um die Autorisierung für den Benutzer zu überprüfen.

3.2. JAR-RS-Annotationen für die Autorisierung auf Methodenebene

Diese Technik wird häufig in Unternehmensanwendungen verwendet, um Rollen und Verantwortlichkeiten eines authentifizierten Benutzers für eine bestimmte Operation zu überprüfen. JAX-RS bietet zu diesem Zweck die folgenden Anmerkungen.

  • @ permitAll
  • @DenyAll
  • @RolesAllowed

Ein Beispiel für die Verwendung von Annotationen kann sein:

Mehr lesen : Beispiel für JAX-RS-Authentifizierung und -Autorisierung

Best Practices für die REST-API-Sicherheit

Notieren wir uns einige wichtige Punkte beim Entwerfen der Sicherheit für Ihre RESTful-Webdienste.

  1. Verwenden Sie nur das HTTPS-Protokoll, damit Ihre gesamte Kommunikation immer verschlüsselt ist.
  2. Senden Sie niemals Authentifizierungsdaten oder API-Schlüssel als Abfrageparameter. Sie erscheinen in URL und können leicht protokolliert oder verfolgt werden.
  3. Verwenden Sie immer die härteste Verschlüsselungsstufe. Es wird helfen, mehr Vertrauen zu haben.
  4. Für Ressourcen, die von RESTful-Webdiensten bereitgestellt werden, ist es wichtig, sicherzustellen, dass jede PUT-, POST- und DELETE-Anforderung vor Cross Site Request Forgery geschützt ist.
  5. Überprüfen Sie die Eingabedaten immer so schnell wie möglich, wenn sie in der Servermethode empfangen werden. Verwenden Sie so oft wie möglich nur primitive Daten als Eingabeparameter.
  6. Verlassen Sie sich auf vom Framework bereitgestellte Validierungsfunktionen, da diese bereits von einer großen Community getestet wurden.

Teilen Sie mir Ihre Gedanken und Erfahrungen mit, wie Sie RESTful-Webdienste in Ihrer Organisation sichern können.

Viel Spaß beim Lernen!!

War dieser Beitrag hilfreich?

Lassen Sie uns wissen, ob Ihnen der Beitrag gefallen hat. Nur so können wir uns verbessern.
Ja
Nein

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

More: