wake-up-neo.net

AWS CLI s3-Kopie schlägt mit 403-Fehler fehl und versucht, ein vom Benutzer hochgeladenes Objekt zu verwalten

Versuch, eine Datei aus einem S3-Bucket auf meinen lokalen Rechner zu kopieren:

aws s3 cp s3://my-bucket-name/audio-0b7ea3d0-13ab-4c7c-ac66-1bec2e572c14.wav ./

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden 

Dinge, die ich bestätigt habe:

  • Ich verwende Version aws-cli/1.11.13 Python/3.5.2 Linux/4.4.0-75-generic botocore/1.4.70
  • Der S3-Objektschlüssel ist korrekt. Ich habe es direkt von der S3-Weboberfläche kopiert.
  • Die AWS-CLI ist mit gültigen Anmeldeinformationen konfiguriert. Ich habe ein neues Schlüssel/Geheimpaar generiert. Ich habe den Ordner ~/.aws gelöscht, bevor ich das aws cli neu konfiguriert habe. Die IAM-Webschnittstelle online bestätigt, dass der Benutzer von arn tatsächlich S3 über die CLI verwendet.
  • Dem IAM-Benutzer wird die verwaltete S3-Richtlinie mit vollständigem Zugriff gewährt, per diesem SO post . Ich habe alle Richtlinien dieser Benutzer entfernt und dann nur die von AWS verwaltete Richtlinie namens AdministratorAccess hinzugefügt, die "S3, Voller Zugriff, Alle Ressourcen" enthält. Gibt es eine andere Möglichkeit, den Zugriff über die CLI zu gewähren? Ich habe es nicht geglaubt.

Die Bucket-Richtlinie soll einen breiten offenen Zugriff gewähren:

    {
        "Sid": "AdminAccess",
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket-name",
            "arn:aws:s3:::my-bucket-name/*"
        ]
    }

Wie habe ich dieses Objekt hochgeladen?

Ich habe dieses Objekt mit einer von AWS Signature v4 signierten Uploadrichtlinie von einer Webanwendung im Clientbrowser direkt in AWS hochgeladen.

8
Charney Kaye

Bei der Betrachtung der Objekteigenschaften stellt sich heraus, dass der Besitzer des Objekts "Anonymous" ist, und auch "Anonymous" hat volle Berechtigung für dieses Objekt.

Ich glaube, aus diesem Grund kann ich nicht auf dieses Objekt zugreifen (ich bin authentifiziert). Beispiel: Da der Benutzer "Anonymous" über die vollständigen Berechtigungen verfügt, kann ich über GET über einen Webbrowser zugreifen. Dies funktioniert wie vorgesehen. Der S3-Bucket dient zum Hochladen von Dateien, die dann für den öffentlichen Gebrauch verfügbar sind.

Wenn die Datei mit der Upload-Richtlinie POST ist, lautet der resultierende Besitzer "Anonymous".

In diesem Fall sollte beim Hochladen des Objekts acl=bucket-owner-full-control verwendet werden, damit der Bucket-Besitzer das Objekt steuern kann ..__ Der Besitzer bleibt dabei "Anonymous", gibt jedoch dem Bucket-Eigentümer (mir) die volle Kapazität Erlaubnis und ich sollte dann über AWS CLI auf das Objekt zugreifen können.

Beachten Sie, dass acl=ec2-bundle-read eine Voreinstellung ist, die im aktuellen AWS SDK fest codiert ist. Weitere Informationen finden Sie unter https://github.com/aws/aws-sdk-Java/blob/7844c64cf248aed889811bf2e871ad6b276a89ca/aws-Java-sdk-ec2/src/main/Java/com/amazonaws/services/ec2/utices/S3UploadPol # L77

Es war notwendig, S3UploadPolicy.Java in meine eigene Codebase zu kopieren (es ist eine völlig tragbare kleine Dienstprogrammklasse, wie sich herausstellt) und modifiziert, um acl=bucket-owner-full-control zu verwenden. Und ich habe bestätigt, dass dies die Verwaltung von hochgeladenen Objekten über AWS CLI ermöglicht.

2
Charney Kaye

In meinem Fall habe ich 3 Konten (A1, A2, A3) Mit 3 kanonischen Benutzern (canonical_user_account_A1, canonical_user_account_A2, canonical_user_account_A3) Und 1 IAM-Rolle (R1), Die in A3 Enthalten ist.

Dateien befinden sich in einem Eimer in A2 Und der Dateieigentümer ist canonical_user_account_A1 ( dies ist absichtlich ). Als ich versuchte, die Dateien aufzulisten, bekam ich keinen Fehler [~ # ~], aber [~ # ~] , als ich versuchte, eine herunterzuladen von denen habe ich

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

Ich habe die Berechtigungen List und Get für ein R1 In die Bucket-Richtlinie und in die Rollenberechtigungen eingefügt. In diesem Fall reicht dies nicht aus, wenn das Konto das Bucket ist Nicht der Besitzer, dem Benutzer von einem anderen Konto nicht erlauben können, get -Dateien (herunterzuladen). Also musste ich sicherstellen, dass ich beim Hochladen von Dateien Folgendes verwende:

    access_control_policy = {
    'Grants': [
        {
            'Grantee': {
                'ID': canonical_user_account_A2,
                'Type': 'CanonicalUser'
            },
            'Permission': 'READ'
        },
        {
            'Grantee': {
                'ID': canonical_user_account_A3,
                'Type': 'CanonicalUser'
            },
            'Permission': 'READ'
        },
    ],
    'Owner': {
        'ID': canonical_user_account_A1
    }
}

upload_extra_args = {'ACL': 'bucket-owner-full-control'}

s3_client.upload_file(file_path, bucket_name, s3_file_path, ExtraArgs=upload_extra_args)

s3_client.put_object_acl(AccessControlPolicy=access_control_policy, Bucket=bucket_name, Key=s3_file_path)

Dadurch können sowohl canonical_user_account_A2 Als auch canonical_user_account_A3 Die Datei lesen und herunterladen.

1
shlomiLan

In meinem obigen Fall trat ein Fehler auf, wenn die Maschine, die versuchte, S3 zu kontaktieren, Systemzeit weit von der aktuellen entfernt war. Das Einstellen einer korrekten Zeit hat geholfen.

0
pawel.uramowski

AWS S3 gibt Sie Forbidden (403) zurück, auch wenn die Datei aus Sicherheitsgründen nicht vorhanden ist .. Bitte stellen Sie sicher, dass Sie während des Herunterladens den richtigen S3-Pfad angegeben haben.

Sie können mehr darüber lesen hier

0
tom

Ich hatte ein ähnliches Berechtigungsproblem, als ich versuchte, etwas herunterzuladen, das ich zuvor hochgeladen hatte. Es hat sich herausgestellt, dass dies nichts mit der bucket -Richtlinie zu tun hat und alles mit der Einstellung Ihrer Anmeldeinformationen beim Hochladen und der Erteilung von Zugriffsrechten zum Zeitpunkt des Hochladens zu tun hat. Unter this finden Sie weitere Informationen zur Lösung des Problems.

0
watsonic