Ich implementiere einen direkten Datei-Upload vom Client-Computer auf Amazon S3 über die REST-API, wobei nur JavaScript ohne serverseitigen Code verwendet wird. Alles funktioniert gut, aber eines macht mir Sorgen ...
Wenn ich eine Anfrage an die Amazon S3 REST-API sende, muss ich die Anfrage signieren und eine Signatur in den Authentication
Header einfügen. Um eine Signatur zu erstellen, muss ich meinen geheimen Schlüssel verwenden. Aber alles geschieht auf Client-Seite, sodass der geheime Schlüssel leicht aus der Seitenquelle enthüllt werden kann (selbst wenn ich meine Quellen verschleiere / verschlüssele).
Wie kann ich damit umgehen? Und ist es überhaupt ein Problem? Vielleicht kann ich die Verwendung bestimmter privater Schlüssel nur auf REST-API-Aufrufe von einem bestimmten CORS-Ursprung und nur auf PUT- und POST-Methoden beschränken oder den Schlüssel nur mit S3 und einem bestimmten Bucket verknüpfen? Möglicherweise gibt es andere Authentifizierungsmethoden?
Die "serverlose" Lösung ist ideal, aber ich kann in Betracht ziehen, einige serverseitige Verarbeitungen durchzuführen, ohne das Hochladen einer Datei auf meinen Server und das anschließende Senden an S3.
Antworten:
Ich denke, was Sie wollen, sind browserbasierte Uploads mit POST.
Grundsätzlich benötigen Sie serverseitigen Code, der jedoch nur signierte Richtlinien generiert. Sobald der clientseitige Code über die signierte Richtlinie verfügt, kann er mithilfe von POST direkt in S3 hochgeladen werden, ohne dass die Daten über Ihren Server übertragen werden.
Hier sind die offiziellen Doc-Links:
Diagramm: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html
Beispielcode: http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTExamples.html
Die signierte Richtlinie wird in folgender Form in Ihr HTML eingefügt:
Beachten Sie, dass die FORM-Aktion die Datei direkt an S3 sendet - nicht über Ihren Server.
Jedes Mal, wenn einer Ihrer Benutzer eine Datei hochladen möchte, erstellen Sie das
POLICY
undSIGNATURE
auf Ihrem Server. Sie geben die Seite an den Browser des Benutzers zurück. Der Benutzer kann dann eine Datei direkt in S3 hochladen, ohne Ihren Server zu durchlaufen.Wenn Sie die Richtlinie unterschreiben, läuft die Richtlinie normalerweise nach einigen Minuten ab. Dies zwingt Ihre Benutzer, vor dem Hochladen mit Ihrem Server zu sprechen. Auf diese Weise können Sie Uploads überwachen und begrenzen, wenn Sie dies wünschen.
Die einzigen Daten, die zu oder von Ihrem Server gesendet werden, sind die signierten URLs. Ihre geheimen Schlüssel bleiben auf dem Server geheim.
quelle
${filename}
den Schlüsselnamen hinzufügen , also für das obige Beispieluser/eric/${filename}
anstatt nuruser/eric
. Wennuser/eric
bereits ein Ordner vorhanden ist, schlägt der Upload unbeaufsichtigt fehl (Sie werden sogar zu success_action_redirect umgeleitet), und der hochgeladene Inhalt ist nicht vorhanden. Ich habe gerade Stunden damit verbracht, dieses Denken zu debuggen, dass es sich um ein Berechtigungsproblem handelt.Sie können dies mit AWS S3 Cognito tun. Versuchen Sie diesen Link hier:
http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html#Amazon_S3
Versuchen Sie auch diesen Code
Ändern Sie einfach Region, IdentityPoolId und Ihren Bucket-Namen
quelle
Sie sagen, Sie wollen eine "serverlose" Lösung. Dies bedeutet jedoch, dass Sie keinen "Ihrer" Code in die Schleife einfügen können. (HINWEIS: Sobald Sie Ihren Code einem Client übergeben haben, ist er jetzt "sein" Code.) Das Sperren von CORS hilft nicht weiter: Benutzer können problemlos ein nicht webbasiertes Tool (oder einen webbasierten Proxy) schreiben, das hinzugefügt wird den richtigen CORS-Header, um Ihr System zu missbrauchen.
Das große Problem ist, dass Sie nicht zwischen den verschiedenen Benutzern unterscheiden können. Sie können einem Benutzer nicht erlauben, seine Dateien aufzulisten / darauf zuzugreifen, aber andere daran hindern. Wenn Sie Missbrauch feststellen, können Sie nichts dagegen tun, außer den Schlüssel zu ändern. (Was der Angreifer vermutlich gerade nochmal bekommen kann.)
Am besten erstellen Sie einen "IAM-Benutzer" mit einem Schlüssel für Ihren Javascript-Client. Geben Sie ihm nur Schreibzugriff auf nur einen Bucket. (Aktivieren Sie den ListBucket-Vorgang jedoch im Idealfall nicht, da er für Angreifer attraktiver wird.)
Wenn Sie einen Server hätten (sogar eine einfache Mikroinstanz für 20 US-Dollar pro Monat), könnten Sie die Schlüssel auf Ihrem Server signieren und gleichzeitig den Missbrauch in Echtzeit überwachen / verhindern. Ohne Server können Sie am besten regelmäßig nachträglich auf Missbrauch überwachen. Folgendes würde ich tun:
1) Drehen Sie die Schlüssel für diesen IAM-Benutzer regelmäßig: Generieren Sie jede Nacht einen neuen Schlüssel für diesen IAM-Benutzer und ersetzen Sie den ältesten Schlüssel. Da es 2 Schlüssel gibt, ist jeder Schlüssel 2 Tage gültig.
2) Aktivieren Sie die S3-Protokollierung und laden Sie die Protokolle stündlich herunter. Stellen Sie Warnungen auf "zu viele Uploads" und "zu viele Downloads" ein. Sie sollten sowohl die Gesamtgröße der Datei als auch die Anzahl der hochgeladenen Dateien überprüfen. Außerdem möchten Sie sowohl die globalen Summen als auch die Summen pro IP-Adresse (mit einem niedrigeren Schwellenwert) überwachen.
Diese Überprüfungen können "serverlos" durchgeführt werden, da Sie sie auf Ihrem Desktop ausführen können. (dh S3 erledigt die ganze Arbeit, diese Prozesse dienen nur dazu, Sie auf den Missbrauch Ihres S3-Buckets aufmerksam zu machen, damit Sie am Monatsende keine riesige AWS-Rechnung erhalten.)
quelle
Wenn Sie der akzeptierten Antwort weitere Informationen hinzufügen, können Sie in meinem Blog eine laufende Version des Codes mit AWS Signature Version 4 anzeigen.
Fasst hier zusammen:
Sobald der Benutzer eine hochzuladende Datei auswählt, gehen Sie wie folgt vor: 1. Rufen Sie den Webserver an, um einen Dienst zum Generieren der erforderlichen Parameter zu initiieren
Rufen Sie in diesem Service den AWS IAM-Service an, um eine temporäre Gutschrift zu erhalten
Sobald Sie die Berechtigung haben, erstellen Sie eine Bucket-Richtlinie (Base 64-codierte Zeichenfolge). Signieren Sie dann die Bucket-Richtlinie mit dem temporären geheimen Zugriffsschlüssel, um die endgültige Signatur zu generieren
Senden Sie die erforderlichen Parameter an die Benutzeroberfläche zurück
Sobald dies empfangen wurde, erstellen Sie ein HTML-Formularobjekt, legen Sie die erforderlichen Parameter fest und POSTEN Sie es.
Ausführliche Informationen finden Sie unter https://wordpress1763.wordpress.com/2016/10/03/browser-based-upload-aws-signature-version-4/
quelle
Hier haben Sie falsch verstanden. Der Grund, warum digitale Signaturen verwendet werden, besteht darin, dass Sie etwas als korrekt überprüfen können, ohne Ihren geheimen Schlüssel preiszugeben. In diesem Fall wird die digitale Signatur verwendet, um zu verhindern, dass der Benutzer die Richtlinie ändert, die Sie für den Formularbeitrag festgelegt haben.
Digitale Signaturen wie die hier werden aus Sicherheitsgründen im gesamten Web verwendet. Wenn jemand (NSA?) Sie wirklich brechen könnte, hätte er viel größere Ziele als Ihr S3-Eimer :)
quelle
Ich habe einen einfachen Code angegeben, um Dateien vom Javascript-Browser in AWS S3 hochzuladen und alle Dateien im S3-Bucket aufzulisten.
Schritte:
Informationen zum Erstellen von Create IdentityPoolId finden Sie unter http://docs.aws.amazon.com/cognito/latest/developerguide/identity-pools.html
Gehen Sie zur Konsolenseite von S3 und öffnen Sie die Cors-Konfiguration über die Bucket-Eigenschaften und schreiben Sie den folgenden XML-Code hinein.
Erstellen Sie eine HTML-Datei mit folgendem Code, ändern Sie die Anmeldeinformationen, öffnen Sie die Datei im Browser und genießen Sie.
quelle
Wenn Sie keinen serverseitigen Code haben, hängt Ihre Sicherheit von der Sicherheit des Zugriffs auf Ihren JavaScript-Code auf der Clientseite ab (dh jeder, der den Code hat, kann etwas hochladen).
Daher würde ich empfehlen, einfach einen speziellen S3-Bucket zu erstellen, der öffentlich beschreibbar (aber nicht lesbar) ist, sodass Sie auf der Clientseite keine signierten Komponenten benötigen.
Der Bucket-Name (z. B. eine GUID) ist Ihre einzige Verteidigung gegen böswillige Uploads (ein potenzieller Angreifer konnte Ihren Bucket jedoch nicht zum Übertragen von Daten verwenden, da er nur an ihn geschrieben wird).
quelle
So generieren Sie ein Richtliniendokument mit Node und Serverless
Das verwendete Konfigurationsobjekt wird im SSM- Parameterspeicher gespeichert und sieht folgendermaßen aus
quelle
Wenn Sie bereit sind, einen Dienst eines Drittanbieters zu verwenden, unterstützt auth0.com diese Integration. Der auth0-Dienst tauscht eine SSO-Dienstauthentifizierung eines Drittanbieters gegen ein temporäres AWS-Sitzungstoken aus, wodurch die Berechtigungen eingeschränkt werden.
Siehe: https://github.com/auth0-samples/auth0-s3-sample/
und die auth0-Dokumentation.
quelle