Comment fournir un accès entre comptes à des objets dans des compartiments Amazon S3 ?

Date de la dernière mise à jour : 03/09/2020

Je souhaite accorder à un autre compte AWS l'accès à un objet stocké dans un compartiment Amazon Simple Storage Service (Amazon S3). Comment puis-je accorder un accès entre comptes aux compartiments Amazon S3 ?

Brève description

Utilisez l'une des méthodes suivantes pour accorder l'accès entre comptes aux objets stockés dans des compartiments S3 :

  • Stratégies basées sur les ressources et stratégies AWS Identity and Access Management (IAM) pour un accès par programmation uniquement aux objets du compartiment S3
  • Liste de contrôle d'accès (ACL) et stratégies IAM basées sur les ressources pour un accès par programmation uniquement aux objets du compartiment S3
  • Rôles IAM entre comptes pour l'accès par programmation et par console aux objets du compartiment S3

Utilisez, selon le type d'accès que vous souhaitez fournir, l'une des solutions suivantes pour accorder un accès granulaire entre comptes aux objets stockés dans des compartiments S3. Dans les exemples suivants, vous accordez l'accès aux utilisateurs d'un autre compte AWS (compte B) afin que les utilisateurs puissent gérer les objets qui se trouvent dans un compartiment S3 appartenant à votre compte (compte A).

Remarque : veillez à mettre à jour la stratégie pour inclure votre ID de compte, le nom de compartiment, l'ARN, etc.

Résolution

Stratégies basées sur les ressources et stratégies IAM

Utilisez des stratégies de compartiment pour gérer le contrôle entre comptes et auditer les autorisations de l'objet S3. Si vous appliquez une stratégie de compartiment au niveau du compartiment, vous pouvez définir qui peut bénéficier de l'accès au compartiment (élément Principal), comment il peut y accéder (élément Action) et à quels objets il peut accéder (élément Ressource). L'application d'une stratégie de compartiment au niveau du compartiment vous permet de définir un accès granulaire à différents objets à l'intérieur du compartiment. Vous pouvez également consulter la stratégie de compartiment pour voir qui peut accéder aux objets d'un compartiment S3. Procédez comme suit pour utiliser des stratégies de compartiment afin de gérer l'accès au compartiment S3 :

1.    Créez un compartiment S3 dans le compte A.

2.    Créez un rôle IAM ou un utilisateur dans le compte B.

3.    Accordez au rôle IAM ou à l'utilisateur du compte B l'autorisation de télécharger (GET Object) et de charger (PUT Object) des objets vers et depuis un compartiment S3 spécifique avec cette stratégie IAM. Cette stratégie autorise également le rôle IAM ou l'utilisateur du compte B à appeler PUT Object acl pour accorder des autorisations d'objet au propriétaire du compartiment :

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

        }
    ]
}

Remarque : vous pouvez limiter l'accès à un dossier de compartiment spécifique dans le Compte A en définissant le nom du dossier dans l'élément de ressource. Par exemple : arn:aws:s3:::AccountABucketName/FolderName/* Pour en savoir plus, consultez Comment utiliser des stratégies IAM pour autoriser un utilisateur à accéder à des dossiers spécifiques ?

4.    Configurez la stratégie de compartiment pour le compte A afin d'accorder des autorisations au rôle IAM ou à l'utilisateur que vous avez créé dans le compte B. Utilisez cette stratégie de compartiment pour accorder à un utilisateur les autorisations d'accès GetObject et PutObject pour les objets d'un compartiment appartenant au compte A :

{
    "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/*"
            ]
        }
    ]
}

Remarque : vus pouvez définir un dossier de compartiment S3 spécifique dans l'élément de ressource afin de fournir un accès granulaire pour un accès plus limité. Par exemple : Resource : arn:aws:s3:::AccountABucketName/FolderName/* En utilisant l'autorisation s3:PutObject avec une condition, le propriétaire du compartiment dispose d'un contrôle total sur les objets chargés par d'autres comptes. L'application de la liste ACL avec des en-têtes spécifiques est ensuite transmise dans l'appel d'API PutObject. Pour plus d'informations, consultez Octroi de l'autorisation s3:PutObject avec une condition qui nécessite que le propriétaire du compartiment ait le contrôle total.

Liste de contrôle d'accès (ACL) basée sur les ressources et stratégies IAM

Utilisez les listes ACL d'objets pour gérer les autorisations uniquement pour des scénarios spécifiques et uniquement si les listes ACL répondent mieux à vos besoins que les stratégies de compartiment IAM et S3. Pour plus d'informations, consultez Condition d'utilisation d'une stratégie d'accès basée sur les listes ACL (listes ACL de compartiment et d'objets). Les listes ACL Amazon S3 permettent aux utilisateurs de définir uniquement les jeux d'autorisations suivants : READ, WRITE, READ_ACP, WRITE_ACP et FULL_CONTROL. Vous pouvez utiliser uniquement un compte AWS ou l'un des groupes Amazon S3 prédéfinis comme bénéficiaire de la liste ACL Amazon S3. La liste ACL s'applique à toutes les entités du compte AWS bénéficiaire lorsque vous spécifiez l'adresse e-mail ou l'ID d'utilisateur canonique pour un compte AWS. Vous ne pouvez pas utiliser une liste ACL pour restreindre l'accès aux utilisateurs ou rôles IAM individuels. Vous ne pouvez pas appliquer de listes ACL à différents objets qui partagent les mêmes préfixes.

Remarque : le propriétaire du compartiment pourrait ne pas avoir le contrôle total sur les objets chargés par le bénéficiaire ACL. Cela est dû au fait que la liste ACL ne prend pas en charge la condition pour l'opération S3 que la liste ACL autorise.

Procédez comme suit pour utiliser les listes ACL de compartiment et d'objet pour gérer l'accès au compartiment S3 :

1.    Créez un rôle IAM ou un utilisateur dans le compte B. Ensuite, accordez à ce rôle ou à cet utilisateur des autorisations pour effectuer les opérations Amazon S3 requises. Les utilisateurs qui appellent PutObject et GetObject ont besoin des autorisations répertoriées dans la section Stratégies basées sur les ressources et les stratégies IAM.

2.    Configurez la liste ACL du compartiment pour inclure au moins l'autorisation WRITE pour le compte B. Cela garantit que les rôles IAM ou utilisateurs du compte B peuvent charger des objets (appel de l'API PutObject) dans un compartiment appartenant au compte A :

...
<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>

Remarque : pour trouver votre ID CanonicalUserID, consultez Recherche d'un ID d'utilisateur canonique de compte AWS.

3.    Configurez les listes ACL d'objets pour inclure au moins l'autorisation READ pour le compte B. Cela garantit que les rôles IAM ou les utilisateurs du compte B peuvent télécharger un objet (appel d'API GetObject) à partir d'un compartiment appartenant au compte A :

...
<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>

Les autorisations de liste ACL varient en fonction de la ressource S3, du compartiment ou de l'objet auquel une liste ACL est appliquée. Pour plus d'informations, consultez Présentation de la liste de contrôle d'accès (ACL). Vous pouvez configurer des listes ACL de compartiment et d'objet lorsque vous créez votre compartiment ou lorsque vous chargez un objet dans un compartiment existant. Pour plus d'informations, consultez la section Gestion des listes ACL.

Rôles IAM entre comptes

Tous les services AWS ne prennent pas en charge les stratégies basées sur les ressources. Autrement dit, vous pouvez utiliser des rôles IAM entre comptes pour centraliser la gestion des autorisations lorsque vous fournissez un accès entre comptes à plusieurs services. L'utilisation de rôles IAM entre comptes simplifie la mise en service de l'accès entre comptes aux objets S3 stockés dans plusieurs compartiments S3, ce qui élimine le besoin de gérer plusieurs stratégies pour les compartiments S3. Cette méthode autorise l'accès entre comptes aux objets détenus ou chargés par un autre compte AWS ou des services AWS. Vous devez modifier la liste ACL de l'objet si vous n'utilisez pas de rôles IAM entre comptes. Pour plus d'informations, consultez Comment Amazon S3 autorise une demande pour une opération d'objet.

Procédez comme suit pour utiliser des rôles IAM entre comptes afin de gérer l'accès au compartiment S3 :

1.    Créez un rôle IAM dans le compte A. Ensuite, accordez au rôle les autorisations nécessaires pour effectuer les opérations S3 requises. Dans la stratégie d'approbation du rôle, accordez à un rôle ou à un utilisateur du compte B les autorisations nécessaires pour assumer le rôle dans le compte A :

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

La stratégie d'accès suivante permet à un utilisateur qui a endossé ce rôle de télécharger et de charger des objets par programmation et à l'aide de la console Amazon S3. Pour en savoir plus, consultez Comment utiliser des stratégies IAM pour autoriser un utilisateur à accéder à des dossiers spécifiques ?

Remarque : vous pouvez supprimer les deux premières instructions de la stratégie suivante si un accès par programmation est obligatoire :

{
    "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/*"
        }
    ]
}

2.    Accordez à un rôle ou à un utilisateur IAM du compte B les autorisations nécessaires pour assumer le rôle IAM que vous avez créé dans le compte A.

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

3.    Depuis un rôle ou un utilisateur du compte B, assumez le rôle dans le compte A afin que les entités IAM du compte B puissent effectuer les opérations S3 requises. Pour plus d'informations, consultez la section Changement de rôle (console).

Remarque : en assumant un rôle IAM dans le compte A, l'opération Amazon S3 est déterminée par la stratégie d'accès. Le rôle IAM est considéré comme un appel d'API effectué par une entité IAM locale dans le compte A. Une stratégie de compartiment ou une liste ACL pour l'accès entre comptes n'est pas obligatoire. Pour plus d'informations, consultez la section Actions Amazon S3.