Pre-signed URLs und x-amz-acl

9

Ich möchte eine so genannte "vor-signierte" URL zum Hochladen eines bestimmten Objekts (PUT) in Amazon S3 Bucket erstellen.

So weit, so gut. Ich benutze die Python-Bibliothek boto , um eine URL, die alle notwendigen Dinge enthält (Ablauf, Unterschrift usw.). Die URL sieht folgendermaßen aus:

  

https://<bucketname>.s3.amazonaws.com/<key>?Signature=<sig>&Expires=<expires>&AWSAccessKeyId=<my key id>&x-amz-acl=public-read

Beachten Sie den letzten Parameter.

Dies beschränkt zumindest, wie ich es verstehe, jeden, der diese URL verwendet, um ein Objekt auf einen bestimmten Schlüssel in einem bestimmten Bucket hochzuladen, und begrenzt auch die vordefinierte ACL für das Objekt auf "public-read".

Meine letzte Aussage ist jedoch ziemlich falsch.

Wenn Sie diese URL verwenden, können Sie Folgendes mit der Kopfzeile x-amz-acl durchführen (im Gegensatz zum Abfragezeichenfolgenparameter ) mit dem gleichen Namen, den Sie setzen müssen , damit die Signaturprüfung erfolgreich ist):

  1. Setzen Sie es auf "public-read". Die Berechtigungen des Objekts bestehen aus zwei Einträgen: "Lesen" für "Jeder" und "Vollzugriff" für den Bucket-Besitzer. Das ist durchaus zu erwarten.
  2. Lassen Sie den x-amz-acl-Header weg. Die Berechtigungen für das Objekt entsprechen denen für den Bucket-Standard (Bucket-Besitzer hat die volle Kontrolle). Warum?
  3. Setzen Sie es auf "public-read-write". Ergebnis ist genau wie in (1).
  4. Setzen Sie es auf "authenticated-read". "Authentifizierte Benutzer" erhalten Leseberechtigung, der Bucket-Besitzer hat die volle Kontrolle.
  5. Setzen Sie es auf "bucket-owner-read". Ergebnis ist genau wie in (2). Bucket-Besitzer hat die volle Kontrolle, keine anderen Berechtigungen sind definiert.
  6. Setzen Sie es auf "bucket-owner-full-control". Es ist nicht überraschend, dass der Bucket-Besitzer die volle Kontrolle hat.
  7. Setzen Sie es auf einen nicht existierenden, vordefinierten ACL-Namen und erhalten Sie einen Fehler.

So scheint es, dass

  1. Der Header x-amz-acl nimmt nicht an der Signaturprüfung teil, da Sie ihn beliebig ändern können und die Anforderung erfolgreich ist. Der Abfrage-String-Parameter wird jedoch bei der Signaturprüfung definitiv berücksichtigt.
  2. x-amz-acl Query-String-Parameter hat keinen Einfluss auf die Berechtigungen des Objekts direkt , da es selbst nichts tut.
  3. Wenn Sie einen x-amz-acl-Header senden, sind die resultierenden Berechtigungen niemals
    • restriktiver für den Bucket-Besitzer als standardmäßig.
    • weniger Einschränkung für den Nicht-Bucket-Besitzer.
  4. Sie können jedoch restriktiver für Nicht-Bucket-Besitzer sein. Das heißt, wenn Sie in der Abfragezeichenfolge x-amz-acl=public-read angeben, können Sie den x-amz-acl -Kopf auf authenticated-read setzen und anstelle eines öffentlich lesbaren Objekts ein Objekt abrufen, das nur von authentifizierten Benutzern gelesen werden kann.

Was ist die echte Beziehung zwischen dem x-amz-acl QS Parameter und dem Header, der den gleichen Namen hat? Gibt es eine Möglichkeit, Berechtigungen für das Objekt zu beschränken, das über eine PUT -Anfrage auf eine so genannte "vor-signierte" URL hochgeladen werden soll?

    
shylent 15.12.2012, 20:12
quelle

2 Antworten

4

Wie ich es verstehe (und ich könnte mich hier irren), hat der Header x-amz-acl Vorrang vor dem Querystring-Argument - und sie erfüllen den gleichen Zweck. Der Grund, dass nur der Querystring-Parameter bei der Signaturprüfung berücksichtigt wird, liegt einfach an der Tatsache, dass Header nicht Teil der Signaturprüfung für die Richtlinie sind.

Diese Seite könnte Ihnen helfen; Es hat mir beim Erstellen von Formularen, die direkt in S3 hochgeladen werden können, sehr geholfen.

    
jdotjdot 19.12.2012, 13:41
quelle
-1

Anscheinend verwenden Sie den falschen Namen für den Parameter acl. Versuchen Sie gemäß der Anleitung zum Signieren von Anfragen, acl:

zu verwenden

REST-Anforderungen signieren und authentifizieren

  

Wenn die Anfrage eine Unterressource adressiert, wie? Versionsverwaltung,? location,? acl,? torrent,? lifecycle oder? versionid hängt die Unterressource an, ihren Wert, wenn es einen hat, und das Fragezeichen. Beachten Sie, dass die Unterressourcen bei mehreren Unterressourcen lexikographisch nach Unterressourcenamen sortiert und durch "& amp;" getrennt sein müssen. z.B. ? acl & amp; versionId = Wert.

     

Die Liste der Unterressourcen, die bei der Erstellung des CanonicalizedResource-Elements enthalten sein müssen: acl, lifecycle, location, logging, notification, partNumber, policy, requestPayment, torrent, uploadId, uploads, versionId, Versionierung, Versionen und Website.

    
bwight 27.12.2012 23:12
quelle