Best Practices zum Sichern einer REST-API / eines Webdienstes [geschlossen]

828

Gibt es beim Entwerfen einer REST-API oder eines REST-Service bewährte Methoden für den Umgang mit Sicherheit (Authentifizierung, Autorisierung, Identitätsverwaltung)?

Beim Erstellen einer SOAP-API haben Sie WS-Security als Leitfaden und es gibt viel Literatur zu diesem Thema. Ich habe weniger Informationen zum Sichern von REST-Endpunkten gefunden.

Obwohl ich verstehe, dass REST absichtlich keine Spezifikationen hat, die mit WS- * vergleichbar sind, hoffe ich, dass Best Practices oder empfohlene Muster entstanden sind.

Jede Diskussion oder Links zu relevanten Dokumenten wäre sehr dankbar. Wenn es darauf ankommt, würden wir WCF mit POX / JSON-serialisierten Nachrichten für unsere REST-APIs / -Dienste verwenden, die mit Version 3.5 von .NET Framework erstellt wurden.

Nathan
quelle
1
Kennen Sie eine vollständige reale Anwendung, die gute Muster und Praktiken mit REST-API und webServices in Github verwendet?
PreguntonCojoneroCabrón

Antworten:

298

Wie bereits erwähnt, ist Amazon S3 ein gutes Modell für die Arbeit. Ihre Anforderungssignaturen verfügen über einige Funktionen (z. B. das Einfügen eines Zeitstempels), die vor versehentlicher und böswilliger Wiedergabe von Anforderungen schützen.

Das Schöne an HTTP Basic ist, dass praktisch alle HTTP-Bibliotheken dies unterstützen. In diesem Fall müssen Sie natürlich SSL benötigen, da das Senden von Klartext-Passwörtern über das Internet fast überall eine schlechte Sache ist. Bei Verwendung von SSL ist Basic Digest vorzuziehen, da Digest, selbst wenn der Anrufer bereits weiß, dass Anmeldeinformationen erforderlich sind, einen zusätzlichen Roundtrip benötigt, um den Nonce-Wert auszutauschen. Mit Basic senden die Anrufer die Anmeldeinformationen einfach beim ersten Mal.

Sobald die Identität des Kunden festgestellt ist, ist die Autorisierung nur noch ein Implementierungsproblem. Sie können die Autorisierung jedoch mit einem vorhandenen Autorisierungsmodell an eine andere Komponente delegieren. Auch hier ist das Schöne an Basic, dass Ihr Server eine Klartextkopie des Client-Passworts erhält, die Sie bei Bedarf einfach an eine andere Komponente in Ihrer Infrastruktur weitergeben können.

Greg Hewgill
quelle
3
SSL ist ein wichtiger Bestandteil der Sicherheit, aber nicht alle Anwendungen erfordern diese Verschlüsselungsstufe. Wenn jemand unterwegs stiehlt, was Sie öffentlich auf Twitter veröffentlichen werden, ist das ein so großer Nachteil? Für den Großteil der API wird die SSL-Verschlüsselung bevorzugt. Die Infrastrukturanforderungen von SSL sind etwas höher als bei Klartext, und keine zwischengeschalteten (hier kantenbasierten) Caching-Server können am Caching von Inhalten teilnehmen, auf die wiederholt zugegriffen wird. Beachten Sie, dass Ihre Skalierbarkeit beeinträchtigt werden kann, wenn Sie die angebotene Verschlüsselung unbedingt benötigen.
Norman H
36
@NormanH: Ihr Argument ist falsch, denn wenn jemand die gesamte Transaktion sehen kann, die ich zum Posten auf Twitter verwende, kann er sich als ich ausgeben und seine eigenen Nachrichten unter meinem Namen posten.
Greg Hewgill
3
In Wikipedia zur Digest-Authentifizierung heißt es: "Die Digest-Zugriffsauthentifizierung ist eine der vereinbarten Methoden, mit denen ein Webserver Anmeldeinformationen mit dem Webbrowser eines Benutzers aushandeln kann. Sie wendet eine Hash-Funktion auf ein Kennwort an, bevor es über das Netzwerk gesendet wird sicherer als die Standardzugriffsauthentifizierung, die Klartext sendet. " Das wäre eine Standardmethode, um das zu erreichen, worauf ich oben angespielt habe. (Siehe en.wikipedia.org/wiki/Digest_access_authentication für Details)
Norman H
5
"sending plaintext passwords over the net is almost universally a bad thing"- Können Sie das "fast" näher erläutern? Wann ist es keine schlechte Idee?
Toniedzwiedz
2
@GregHewgill Selbst in einem privaten Netzwerk möchte ich nicht, dass meine Benutzer die Passwörter der anderen Benutzer abfangen können. Die einzige Situation, an die ich denken kann, in der es in Ordnung ist, ein Passwort über ein Netzwerk zu senden, ist, wenn der Benutzer alleine im Netzwerk ist. Die Tatsache, dass solche Dinge anderswo passieren, ist kaum ein Grund, dies zuzulassen.
Toniedzwiedz
115

Es gibt keine anderen Standards für REST als HTTP. Es gibt etablierte REST-Services. Ich schlage vor, Sie werfen einen Blick auf sie und bekommen ein Gefühl dafür, wie sie funktionieren.

Zum Beispiel haben wir uns bei der Entwicklung unserer eigenen Ideen viele Ideen aus dem S3 REST-Service von Amazon geliehen. Wir haben uns jedoch dafür entschieden, das erweiterte Sicherheitsmodell, das auf Anforderungssignaturen basiert, nicht zu verwenden. Der einfachere Ansatz ist die HTTP-Basisauthentifizierung über SSL. Sie müssen entscheiden, was in Ihrer Situation am besten funktioniert.

Außerdem empfehle ich das Buch RESTful Web Services von O'reilly. Es erklärt die Kernkonzepte und bietet einige Best Practices. Sie können das von ihnen bereitgestellte Modell im Allgemeinen Ihrer eigenen Anwendung zuordnen.

Mark Renouf
quelle
6
RESTful Web Services ist definitiv ein großartiges Buch. Ein Muss in diesem Bereich zu lesen. Es war geradezu inspirierend.
EdgarVerona
6
Wie kommt es, dass @aehlke so viele positive Stimmen für diesen Kommentar erhalten hat, wenn man bedenkt, dass (1) es keine REST-Spezifikation gibt und (2) die Fielding-Dissertation über die Architekturstile und das Design netzwerkbasierter Softwarearchitekturen REST ausdrücklich erwähnt und HTTP in 6.3: REST Auf HTTP angewendet.
20
HTTP ist keine Voraussetzung für REST.
Nategood
1
Das RESTful Web Services-Buch ist kostenlos auf der Website verfügbar: crummy.com/writing/RESTful-Web-Services
icc97
Ich hatte vor, das Buch zu lesen, und dann wurde mir klar, dass es hauptsächlich für das XML-Format gedacht ist. Sollte ich dieses Buch angesichts der Popularität von JSON verwenden? Oder es ist nicht vom Datenaustauschformat abhängig. Brauchen Sie Anleitung.
Bhargav Jhaveri
72

Vielleicht möchten Sie auch einen Blick auf OAuth werfen , ein neues offenes Protokoll für die tokenbasierte Autorisierung, das speziell auf http apis abzielt.

Es ist dem Ansatz von flickr sehr ähnlich und erinnert sich an die Milch- Rest-Apis (nicht unbedingt gute Beispiele für erholsame Apis, aber gute Beispiele für den tokenbasierten Ansatz).

John Spurlock
quelle
3
Aber es scheint, dass das zweibeinige oAuth, von dem ich denke, dass es hier gebraucht wird, nicht so stark abgedeckt ist (Mangel an Informationen) wie das dreibeinige.
Redben
4
Bei OAuth geht es um die Übertragung von Autorisierungen, dh ich, der Eigentümer des Informations- / Kontos, lasse Dienst A mit meinen Daten zu Dienst B interagieren (z. B. lasse ich Twitter auf mein Facebook schreiben). Es geht nicht um eine Autorisierung im weiteren Sinne, bei der es darum geht, zu steuern, was Benutzer mit Ressourcen (Daten, Informationen, Dienste ...) tun können. Hier setzt XACML an. Mit XACML können Sie Autorisierungsrichtlinien definieren, wer was tun kann.
David Brossard
60

Auf Github gibt es eine großartige Checkliste :

Authentifizierung

  • Erfinden Sie das Rad bei Authentifizierung, Token-Generierung und Kennwortspeicherung nicht neu. Verwenden Sie die Standards.

  • Verwenden Max Retryund Gefängnisfunktionen in Login.

  • Verwenden Sie die Verschlüsselung für alle vertraulichen Daten.

JWT (JSON Web Token)

  • Verwenden Sie einen zufälligen komplizierten Schlüssel (JWT Secret), um das brutale Erzwingen des Tokens sehr schwer zu machen.

  • Extrahieren Sie den Algorithmus nicht aus der Nutzlast. Erzwingen Sie den Algorithmus im Backend (HS256 oder RS256).

  • Machen Sie den Token-Ablauf ( TTL, RTTL) so kurz wie möglich.

  • Speichern Sie keine sensiblen Daten in der JWTNutzlast, sie können einfach dekodiert werden.

OAuth

  • Überprüfen Sie immer redirect_uriserverseitig, um nur URLs auf der Whitelist zuzulassen.

  • Versuchen Sie immer, Code und keine Token auszutauschen (nicht zulassen response_type=token).

  • Verwenden Sie den Statusparameter mit einem zufälligen Hash, um CSRFden OAuthAuthentifizierungsprozess zu verhindern .

  • Definieren Sie den Standardbereich und überprüfen Sie die Bereichsparameter für jede Anwendung.

Zugriff

  • Begrenzen Sie Anforderungen (Drosselung), um DDoS- / Brute-Force-Angriffe zu vermeiden.

  • Verwenden Sie HTTPS auf der Serverseite, um MITM (Man In The Middle Attack) zu vermeiden.

  • Verwenden Sie einen HSTSHeader mit SSL, um einen SSL-Strip-Angriff zu vermeiden.

Eingang

  • Verwenden Sie die richtige HTTP-Methode gemäß der Operation: GET(Lesen), POST(Erstellen), PUT/PATCH(Ersetzen / Aktualisieren) und DELETE(Löschen eines Datensatzes) und antworten Sie mit, 405 Method Not Allowedwenn die angeforderte Methode für die angeforderte Ressource nicht geeignet ist.

  • Validate Content-Type auf Anfrage AcceptHeader (Content Negotiation), damit nur die unterstützten Format (zB application/xml, application/jsonusw.) und reagieren mit 406 Not AcceptableAntwort , wenn nicht abgestimmt.

  • Validate content-typeder gebuchten Daten , wie Sie annehmen (zB application/x-www-form-urlencoded, multipart/form-data, application/jsonusw.).

  • Überprüfen Sie die Benutzereingaben, um häufige Sicherheitslücken zu vermeiden (z. B. XSS, SQL-Injection, Remotecode Execution usw.).

  • Verwenden Sie keine vertraulichen Daten (Anmeldeinformationen, Kennwörter, Sicherheitstoken oder API-Schlüssel) in der URL, sondern verwenden Sie den Standardheader Authorization.

  • Verwenden Sie einen API-Gateway-Dienst, um das Caching und Rate LimitRichtlinien (z. B. Kontingent, Spike-Arrest, Limit für gleichzeitige Raten) zu aktivieren und API-Ressourcen dynamisch bereitzustellen.

wird bearbeitet

  • Überprüfen Sie, ob alle Endpunkte hinter der Authentifizierung geschützt sind, um einen unterbrochenen Authentifizierungsprozess zu vermeiden.

  • Benutzereigene Ressourcen-ID sollte vermieden werden. Verwenden Sie / me / orders anstelle von / user / 654321 / orders.

  • Inkrementieren Sie IDs nicht automatisch. Verwenden Sie stattdessen UUID.

  • Wenn Sie XML-Dateien analysieren, stellen Sie sicher, dass das Parsen von Entitäten nicht aktiviert ist, um XXE (Angriff auf externe XML-Entitäten) zu vermeiden.

  • Wenn Sie XML-Dateien analysieren, stellen Sie sicher, dass die Entitätserweiterung nicht aktiviert ist, um Billion Laughs / XML-Bomben durch exponentielle Entitätserweiterungsangriffe zu vermeiden.

  • Verwenden Sie ein CDN zum Hochladen von Dateien.

  • Wenn Sie mit einer großen Datenmenge arbeiten, verwenden Sie Workers and Queues, um so viel wie möglich im Hintergrund zu verarbeiten und die Antwort schnell zurückzugeben, um eine HTTP-Blockierung zu vermeiden.

  • Vergessen Sie nicht, den DEBUG- Modus auszuschalten.

Ausgabe

  • X-Content-Type-Options: nosniffHeader senden .

  • X-Frame-Options: denyHeader senden .

  • Content-Security-Policy: default-src 'none'Header senden .

  • Entfernen von Fingerabdrücken headers - X-Powered-By, Server, X-AspNet-Versionusw.

  • Erzwingen Sie content-typeIhre Antwort. Wenn Sie zurückkehren, application/jsonlautet Ihr Antwortinhaltstyp application/json.

  • Geben Sie keine vertraulichen Daten wie Anmeldeinformationen, Kennwörter oder Sicherheitstoken zurück.

  • Geben Sie den richtigen Statuscode entsprechend dem abgeschlossenen Vorgang zurück. ( zum Beispiel 200 OK, 400 Bad Request, 401 Unauthorized, 405 Method Not Allowed, usw.).

Andrejs
quelle
1
Schöne Liste, wenn auch etwas eigensinnig - und sie beginnt mit einem Unsinn imho: "Verwenden Sie keine Standardauthentifizierung. Verwenden Sie die Standardauthentifizierung (z. B. JWT, OAuth)." Sie können nicht mehr Standard-y als Basic Auth erhalten, und es hat seinen Platz, insbesondere für APIs, bei denen die Clients keine Browser sind (für Browser ist JWT normalerweise besser geeignet). OAuth hingegen verwendet eine ganze Reihe anderer Kompromisse für die Authentifizierung und ist nicht wirklich mit Basic Auth und JWT vergleichbar.
Johndodo
Sie haben Recht, BasicAuth mit HTTPS ist weit verbreitet, wird aber heiß diskutiert - security.stackexchange.com/questions/988/… . Ich werde diesen Punkt trotzdem entfernen.
Andrejs
43

Ich bin ein bisschen überrascht, dass SSL mit Client-Zertifikaten noch nicht erwähnt wurde. Zugegeben, dieser Ansatz ist nur dann wirklich nützlich, wenn Sie sich darauf verlassen können, dass die Benutzergemeinschaft durch Zertifikate identifiziert wird. Eine Reihe von Regierungen / Unternehmen geben sie jedoch an ihre Benutzer aus. Der Benutzer muss sich nicht um die Erstellung einer weiteren Kombination aus Benutzername und Kennwort kümmern. Die Identität wird bei jeder Verbindung festgelegt, sodass die Kommunikation mit dem Server vollständig zustandslos sein kann und keine Benutzersitzungen erforderlich sind. (Um nicht zu implizieren, dass einige / alle anderen genannten Lösungen Sitzungen erfordern)

stinkymatt
quelle
Wir verwenden dies tatsächlich für einige Integrationen sowie für verschlüsselte VPN-Tunnel, um ältere Systeme zu unterstützen, die wir nicht kontrollieren und die nicht über https kommunizieren können.
Casey
Client-Zertifikate können Probleme verursachen, wenn Sie einen Lastausgleich benötigen. Dies ist möglich, aber weniger einfach.
Jeremy Logan
2
@fiXedd - Das Gegenteil war meine Erfahrung mit Kundenzertifikaten, weil sie wirklich zustandslos sind. Clientzertifikat-authentifizierte Verbindungen können mit einem dummen Load Balancer unabhängig von der Verbindungsstabilität ausgeglichen werden, da sie einen gemeinsamen Status von null zwischen Client und Server erfordern.
Stinkymatt
4
Oh, Sie können es tun ... Sie können nur den Load Balancer den TCP-Verkehr weiterleiten lassen, aber Sie können beispielsweise nicht den Load Balancer als Endpunkt für das SSL festlegen.
Jeremy Logan
Ist es immer noch sicher, wenn die Client-Zertifikate und ihre Root-Berechtigung selbst signiert sind? Die Stammberechtigung wird in die vertrauenswürdigen Stammzertifizierungsstellen des Clients importiert.
Joyce
38

Jeder in diesen Antworten hat die echte Zugriffskontrolle / Autorisierung übersehen.

Wenn es in Ihren REST-APIs / Webdiensten beispielsweise um das POSTEN / Abrufen von medizinischen Unterlagen geht, möchten Sie möglicherweise eine Zugriffssteuerungsrichtlinie definieren, wer unter welchen Umständen auf die Daten zugreifen kann. Zum Beispiel:

  • Ärzte können die Krankenakte eines Patienten abrufen, mit dem sie eine Pflegebeziehung haben
  • Niemand kann medizinische Daten außerhalb der Übungsstunden veröffentlichen (z. B. 9 bis 5).
  • Endbenutzer können Krankenakten, die sie besitzen, oder Krankenakten von Patienten erhalten, für die sie der Vormund sind
  • Krankenschwestern können die Krankenakte eines Patienten aktualisieren, der zur gleichen Einheit wie die Krankenschwester gehört.

Um diese detaillierten Berechtigungen zu definieren und zu implementieren, müssen Sie eine attributbasierte Zugriffssteuerungssprache namens XACML verwenden, die eXtensible Access Control Markup Language.

Die anderen Standards hier sind für die folgenden:

  • OAuth: id. Föderation und Delegation von Autorisierungen, z. B. einen Dienst in meinem Namen für einen anderen Dienst handeln lassen (Facebook kann auf meinem Twitter posten)
  • SAML: Identitätsverbund / Web-SSO. Bei SAML geht es sehr darum, wer der Benutzer ist.
  • WS-Security / WS- * -Standards: Diese konzentrieren sich auf die Kommunikation zwischen SOAP-Diensten. Sie sind spezifisch für das Messaging-Format (SOAP) auf Anwendungsebene und befassen sich mit Aspekten des Messaging, z. B. Zuverlässigkeit, Sicherheit, Vertraulichkeit, Integrität, Atomizität, Ereignisse ... Keine decken die Zugriffskontrolle ab und alle sind SOAP-spezifisch.

XACML ist technologieunabhängig. Es kann auf Java-Apps, .NET-, Python-, Ruby-Webdienste, REST-APIs und mehr angewendet werden.

Folgendes sind interessante Ressourcen:

David Brossard
quelle
2
Ich verstehe nicht, warum Sie nicht einfach ein Tokensystem implementieren können, das den Benutzer und seine Berechtigungen erhält, was im Wesentlichen dasselbe ist.
Stan
Sie können einen tokenbasierten Ansatz wählen. Das funktioniert auch gut, aber Sie benötigen immer noch die Logik, die definiert, welche Berechtigungen Benutzer erhalten, dh welche Berechtigungen in das Token eingefügt werden sollen. Das kann Ihnen XACML helfen. Es vermeidet auch das Aufblähen von Token.
David Brossard
2
Was trägt "9 bis 5" zur Sicherheit bei? Als ob Angreifer nur nachts aktiv sind? Ganz zu schweigen von den schwerwiegenden Auswirkungen auf den Gebrauch, als ob Ärzte nur "9 bis 5" arbeiten.
Roland
Dies ist eine häufige Anforderung in Gesundheitsszenarien. Schauen Sie sich zum Beispiel HL7 an. Es gibt auch Szenarien, in denen ein Arzt außerhalb der Geschäftszeiten Zugang benötigt. Was Hacker betrifft, sobald sie in allen Wetten sind, sind sie aus
David Brossard
1
Einige meiner Kollegen untersuchen das tatsächlich. Danke @SimplyG.
David Brossard
25

Ich habe OAuth einige Male verwendet und auch einige andere Methoden (BASIC / DIGEST). Ich schlage OAuth von ganzem Herzen vor. Der folgende Link ist das beste Tutorial, das ich zur Verwendung von OAuth gesehen habe:

http://hueniverse.com/oauth/guide/

Rob Ottaway
quelle
Obwohl dies eine sehr alte Antwort in Bezug auf OAuth 1.0 ist, ist es erwähnenswert, dass der Autor des von Ihnen zitierten Links Folgendes zu OAuth 2.0 zu sagen hatte : "Ich bin zu dem Schluss gekommen, dass OAuth 2.0 ein schlechtes Protokoll ist ... Im Vergleich zu OAuth 1.0 ist die 2.0-Spezifikation komplexer, weniger interoperabel, weniger nützlich, unvollständiger und vor allem weniger sicher. " . Der Kommentar, den ich zitiere, wurde einige Jahre nach der Veröffentlichung Ihrer Antwort abgegeben.
Skomisa
17

Einer der besten Beiträge, die ich je in Bezug auf Sicherheit in Bezug auf REST gesehen habe, ist bei 1 RainDrop vorbei . Die MySpace-APIs verwenden OAuth auch aus Sicherheitsgründen, und Sie haben vollen Zugriff auf ihre benutzerdefinierten Kanäle im RestChess-Code, mit dem ich viel recherchiert habe. Dies wurde bei Mix vorgeführt und Sie können das Posting hier finden .

Degnom
quelle
Vielen Dank für den Link (1 RainDrop) - sehr interessante Diskussion über Sicherheit in Bezug auf SOAP v REST
Nathan
15

Danke für den exzellenten Rat. Wir haben schließlich einen benutzerdefinierten HTTP-Header verwendet, um ein Identitätstoken vom Client an den Service zu übergeben, um die Integration unserer RESTful-API in das kommende Zermatt Identity-Framework von Microsoft vorzubereiten. Ich habe das Problem hier und unsere Lösung hier beschrieben . Ich habe auch den Rat von tweakt befolgt und RESTful Web Services gekauft - ein sehr gutes Buch, wenn Sie eine RESTful-API jeglicher Art erstellen .

Nathan
quelle
1
Dieser Ansatz klingt für mich faul. Was hindert einen Angreifer daran, das Identitäts-Token zu verwenden, um den Client zu maskieren? HTTPS schützt weder die URL noch die Header, als ich das letzte Mal nachgesehen habe ...
Gili
2
Hmmm ... ich bin mir nicht sicher, ob du damit Recht hast. Ich glaube, dass bis auf die wenigen Header, die erforderlich sind, um zu verstehen, welche Art von Verschlüsselung erforderlich ist, alle anderen Header verschlüsselt sind.
Nathan
51
Das ist falsch. HTTPS schützt ALLES. Es geht: TCP-Handshake ... TLS-Handshake ... <ENCRYPTED> GET / foo 200 OK ... Teardown </ ENCRYPTED>.
Mark Renouf
1
Beachten Sie, dass Sie ein Token auch als Cookie übergeben können (anstelle eines benutzerdefinierten Headers). Dies verhält sich in Browsern gut, da in den meisten Toolkits und Anwendungen ein HTTP-Header mit Standardverhalten verwendet wird. Auf der Serviceseite muss sich das Cookie nicht auf eine Sitzung beziehen. Sie können es verwenden, um ein beliebiges Token zu kommunizieren.
Bruce Alderson
11
Die Wayback-Maschine ist eine schöne Sache: Problembeschreibung und Lösung
cjc343
14

OWASP (Open Web Application Security Project) enthält einige Spickzettel, die alle Aspekte der Entwicklung von Webanwendungen abdecken. Dieses Projekt ist eine sehr wertvolle und zuverlässige Informationsquelle. In Bezug auf REST-Services können Sie dies überprüfen: https://www.owasp.org/index.php/REST_Security_Cheat_Sheet

WelsonJR
quelle
7

Ich würde OAuth 2/3 empfehlen. Weitere Informationen finden Sie unter http://oauth.net/2/

Abhijit Gaikwad
quelle
8
Möchten Sie näher erläutern, warum Sie Version 2 empfehlen würden, wenn sie weitgehend unvollständig bleibt? IMHO bleibt Version 1.0a eine solide Lösung für die meisten Apps.
Butifarra
6

Ich habe viel nach erholsamer ws-Sicherheit gesucht und am Ende haben wir auch Token per Cookie vom Client zum Server verwendet, um die Anforderungen zu authentifizieren. Ich habe Spring Security für die Autorisierung von Anforderungen im Dienst verwendet, da ich jede Anforderung basierend auf festgelegten Sicherheitsrichtlinien, die bereits in DB vorhanden waren, authentifizieren und autorisieren musste.

Parisa Kachoui
quelle
6

Die Tatsache, dass die SOAP-Welt ziemlich gut mit Sicherheitsstandards abgedeckt ist, bedeutet nicht, dass sie standardmäßig sicher ist. Erstens sind die Standards sehr komplex. Komplexität ist kein guter Freund von Sicherheits- und Implementierungsschwachstellen wie XML-Signatur-Wrapping-Angriffen .

In Bezug auf die .NET-Umgebung werde ich nicht viel helfen, aber „Erstellen von Webdiensten mit Java“ (ein Baustein mit ~ 10 Autoren) hat mir sehr geholfen , die WS- * -Sicherheitsarchitektur und insbesondere ihre Macken zu verstehen.

Kravietz
quelle
4

REST selbst bietet keine Sicherheitsstandards, aber Dinge wie OAuth und SAML werden schnell zu Standards in diesem Bereich. Authentifizierung und Autorisierung sind jedoch nur ein kleiner Teil dessen, was Sie berücksichtigen müssen. Viele der bekannten Sicherheitslücken in Bezug auf Webanwendungen gelten sehr stark für REST-APIs. Sie müssen die Überprüfung von Eingaben, das Knacken von Sitzungen, unangemessene Fehlermeldungen, interne Sicherheitslücken von Mitarbeitern usw. berücksichtigen. Es ist ein großes Thema.

Robert Morschel
quelle
4

Ich möchte hinzufügen (in Übereinstimmung mit stinkeymatt), die einfachste Lösung wäre, Ihrer Site SSL-Zertifikate hinzuzufügen. Mit anderen Worten, stellen Sie sicher, dass Ihre URL HTTPS: // lautet. Das wird Ihre Transportsicherheit abdecken (Bang for the Buck). Mit RESTful- URLs sollten Sie es einfach halten (im Gegensatz zu WS * security / SAML). Sie können oAuth2 / openID connect oder sogar Basic Auth (in einfachen Fällen) verwenden. Sie benötigen jedoch weiterhin SSL / HTTPS. Überprüfen Sie die Sicherheit von ASP.NET Web API 2 hier: http://www.asp.net/web-api/overview/security (Artikel und Videos)

Manish Jain
quelle
3

Als @Nathan endete, ist dies ein einfacher HTTP-Header, und einige hatten OAuth2- und clientseitige SSL-Zertifikate angegeben. Der Kern davon ist Folgendes: Ihre REST-API sollte nicht mit Sicherheit umgehen müssen, da dies wirklich außerhalb des Bereichs der API liegen sollte.

Stattdessen sollte eine Sicherheitsschicht darüber gelegt werden, unabhängig davon, ob es sich um einen HTTP-Header hinter einem Webproxy handelt (ein gängiger Ansatz wie SiteMinder, Zermatt oder sogar Apache HTTPd) oder so kompliziert wie OAuth 2.

Der Schlüssel ist, dass die Anforderungen ohne Interaktion mit dem Endbenutzer funktionieren sollten. Sie müssen lediglich sicherstellen, dass die Verbindung zur REST-API authentifiziert ist. In Java EE haben wir den Begriff a userPrincipal, der auf einem erhalten werden kann HttpServletRequest. Im Deployment-Deskriptor wird auch verwaltet, dass ein URL-Muster sicher sein kann, sodass der REST-API-Code nicht mehr überprüft werden muss.

In der WCF-Welt würde ich verwenden ServiceSecurityContext.Current, um den aktuellen Sicherheitskontext abzurufen. Sie müssen Ihre Anwendung so konfigurieren, dass eine Authentifizierung erforderlich ist.

Es gibt eine Ausnahme von der Aussage, die ich oben hatte, und das ist die Verwendung eines Nonce, um Wiederholungen zu verhindern (dies können Angriffe sein oder jemand, der nur zweimal dieselben Daten übermittelt). Dieser Teil kann nur in der Anwendungsschicht behandelt werden.

Archimedes Trajano
quelle
3

Für die Sicherheit von Webanwendungen sollten Sie sich OWASP ( https://www.owasp.org/index.php/Main_Page ) ansehen, das Cheatsheets für verschiedene Sicherheitsangriffe bereitstellt. Sie können so viele Maßnahmen wie möglich ergreifen, um Ihre Anwendung zu sichern. In Bezug auf die API-Sicherheit (Autorisierung, Authentifizierung, Identitätsverwaltung) gibt es, wie bereits erwähnt, mehrere Möglichkeiten (Basic, Digest und OAuth). In OAuth1.0 gibt es Lücken, sodass Sie OAuth1.0a verwenden können (OAuth2.0 wird aufgrund von Bedenken hinsichtlich der Spezifikation nicht häufig übernommen).

java_geek
quelle
2

Es ist eine Weile her, aber die Frage ist immer noch relevant, obwohl sich die Antwort möglicherweise etwas geändert hat.

Ein API-Gateway wäre eine flexible und hoch konfigurierbare Lösung. Ich habe KONG ziemlich oft getestet und benutzt und mochte wirklich, was ich sah. KONG bietet eine eigene Admin-REST-API, mit der Sie Benutzer verwalten können.

Express-gateway.io ist neuer und auch ein API-Gateway.

Matt Bannert
quelle