Comment fournir un accès entre comptes à des objets stockés dans des compartiment Amazon S3 ?

Dernière mise à jour : 26/02/2021

Je souhaite accorder à un autre compte AWS l'accès à un objet stocké dans un compartiment Amazon Simple Storage Service (Amazon S3). Comment accorder un accès entre comptes à des 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

Remarque : Si vous recevez des erreurs lors de l'exécution de commandes depuis l'interface de ligne de commande AWS (AWS CLI), assurez-vous d'utiliser la version la plus récente d'AWS CLI.

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.

Pour utiliser des stratégies de compartiment pour gérer l'accès au compartiment S3, procédez comme indiqué ci-dessous :

Remarque : remplacez les variables de compte par votre compte.

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.    Donnez 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 donne également au rôle IAM ou à l'utilisateur du compte B des autorisations pour appeler PUT Object acl afin d’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/*"

        }
    ]
}

Vous pouvez également créer une stratégie basée sur l'identité IAM à l'aide de l'exemple de commande AWS CLI create-policy.

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, tel que « 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 sur 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/*"
            ]
        }
    ]
}

Vous pouvez également créer une stratégie de compartiment Amazon S3 à l'aide de la commande AWS CLI exemple put-bucket-policy.

Remarque : vous 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é, tel que « 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 ensembles 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 ou les utilisateurs IAM du compte B peuvent télécharger des objets (appelez 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 CanonicalUserID, consultez Recherche d'un ID 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 le provisionnement de l'accès entre comptes aux objets S3 qui sont stockés dans plusieurs compartiments S3, éliminant ainsi le besoin de gérer plusieurs stratégies pour les compartiments S3. Cette méthode permet l'accès entre comptes aux objets détenus ou télé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 d'opération d'objet.

Pour utiliser des rôles IAM entre comptes afin de gérer l'accès aux compartiments S3, procédez comme indiqué ci-dessous :

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 des autorisations 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"
    }
  ]
}

Vous pouvez également créer un rôle avec la stratégie d’approbation à l'aide de l'exemple de commande AWS CLI create-role.

La stratégie d'accès suivante permet à un utilisateur qui a assumé ce rôle de télécharger et de charger des objets par programme 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/*"
        }
    ]
}

Vous pouvez également créer une stratégie basée sur l'identité IAM à l'aide de l'exemple de commande AWS CLI create-policy.

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"
  }
}

Vous pouvez également créer une stratégie basée sur l'identité IAM à l'aide de l'exemple de commande AWS CLI create-policy.

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.