Wie kann der Benutzer Dateien in den S3-Bucket hochladen, aber nicht überschreiben oder löschen?

19

Ich habe die folgenden IAM-Richtlinien für einen Benutzer

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1395161912000",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Sid": "list",
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}

Das Ziel ist es, den Benutzer Dateien in den Bucket hochladen zu lassen, aber nicht zu überschreiben oder zu löschen. Es ist für die Sicherung. Ich habe mit ListBucketund angefangen PutObject, aber hinzugefügt, *da es nicht funktioniert hat. *Lässt den Benutzer nicht einmal Dateien hochladen, sondern nur abrufen Access Denied.

Wenn ich den Simulator ausprobiere, kehrt er Denied - Implicitly denied (no matching statements found).für zurück ListBucket, was seltsam erscheint, da ich das implizit erlaubt habe.

Ich habe sowohl Cyberduck als auch 3Hub als S3-Clients ausprobiert.

Irgendeine Idee, was los ist?

Znarkus
quelle

Antworten:

25

Wenn Sie Amazon IAM- Richtlinien für Amazon S3 erstellen, müssen Sie den Unterschied zwischen Vorgängen für den Dienst (z. B. ListAllMyBuckets ), Vorgängen für Buckets (z. B. ListBucket ) und Vorgängen für Objekte (z . B. GetObject ) berücksichtigen .

Insbesondere muss die ResourceSpezifikation Ihrer Richtlinie die entsprechenden Zieleinheiten gemäß den folgenden Mustern adressieren (siehe z. B. die verschiedenen Beispielrichtlinien für Amazon S3 ):

  • Serviceeinsätze - arn:aws:s3:::*
  • Operationen an Eimern - arn:aws:s3:::<bucket>
  • Operationen an Objekten - arn:aws:s3:::<bucket>/<object>

Lösung

Das Problem tritt auf Access Denied, weil Sie eine Ressource auf Bucket-Ebene für angegeben haben PutObject, für die eine Ressourcenspezifikation auf Objektebene erforderlich ist. arn:aws:s3:::<bucket>/*Dementsprechend sollte die folgende Richtlinie Ihren Beispielanwendungsfall abdecken:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname/*"
      ]
    }
  ]
}
Steffen Opel
quelle
1
Erstaunlich, das hat einwandfrei funktioniert. Vielen Dank! Also sidist das nicht nötig?
Znarkus
1
Laut Sid handelt es sich um eine optionale ID, die Sie für die Richtlinienanweisung angeben . Diese muss innerhalb einer Richtlinie eindeutig sein . Da es ohne (siehe unten) gut zu funktionieren scheint, neige ich dazu, es hier aus Gründen der Kürze und bei der Versionierung von Richtlinien zu entfernen, kümmere mich jedoch nicht darum, Richtlinien beispielsweise automatisch zu generieren - wie im folgenden Hinweis beschrieben : Einige AWS-Services (z. B. Amazon SQS oder Amazon SNS) erfordern möglicherweise dieses Element [...] .
Steffen Opel
3
OP sagt, sie wollen "den Benutzer Dateien in den Bucket hochladen lassen, aber nicht überschreiben oder löschen", aber diese Richtlinie gewährt PutObject, was das Überschreiben von Objekten erlaubt, nein? Ich glaube, es gibt keine Möglichkeit, das herauszufinden.
Xiong Chiamiov
2
@XiongChiamiov - Die S3-Aktion "PutObject" impliziert tatsächlich das Überschreiben. S3 funktioniert einfach standardmäßig. Wenn Sie Schutz vor versehentlichem Löschen benötigen, sollten Sie die Informationen unter Verwenden der Versionierung zum Speichern, Abrufen und Wiederherstellen aller Versionen aller in Ihrem Amazon S3-Bucket gespeicherten Objekte lesen. - Auf diese Weise können Sie sowohl unbeabsichtigte Benutzeraktionen als auch Anwendungsfehler problemlos beheben .
Steffen Opel
4
Ja, mit der Versionierung können Sie überschriebene Objekte wiederherstellen (Sie müssen jedoch feststellen, dass dies der Fall war, und dann können Sie dies tun). Wie auch immer, -1, da dies keine genaue Antwort auf die Frage liefert.
Xiong Chiamiov