Zugriff verweigert, wenn zwischen s3-Buckets auf verschiedenen AWS-Konten synchronisiert wird

7

Ich versuche, die Synchronisierung zwischen zwei Buckets auf verschiedenen AWS-Konten einzurichten.

Ich habe cpgearbeitet mit:

@ubuntu:~$ s3cmd cp -v s3://src/dir/ s3://dest/folder --recursive

Ich bin der Benutzer, der besitzt /src/dirund ich habe hinzugefügt:

{
"Version": "2012-10-17",
"Id": "Policy1477299702471",
"Statement": [
    {
        "Sid": "Stmt1477299696163",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::awsid:user/name"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::bucket/*"
    }
]}

Zur Bucket-Berechtigungsrichtlinie für den Test-Bucket.

Jetzt bin ich nach aws syncder Arbeit, da die Verwendung s3 cpfür die Verwendung mit Cron nicht empfohlen wird.

Ich habe es versucht

user@ubuntu:~$ aws s3 sync --dryrun s3://src/ s3://dest/ --region eu-central-1

aber ich bekomme Zugang verweigert:

Schwerwiegender Fehler: Beim Aufrufen der ListObjects-Operation ist ein Fehler aufgetreten (AccessDenied): Zugriff verweigert

Wie kann ich den Zugriff verweigern, wenn dies der Benutzer ist, dem der Bucket gehört, und die Synchronisierung ausführen?

OrigamiEye
quelle

Antworten:

13

Die Ursache für Ihren ListObjectsFehler ist, dass Sie die Berechtigung zum Zugriff auf den Inhalt Ihres Buckets ( arn:aws:s3:::bucket/*) zugewiesen haben , dem Bucket selbst jedoch keine Berechtigungen erteilt haben ( arn:aws:s3:::bucket). Der ListObjectsBefehl erfordert Zugriff auf den Bucket.

Um dies zu testen, habe ich Folgendes getan:

  • Verwendete zwei AWS-Konten: Konto A, Konto B.
  • Erstellt bucket-ain Konto A.
  • Erstellt bucket-bin Konto B.
  • Erstellt einen IAM-Benutzer user-ain Konto A mit Zugriffsberechtigungenbucket-a
  • Eine Bucket-Richtlinie wurde hinzugefügt zu bucket-b:

    {
      "Id": "CopyBuckets",
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "Stmt1",
          "Action": "s3:*",
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::bucket-b",
            "arn:aws:s3:::bucket-b/*"
          ],
          "Principal": {
            "AWS": [
              "arn:aws:iam::<account-a-id>:user/user-a"
            ]
          }
        }
      ]
    }
    

Ich habe dann die Synchronisierung mithilfe user-avon Konto A ausgelöst :

aws s3 sync s3://bucket-a s3://bucket-b --profile user-a

Es hat erfolgreich funktioniert.

John Rotenstein
quelle
Hallo, sind die Regionen, in denen sich der Eimer befindet, nicht relevant?
OrigamiEye
Amazon S3-Bucket-Namen sind global eindeutig, sodass ARNs (Amazon Resource Names) für S3-Buckets weder das Konto noch die Region benötigen (da sie aus dem Bucket-Namen abgeleitet werden können). Wenn jedoch der Aufruf - aws s3 syncBefehl ist die Region wichtig , weil Sie die Anforderung an den Eimer senden soll , das ist dabei die Kopie (die Quelle Eimer).
John Rotenstein
Achten Sie auf fehlende Berechtigungen für synchronisierte Elemente. Wenn Sie eine Synchronisierung durchführen, müssen Sie auch die Option --grants verwenden, um anzugeben, dass dem kanonischen Namen des Kontos B die Berechtigung erteilt wird. Andernfalls sind die synchronisierten Objekte nur dem ursprünglichen Eigentümer von Konto A aus zugänglich.
CarlR
Wenn Sie möchten, dass der richtige Eigentümer für die Objekte in den Zielbereich kopiert wird, müssen Sie den Synchronisierungsbefehl vom Zielkonto und nicht vom Quellkonto ausführen. Die Logik hier würde also umgedreht werden.
Josh Bernfeld
1
Oder verwenden Sie--acl bucket-owner-full-control
John Rotenstein