2014-02-27 15 views
14

Ich versuche, mir selbst die Erlaubnis zu erteilen, vorhandene Dateien in einem S3-Bucket herunterzuladen. Ich habe die Bucket-Politik geändert, wie folgt:AWS S3-Bucket-Berechtigungen - Zugriff verweigert

 { 
     "Sid": "someSID", 
     "Action": "s3:*", 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::bucketname/AWSLogs/123123123123/*", 
     "Principal": { 
      "AWS": [ 
       "arn:aws:iam::123123123123:user/myuid" 
      ] 
     } 
    } 

Mein Verständnis ist, dass zusätzlich zu der Politik geben sollte mir die vollen Rechte an „bucketname“ für mein Konto „myuid“, einschließlich aller Dateien, die bereits in das sind Eimer. Ich erhalte jedoch immer noch Zugriffsverweigerungsfehler, wenn ich versuche, eine dieser Dateien über den Link herunterzuladen, der in der Konsole angezeigt wird.

Irgendwelche Gedanken?

+0

Sie sagen, dass dies auf den Eimer voll Rechte gibt, sondern der Ressourcen enthält ein Präfix. Sind alle Dateien, die Sie herunterladen, in diesem Präfix? Und wie lädst du sie herunter? Von der Konsole, mit einer App, mit einem SDK? –

Antwort

6

ändern Ressource arn:aws:s3:::bucketname/AWSLogs/123123123123/*-arn:aws:s3:::bucketname/* volle Rechte haben

11

David bucketname, Sie haben Recht, aber ich fand, dass, zusätzlich zu dem, was bennie unter sagte, man muss auch Aussicht gewähren (oder was auch immer Zugriff Sie wollen) zu "Authentifizierte Benutzer". enter image description here

aber eine bessere Lösung könnte darin bestehen, die Politik der Benutzer zu bearbeiten Zugriff auf den heißen Stein nur zu gewähren:

{ 
    "Statement": [ 
    { 
     "Sid": "Stmt1350703615347", 
     "Action": [ 
     "s3:*" 
     ], 
     "Effect": "Allow", 
     "Resource": [ 
     "arn:aws:s3:::mybucket/*" 
     ] 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:ListBucket" 
     ], 
     "Resource": ["arn:aws:s3:::mybucket"], 
     "Condition": {} 
    } 
    ] 
} 

Die erste Block gewährt alle S3 Berechtigungen für alle Elemente innerhalb des Eimers. Der zweite Block gewährt eine Listenberechtigung für den Bucket.

+0

Gewähren, dass der Zugriff auf "authentifizierte Benutzer" buchstäblich jeden authentifizierten aws-Benutzer bedeutet, auch solche, die nicht mit Ihrem eigenen Konto verknüpft sind ... also hebt es den Punkt auf, der einem Benutzer den Zugriff auf einen Bucket gewährt. – Salami

+0

Ich weiß, was es tut, und ich stimme zu, dass es seltsam erscheint, aber zu der Zeit war es * erforderlich *, es zum Laufen zu bringen. –

+1

Eine andere Möglichkeit besteht darin, eine Richtlinie an den spezifischen IAM-Benutzer anzuhängen - wählen Sie in der IAM-Konsole einen Benutzer aus, wählen Sie die Registerkarte ** Berechtigungen **, klicken Sie auf ** Richtlinie anhängen ** und wählen Sie dann eine Richtlinie wie AmazonS3FullAccess aus '. Aus irgendeinem Grund reicht es nicht zu sagen, dass ein Bucket einem Benutzer Zugriff gewährt - Sie müssen auch sagen, dass der Benutzer über Berechtigungen zum Zugriff auf den S3-Dienst verfügt. – sameers

1

Zur Verdeutlichung: Es ist wirklich nicht gut dokumentiert, aber Sie benötigen zwei Zugriffsanweisungen.

Zusätzlich zu Ihrer Anweisung, die Aktionen zu Ressourcen "arn: aws: s3 ::: Bucketname/AWSLogs/123123123123/*" erlaubt, benötigen Sie auch eine zweite Anweisung, die ListBucket zu "arn: aws: s3 :: : Bucketname ", weil intern der Aws-Client versucht, den Bucket aufzulisten, um zu bestimmen, dass er existiert, bevor er seine Aktion ausführt.

Mit der zweiten Anweisung sollte wie folgt aussehen:

"Statement": [ 
    { 
     "Sid": "someSID", 
     "Action": "ActionThatYouMeantToAllow", 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::bucketname/AWSLogs/123123123123/*", 
     "Principal": { 
      "AWS": [ 
       "arn:aws:iam::123123123123:user/myuid" 
      ] 
    }, 
    { 
     "Sid": "someOtherSID", 
     "Action": "ListBucket", 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::bucketname", 
     "Principal": { 
      "AWS": [ 
       "arn:aws:iam::123123123123:user/myuid" 
      ] 
    } 
] 

Hinweis: Wenn Sie IAM verwenden, die „Haupt“ Teil überspringen.

2

Verwenden Sie die unten angegebene Methode zum Hochladen einer Datei für ein öffentlich lesbares Formular unter Verwendung von TransferUtility in Android.

transferUtility.upload(String bucketName, String key, File file, CannedAccessControlList cannedAcl) 

Beispiel

transferUtility.upload("MY_BUCKET_NAME", "FileName", your_file, CannedAccessControlList.PublicRead); 
+0

Danke, das ist was ich in meinem Fall brauche. –