wake-up-neo.com

403 wird von s3 verboten, wenn versucht wird, eine Datei herunterzuladen

Ich habe einen Bucket auf S3, und ein Benutzer hat vollen Zugriff auf diesen Bucket.

Ich kann einen ls-Befehl ausführen und die Dateien im Bucket anzeigen, das Herunterladen schlägt jedoch fehl mit:

A client error (403) occurred when calling the HeadObject operation: Forbidden

Ich habe dies auch mit einem Benutzer versucht, dem über die IAM-Konsole vollständige S3-Berechtigungen erteilt wurden. Gleiches Problem. 

Hier sehen Sie die IAM-Richtlinie, die ich habe:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mybucket",
                "arn:aws:s3:::mybucket/*"
            ]
        }
    ]
}

Ich habe auch versucht, eine Bucket-Richtlinie hinzuzufügen, sogar den Bucket öffentlich zu machen, und immer noch nicht. Außerdem habe ich über die Konsole versucht, individuelle Berechtigungen für die Dateien im Bucket festzulegen. Außerdem wurde die Fehlermeldung angezeigt, dass der Bucket nicht angezeigt werden kann , was seltsam ist, da ich es von der Konsole aus gesehen habe, als die Nachricht erschien, und ls alles im Eimer haben kann.

EDITDie Dateien in meinem Bucket wurden dort aus einem anderen Bucket, der zu einem anderen Konto gehört, unter Verwendung der Anmeldeinformationen meines Kontos dorthin kopiert. Kann oder nicht relevant sein ...

2nd EDIT Ich habe gerade versucht, meine eigenen Dateien von anderen Buckets zu und von diesem Bucket hochzuladen, herunterzuladen und zu kopieren, und es funktioniert gut. Das Problem liegt speziell bei den dort platzierten Dateien aus dem Bucket eines anderen Kontos.

Vielen Dank!

6
MrSilverSnorkel

Ich denke, Sie müssen sicherstellen, dass die Berechtigungen auf Objekte angewendet werden, wenn Sie sie mit dem "Bucket-Owner-Full-Control" -Acl zwischen Buckets verschieben/kopieren.

Hier erfahren Sie, wie dies beim Verschieben oder Kopieren von Dateien sowie nachträglich geschehen kann: https://aws.Amazon.com/premiumsupport/knowledge-center/s3-bucket-owner-access/

Informationen zu den verschiedenen vordefinierten Zuschüssen finden Sie hier: http://docs.aws.Amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl

7
wrj

Das Problem besteht darin, wie Sie die Dateien in den Bucket bekommen. Insbesondere die Anmeldeinformationen und/oder Berechtigungen, die Sie zum Zeitpunkt des Uploads vergeben. Ich hatte ein Problem mit einer ähnlichen Berechtigung, wenn ich mehrere AWS-Konten hatte, obwohl meine Bucket-Richtlinie ziemlich offen war (da Ihre hier ist). Ich hatte beim Hochladen in einen Bucket, der sich in einem anderen Konto befindet (A2), versehentlich Anmeldeinformationen von einem Konto verwendet (nennen Sie es A1). Aus diesem Grund behielt A1 die Berechtigungen für das Objekt und der Bucket-Besitzer hat sie nicht erhalten. Es gibt mindestens drei Möglichkeiten, dies in diesem Szenario zum Zeitpunkt des Uploads zu beheben:

  • Konten wechseln. Führen Sie $export AWS_DEFAULT_PROFILE=A2 aus, oder ändern Sie ~/.aws/credentials und ~/.aws/config für eine dauerhaftere Änderung, um die korrekten Anmeldeinformationen und die Konfiguration unter [default] zu verschieben. Dann erneut hochladen.
  • Geben Sie das andere Profil zum Zeitpunkt des Uploads an: aws s3 cp foo s3://mybucket --profile A2
  • Öffnen Sie die Berechtigungen für den Bucket-Besitzer (erfordert kein Ändern des Profils): aws s3 cp foo s3://mybucket --acl bucket-owner-full-control

Beachten Sie, dass die ersten beiden Möglichkeiten ein separates AWS-Profil beinhalten. Wenn Sie zwei Gruppen von Kontoanmeldeinformationen zur Verfügung haben möchten, gehen Sie wie folgt vor. Sie können ein Profil mit Ihren Schlüsseln, Ihrer Region usw. erstellen, indem Sie aws configure --profile Foo ausführen. Unter hier finden Sie weitere Informationen zu benannten Profilen. 

Es gibt auch etwas aufwendigere Möglichkeiten, dies rückwirkend zu tun (Post-Upload), über das Sie hier nachlesen können.

5
watsonic

Fügen Sie diese Bucket-Richtlinie hinzu, um die entsprechenden Berechtigungen für neu hinzugefügte Dateien korrekt festzulegen:

[...]
{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::123456789012::user/their-user"
    },
    "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
    ],
    "Resource": "arn:aws:s3:::my-bucket/*"
}

Ihre Bucket-Richtlinie ist noch offener, das blockiert Sie also nicht.

Der Uploader muss jedoch die ACL für neu erstellte Dateien festlegen. Python-Beispiel:

import boto3

client = boto3.client('s3')
local_file_path = '/home/me/data.csv'
bucket_name = 'my-bucket'
bucket_file_path = 'exports/data.csv'
client.upload_file(
    local_file_path,
    bucket_name, 
    bucket_file_path, 
    ExtraArgs={'ACL':'bucket-owner-full-control'}
)

quelle: https://medium.com/artificial-industry/how-to-download-files-that-others-put-in-your-aws-s3-bucket-2269e20ed041 (Disclaimer: Von mir geschrieben)

0
Nino van Hooff