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

Dernière mise à jour : 03/08/2022

Je veux 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

Dans Amazon S3, vous pouvez accorder aux utilisateurs d'un autre compte AWS (compte B) un accès granulaire entre comptes aux objets appartenant à votre compte (compte A).

Utilisez, selon le type d'accès que vous souhaitez fournir, l'une des solutions suivantes pour accorder un accès entre comptes aux objets :

  • Stratégies AWS Identity and Access Management (IAM) et stratégies de compartiment basées sur les ressources pour un accès aux objets de compartiment S3 par programmation uniquement
  • Stratégies IAM et listes de contrôle d’accès basées sur les ressources pour un accès aux objets de compartiment S3 par programmation uniquement
    Remarque : lorsque le paramètre appliqué par le propriétaire du compartiment est activé, toutes les listes de contrôle d’accès de compartiments et d'objets sont désactivées. Par conséquent, vous ne pouvez pas utiliser les listes de contrôle d’accès pour accorder un accès entre comptes. Par défaut, le paramètre Appliqué par le propriétaire du compartiment est activé pour tous les compartiments nouvellement créés. Une bonne pratique consiste également à utiliser des stratégies IAM et des stratégies de compartiment (au lieu des listes de contrôle d’accès) pour gérer l'accès entre comptes aux compartiments et aux objets. Pour plus d’informations, consultez Contrôle de la propriété des objets et désactivation des listes de contrôle d’accès pour votre compartiment.
  • Rôles IAM entre comptes pour l'accès par programmation et par console aux objets du compartiment S3

Si le demandeur est un principal IAM, le compte AWS propriétaire du principal doit accorder les autorisations S3 via une stratégie IAM. En fonction de votre cas d'utilisation spécifique, le propriétaire du compartiment doit également accorder des autorisations via une stratégie de compartiment ou une liste de contrôle d’accès. Une fois l'accès accordé, l'accès par programme aux compartiments multi-comptes revient à accéder aux mêmes compartiments de comptes.

Résolution

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

Remarque : si vous recevez des erreurs lors de l'exécution de commandes AWS Command Line Interface (AWS CLI), vérifiez que vous utilisez la version AWS CLI la plus récente.

Utilisez des stratégies de compartiment basées sur les ressources pour gérer le contrôle d’accès entre les 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 les éléments suivants :

  • Qui peut accéder aux objets à l'intérieur du compartiment (à l'aide de l'élément Principal)
  • Les objets auxquels ils peuvent avoir accès (à l'aide de l'élément Resource)
  • Comment ils peuvent accéder aux objets à l'intérieur du compartiment (à l'aide de l'élément Action)

L'application d'une stratégie de compartiment au niveau du compartiment vous permet de définir l’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 dans le compte B l'autorisation de télécharger (Objet GET) et de charger (Objet PUT) des objets vers et depuis un compartiment spécifique. Utilisez la stratégie IAM suivante pour accorder également au rôle IAM du compte B les autorisations d'appeler PutObjectAcl, en accordant 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 : assurez-vous de mettre à jour la stratégie pour inclure vos variables utilisateur (telles que l'ID de compte, le nom du compartiment et l'ARN). Vous pouvez également limiter l'accès à un dossier de compartiment spécifique dans le compte A. Pour limiter l’accès à un dossier de compartiment spécifique, définissez 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 octroyer l’accès à des dossiers spécifiques à un utilisateur ?

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.

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 l’exemple de commande AWS CLI 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 limité 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.

Stratégies IAM et listes de contrôle d'accès basées sur les ressources

Si les listes de contrôle d’accès répondent à vos besoins de façon plus appropriée que les stratégies IAM et de compartiment S3, utilisez les listes de contrôle d’accès des objets pour gérer les autorisations pour des scénarios spécifiques. Pour plus d'informations, consultez Quand utiliser une stratégie d'accès basée sur les listes de contrôle d’accès (listes de contrôle d’accès 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 de contrôle d’accès 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. Par exemple, vous ne pouvez pas utiliser une liste de contrôle d’accès pour restreindre l'accès aux utilisateurs ou rôles IAM individuels. Vous ne pouvez pas appliquer de listes de contrôle d’accès à 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 de la liste de contrôle d’accès. 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

Les services AWS ne prennent pas tous 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 l’approvisionnement de l'accès entre comptes aux objets S3 stockés dans plusieurs compartiments S3. Par conséquent, vous n'avez pas 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 de contrôle d’accès 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 :

Remarque : les rôles IAM nécessitent une stratégie d'approbation qui définit quels mandataires peuvent assumer le rôle et dans quelles conditions. Les rôles IAM peuvent avoir plusieurs stratégies d'autorisation (intégrées et attachées) qui définissent les autorisations qu'un principal assumant le rôle est en mesure d'effectuer et sur quelles ressources.

{
  "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 programmation et à l'aide de la console Amazon S3. Pour en savoir plus, consultez Comment utiliser des stratégies IAM pour octroyer l’accès à des dossiers spécifiques à un utilisateur ?

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.

Remarque : L'exemple de stratégie suivant doit être ajouté en tant que stratégie d'autorisation de l'utilisateur ou du rôle IAM.

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