Wie gewähre ich kontoübergreifenden Zugriff auf Objekte in Amazon-S3-Buckets?

Letzte Aktualisierung: 24.01.2022

Ich möchte einem anderen AWS-Konto Zugriff auf ein Objekt gewähren, das in einem Amazon-Simple-Storage-Service-Bucket (Amazon S3) gespeichert ist. Wie kann ich kontoübergreifenden Zugriff auf Amazon-S3-Buckets bereitstellen?

Kurzbeschreibung

In Amazon S3 können Sie Benutzern in einem anderen AWS-Konto (Konto B) granularen kontenübergreifenden Zugriff auf Objekte gewähren, die Ihrem Konto (Konto A) gehören.

Je nach Art des Zugriffs, den Sie bereitstellen möchten, Verwenden Sie eine der folgenden Lösungen, um detaillierten granularen kontoübergreifenden Zugriff auf Objekte zu gewähren:

  • AWS-Identity-and-Access-Management(IAM)-Richtlinien und ressourcenbasierte Bucket-Richtlinien für den programmgesteuerten Zugriff auf S3-Bucket-Objekte
  • IAM-Richtlinien und ressourcenbasierte Zugriffskontrolllisten (ACLs) für den programmgesteuerten Zugriff auf S3-Bucket-Objekte
    Hinweis: Wenn die erzwungene Einstellung des Bucket-Besitzers aktiviert ist, sind alle Bucket- und Objekt-ACLs deaktiviert. Daher können Sie keine ACLs verwenden, um kontenübergreifenden Zugriff zu gewähren. Standardmäßig ist für alle neu erstellten Buckets die erzwungene Einstellung des Bucket-Besitzers aktiviert. Es ist auch eine bewährte Methode, IAM-Richtlinien und Bucket-Richtlinien (anstelle von ACLs) zu verwenden, um den kontenübergreifenden Zugriff auf Buckets und Objekte zu verwalten. Weitere Informationen finden Sie unter Steuern des Besitzes von Objekten und Deaktivieren von ACLs für Ihren Bucket.
  • Kontoübergreifende IAM-Rollen für den programmatischen und Konsolenzugriff auf S3-Bucket-Objekte

Wenn der Anforderer ein IAM-Prinzipal ist, muss das AWS-Konto, dem der Prinzipal gehört, die S3-Berechtigungen über eine IAM-Richtlinie erteilen. Abhängig von Ihrem spezifischen Anwendungsfall muss der Bucket-Besitzer auch Berechtigungen über eine Bucket-Richtlinie oder ACL erteilen.

Auflösung

IAM-Richtlinien und ressourcenbasierte Bucket-Richtlinien

Hinweis: Wenn Sie beim Ausführen von AWS-Command-Line-Interface (AWS CLI)-Befehlen Fehlermeldungen erhalten, stellen Sie sicher, dass Sie die neueste AWS-CLI-Version verwenden.

Verwenden Sie ressourcenbasierte Bucket-Richtlinien, um die kontoübergreifende Zugriffskontrolle zu verwalten und die Berechtigungen des S3-Objekts zu prüfen. Wenn Sie eine Bucket-Richtlinie auf Bucket-Ebene anwenden, können Sie Folgendes definieren:

  • Wer kann auf die Objekte innerhalb des Buckets zugreifen (mit dem Principal-Element)
  • Auf welche Objekte sie zugreifen können (mit dem Ressourcenelement)
  • Wie sie auf die Objekte im Bucket zugreifen können (mithilfe des Action-Elements)

Durch Anwenden einer Bucket-Richtlinie auf Bucket-Ebene können Sie einen detaillierten Zugriff auf verschiedene Objekte innerhalb des Buckets definieren. Sie können auch die Bucket-Richtlinie überprüfen, um zu sehen, wer auf Objekte in einem S3-Bucket zugreifen kann.

So verwenden Sie Bucket-Richtlinien zum Verwalten des S3-Bucket-Zugriffs:

Hinweis: Ersetzen Sie die Variablen Konto durch Ihr Konto.

1.    Erstellen Sie einen S3-Bucket in Konto A.

2.    Erstellen Sie eine IAM-Rolle oder einen IAM-Benutzer in Konto B.

3.    Erteilen Sie der IAM-Rolle in Konto B die Berechtigung zum Herunterladen (GET-Objekt) und Hochladen (PUT-Objekt) von Objekten in und aus einem bestimmten Bucket. Verwenden Sie die folgende IAM-Richtlinie, um der IAM-Rolle in Konto B auch Berechtigungen zum Aufrufen von PutObjectAcl zu erteilen und dem Bucket-Besitzer Objektberechtigungen zu erteilen:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountABucketName/*"

        }
    ]
}

Hinweis: Achten Sie darauf, die Richtlinie so zu aktualisieren, dass sie Ihre Benutzervariablen (wie Konto-ID, Bucket-Name und ARN) enthält. Sie können den Zugriff auf einen bestimmten Bucket-Ordner im Konto A beschränken. Um den Zugriff auf einen bestimmten Bucket-Ordner zu beschränken, definieren Sie den Ordnernamen im Ressourcenelement, z. B. „arn:aws:s3:::AccountABucketName/FolderName/*“. Weitere Informationen finden Sie unter Wie kann ich IAM-Richtlinien verwenden, um benutzerspezifischen Zugriff auf bestimmte Ordner zu gewähren?

Sie können auch mit dem AWS-CLI-Befehlsbeispiel create-policy eine identitätsbasierte IAM-Richtlinie erstellen.

4.    Konfigurieren Sie die Bucket-Richtlinie für Konto A, um der IAM-Rolle oder dem Benutzer, die Sie in Konto B erstellt haben, Berechtigungen zu erteilen. Verwenden Sie diese Bucket-Richtlinie, um einem Benutzer die Berechtigungen für GetObject und PutObject für Objekte in einem Bucket zu erteilen, der Konto A gehört:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::AccountABucketName/*"
            ]
        }
    ]
}

Sie können auch eine Amazon-S3-Bucket-Richtlinie mit dem AWS-CLI-Befehlsbeispiel put-bucket-policy erstellen.

Hinweis: Sie können einen bestimmten S3-Bucket-Ordner im Ressourcenelement definieren, um einen eingeschränkteren Zugriff bereitzustellen, z. B. „Ressource“: „arn:aws:s3:::AccountABucketName/FolderName/*“. Durch die Verwendung der s3:PutObject-Berechtigung mit einer Bedingung erhält der Bucket-Eigentümer die vollständige Kontrolle über die von anderen Konten hochgeladenen Objekte. Das Erzwingen der ACL mit bestimmten Headern wird dann im PutObject-API-Aufruf übergeben. Weitere Informationen finden Sie unter Erteilen der s3:PutObject-Berechtigung mit einer Bedingung, die erfordert, dass der Bucket-Eigentümer die volle Kontrolle erhält.

IAM-Richtlinien und ressourcenbasierte ACLs

Wenn ACLs Ihre Anforderungen besser erfüllen als IAM- und S3-Bucket-Richtlinien, verwenden Sie Objekt-ACLs, um Berechtigungen nur für bestimmte Szenarien und nur dann zu verwalten. Weitere Informationen finden Sie unter Wann sollte man die ACL-basierten Zugriffsrichtlinie (Bucket- und Objekt-ACLs) nutzen?. Amazon-S3-ACLs ermöglichen es Benutzern, nur die folgenden Berechtigungssätze zu definieren: READ, WRITE, READ_ACP, WRITE_ACP und FULL_CONTROL. Sie können nur ein AWS-Konto oder eine der vordefinierten Amazon S3-Gruppen als Empfänger für die Amazon-S3-ACL verwenden. Wenn Sie eine E-Mail-Adresse oder die kanonische Benutzer-ID für ein AWS-Konto angeben, gilt die ACL für alle Entitäten im AWS-Konto des Empfängers. Sie können eine ACL beispielsweise nicht verwenden, um den Zugriff auf einzelne IAM-Benutzer oder -Rollen einzuschränken. Sie können ACLs auch nicht auf verschiedene Objekte anwenden, die dieselben Präfixe verwenden.

Hinweis: Der Bucket-Eigentümer hat möglicherweise nicht die vollständige Kontrolle über die vom ACL-Berechtigten hochgeladenen Objekte. Dies liegt daran, dass die ACL die von der ACL autorisierte Bedingung für den S3-Vorgang nicht unterstützt.

Um Bucket- und Objekt-ACLs zum Verwalten des S3-Bucket-Zugriffs zu verwenden, führen Sie die folgenden Schritte aus:

1.    Erstellen Sie eine IAM-Rolle oder einen IAM-Benutzer in Konto B. Erteilen Sie dann dieser Rolle oder diesem Benutzer Berechtigungen zum Ausführen der erforderlichen Amazon-S3-Vorgänge. Benutzer, die PutObject und GetObject aufrufen, benötigen die im Abschnitt Ressourcenbasierte Richtlinien und IAM-Richtlinien aufgeführten Berechtigungen.

2.    Konfigurieren Sie die Bucket-ACL so, dass sie mindestens die WRITE-Berechtigung für Konto B enthält. Dadurch wird sichergestellt, dass IAM-Rollen oder Benutzer von Konto B Objekte in einen Bucket hochladen können (PutObject API aufrufen), der Konto A gehört:

...
<AccessControlPolicy>
  <Owner>
    <ID> AccountACanonicalUserID </ID>
    <DisplayName> AccountADisplayName </DisplayName>
  </Owner>
  <AccessControlList>
...
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID> AccountBCanonicalUserID </ID>
        <DisplayName> AccountBDisplayName </DisplayName>
      </Grantee>
      <Permission> WRITE </Permission>
    </Grant>
    ...
  </AccessControlList>
</AccessControlPolicy>

Hinweis: Informationen zum Ermitteln Ihrer CanonicalUserID finden Sie unter Suchen einer kanonischen Benutzer-ID eines AWS-Kontos.

3.    Konfigurieren Sie Objekt-ACLs so, dass sie mindestens die READ-Berechtigung für Konto B enthalten. Dadurch wird sichergestellt, dass IAM-Rollen oder Benutzer in Konto B ein Objekt aus einem Bucket herunterladen können (Aufruf der GetObject-API), der Konto A gehört:

...
<AccessControlPolicy>
  <Owner>
    <ID> AccountACanonicalUserID </ID>
    <DisplayName> AccountADisplayName </DisplayName>
  </Owner>
  <AccessControlList>
...
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID> AccountBCanonicalUserID </ID>
        <DisplayName> AccountBDisplayName </DisplayName>
      </Grantee>
      <Permission> READ </Permission>
    </Grant>
    ...
  </AccessControlList>
</AccessControlPolicy>

ACL-Berechtigungen variieren je nach S3-Ressource, Bucket oder Objekt, auf das eine ACL angewendet wird. Weitere Informationen finden Sie unter Übersicht über die Zugriffskontrollliste (ACL). Sie können Bucket- und Objekt-ACLs konfigurieren, wenn Sie Ihren Bucket erstellen oder ein Objekt in einen vorhandenen Bucket hochladen. Weitere Informationen finden Sie unter Verwalten von ACLs.

Kontoübergreifende IAM-Rollen

Nicht alle AWS-Services unterstützen ressourcenbasierte Richtlinien. Deshalb können Sie kontoübergreifende IAM-Rollen verwenden, um die Berechtigungsverwaltung zu zentralisieren, wenn Sie kontoübergreifenden Zugriff auf mehrere Services bereitstellen. Die Verwendung von kontenübergreifenden IAM-Rollen vereinfacht die Bereitstellung des kontenübergreifenden Zugriffs auf S3-Objekte, die in mehreren S3-Buckets gespeichert. Daher müssen Sie nicht mehrere Richtlinien für S3-Buckets verwalten. Diese Methode ermöglicht den kontoübergreifenden Zugriff auf Objekte, die einem anderen AWS-Konto oder AWS-Services gehören oder von diesen hochgeladen wurden. Wenn Sie keine kontoübergreifenden IAM-Rollen verwenden, muss dann die Objekt-ACL geändert werden. Weitere Informationen finden Sie unter So autorisiert Amazon S3 eine Anforderung für eine Objektoperation.

So verwenden Sie Bucket-Richtlinien zum Verwalten des S3-Bucket-Zugriffs:

1.    Erstellen Sie eine IAM-Rolle in Konto A. Erteilen Sie dann der Rolle Berechtigungen zum Ausführen der erforderlichen S3-Vorgänge. Erteilen Sie in der Vertrauensrichtlinie der Rolle einer Rolle oder einem Benutzer von Konto B Berechtigungen, um die Rolle in Konto A zu übernehmen:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Sie können auch eine Rolle mit der Vertrauensrichtlinie erstellen, indem Sie das AWS-CLI-Befehlsbeispiel create-role verwenden.

Die folgende Zugriffsrichtlinie ermöglicht einem Benutzer, der diese Rolle übernommen hat, das Herunterladen und Hochladen von Objekten, programmgesteuert und mithilfe der Amazon S3-Konsole. Weitere Informationen finden Sie unter Wie kann ich IAM-Richtlinien verwenden, um benutzerspezifischen Zugriff auf bestimmte Ordner zu gewähren?

Hinweis: Wenn nur programmgesteuerter Zugriff erforderlich ist, können die ersten zwei Aussagen in der folgenden Richtlinie entfernt werden:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::AccountABucketName"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::AccountABucketName/*"
        }
    ]
}

Sie können auch mit dem AWS-CLI-Befehlsbeispiel create-policy eine identitätsbasierte IAM-Richtlinie erstellen.

2.    Gewähren Sie einer IAM-Rolle oder einem Benutzer in Konto B Berechtigungen, um die IAM-Rolle zu übernehmen, die Sie in Konto A erstellt haben.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::AccountA:role/AccountARole"
  }
}

Sie können auch mit dem AWS-CLI-Befehlsbeispiel create-policy eine identitätsbasierte IAM-Richtlinie erstellen.

3.    Übernehmen Sie von einer Rolle in Konto B die Rolle in Konto A, damit IAM-Entitäten in Konto B die erforderlichen S3-Vorgänge ausführen können. Weitere Informationen finden Sie unter Wechseln zu einer Rolle (Konsole).

Hinweis: Durch die Übernahme einer IAM-Rolle in Konto A wird der Amazon-S3-Vorgang durch die Zugangsrichtlinien bestimmt. Die IAM-Rolle gilt als API-Aufruf einer lokalen IAM-Entität in Konto A. Eine Bucket-Richtlinie oder eine ACL für den kontoübergreifenden Zugriff ist nicht erforderlich. Weitere Informationen finden Sie unter Amazon S3-Aktionen.