Pourquoi ne puis-je pas charger le contenu du site web chargé sur mon compartiment Amazon S3 depuis un autre compte AWS ?

Dernière mise à jour : 27/01/2021

J'utilise un compartiment Amazon Simple Storage Service (Amazon S3) pour stocker du contenu pour mon site web. Un utilisateur à partir d'un autre compte AWS a chargé un objet sur mon compartiment pour le site web. Ma stratégie de compartiment est correcte, mais l'objet ne chargera pas sur le site web. Comment puis-je corriger ce problème  ?

Brève description

Si un autre compte AWS charge un objet dans votre compartiment, vous ne deviendrez pas son propriétaire par défaut. Par conséquent, il se peut que vous ne puissiez pas lire l'objet. Le compte du chargement doit explicitement vous (le propriétaire du compartiment) accorder les autorisations concernant l'objet.

En outre, une stratégie de compartiment ne s'applique pas aux objets du compartiment qui sont la propriété d'autres comptes. Par conséquent, la stratégie de compartiment qui accorde l'accès en lecture aux utilisateurs de votre site web ne s'applique pas automatiquement aux objets chargés par un autre compte.

Pour résoudre le problème de chargement, modifiez la liste de contrôle d'accès (ACL) de l'objet à l'aide de l'une de ces méthodes :

  • Le propriétaire de l'objet accorde un accès en lecture public aux objets.
  • Le propriétaire de l'objet accorde au propriétaire du compartiment le contrôle total de l'objet.

Tenez compte des éléments suivants pour l'octroi de l'accès à un compartiment à un autre compte :

  • Les objets téléchargés vers un compartiment par un autre compte ne peuvent pas être lus par le compte du compartiment par défaut. Le compte qui a téléchargé l'objet doit explicitement mettre à jour la liste de contrôle d'accès (ACL) pour accorder des autorisations de lecture.
  • Les objets téléchargés vers un compartiment par un autre compte n'héritent pas automatiquement des autorisations définies dans la stratégie de compartiment. Le propriétaire du compartiment doit s'approprier l'objet pour appliquer la stratégie de compartiment.
  • Si vous souhaitez autoriser un autre compte à accéder à votre compartiment, il est recommandé d'utiliser une stratégie de compartiment. Une stratégie de compartiment est un moyen plus centralisé et complet pour gérer les autorisations.
  • Si vous souhaitez autoriser un autre compte à charger des objets dans votre compartiment, créez un rôle AWS Identity and Access Management (IAM). Le rôle IAM doit être créé à partir de votre compte AWS et configuré de sorte qu'un autre compte AWS puisse assumer ce rôle. Lorsque l'autre compte utilise le rôle IAM pour charger des objets, votre compte devient propriétaire des objets, car le rôle lui appartient. Pour obtenir un exemple de configuration de plusieurs comptes à l'aide d'un rôle IAM, consultez Attribution par le propriétaire du compartiment d'autorisations entre comptes pour un objet qu'il ne possède pas.

Résolution

Le propriétaire de l'objet accorde l'accès en lecture public de l'objet.

Le compte qui a chargé l'objet peut accorder l'accès en lecture public en exécutant cette commande de l'interface de ligne de commande AWS (AWS CLI) :

aws s3api put-object-acl --bucket docexamplebucket --key example.jpg --acl public read

Pour la valeur de --bucket, saisissez le nom du compartiment qui stocke le contenu de votre site web.

Remarque : si vous recevez des erreurs lors de l'exécution des commandes dans AWS CLI, assurez-vous d'utiliser la version la plus récente d'AWS CLI.

Pour restreindre le trafic vers un objet, le propriétaire du compartiment peut utiliser une stratégie de compartiment qui autorise uniquement les demandes provenant de certaines adresses IP ou VPC.

Par exemple, cette stratégie de compartiment refuse l'accès aux objets dans docexamplebucket, sauf si la demande est émise depuis les adresses IP répertoriées en tant que « aws:SourceIp ». Ou, la demande doit être depuis le VPC défini comme « aws:sourceVpc » :

{
    "Version": "2012-10-17",
    "Id": "Policy1415115909152",
    "Statement": [
        {
            "Sid": "Deny-Access-Except-For-Trusted-IPs-and-VPC",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::docexamplebucket/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "1.1.1.1/32",
                        "2.2.2.2/32",
                        "3.3.3.3/32"
                    ]
                },
                "StringNotEquals": {
                    "aws:sourceVpc": "vpc-12345abc"
                }
            }
        }
    ]
}

Le propriétaire de l'objet accorde au propriétaire du compartiment le contrôle total de l'objet

Les propriétaires d'objets peuvent automatiquement accorder au propriétaire du compartiment le contrôle total d'un objet en activant la propriété d'objet S3 sur le compartiment de destination. Cette fonctionnalité confère au propriétaire du compartiment le contrôle lorsque le propriétaire de l'objet charge un objet, et inclut la liste ACL prédéfinie bucket-owner-full-control .

Une fois que le propriétaire du compartiment a configuré sa propriété d'objet S3 sur « propriétaire du compartiment préféré », le propriétaire du compartiment peut ajouter une autre stratégie de compartiment. Cette stratégie de compartiment supplémentaire doit exiger que toutes les opérations PUT d'Amazon S3 incluent l'ACL prédéfinie bucket-owner-full-control. Cette liste ACL accorde au propriétaire du compartiment le contrôle total des nouveaux objets. Pour plus d'informations, consultez Contrôle de la propriété des objets chargés à l'aide de la propriété d'objets S3.

Pour accorder au propriétaire du compartiment le contrôle total de l'objet, utilisez la syntaxe CLI suivante lors du chargement d'objets :

aws s3api put-object --bucket docexamplebucket --key example.jpg --acl bucket-owner-full-control

Le propriétaire du compartiment possède à présent l'objet qui hérite des autorisations définies dans la stratégie de compartiment.

Pour les objets existants qui ont été chargés avant d'activer la propriété d'objet S3, le propriétaire de l'objet doit accorder au propriétaire du compartiment les autorisations sur l'objet. Ensuite, le propriétaire du compartiment doit copier sur l'objet lui-même.

Pour accorder au propriétaire du compartiment le contrôle total de l'objet, utilisez la syntaxe CLI suivante avec le compte qui a chargé l'objet :

aws s3api put-object-acl --bucket docexamplebucket --key example.jpg --acl bucket-owner-full-control

Pour hériter de la propriété de l'objet, le propriétaire du compartiment doit copier sur l'objet lui-même comme ceci :

aws s3 cp s3://docexamplebucket/example.jpg s3://docexamplebucket/example.jpg --acl bucket-owner-full-control

Le propriétaire du compartiment possède à présent l'objet qui hérite des autorisations définies dans la stratégie de compartiment.

Exiger que les chargements entre comptes accordent au propriétaire du compartiment le contrôle total de l'objet

Pour exiger que tous les chargements (s3:PutObject) à partir d'un autre compte accordent au propriétaire du compartiment le contrôle total de l'objet, utilisez une stratégie de compartiment comme ceci :

{
    "Id": "Policy1541018284691",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RequireBucketOwnerFullControlOnPuts",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:user/iam_user"                ]
            },
            "Action": [
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::docexamplebucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

Avec cette stratégie de compartiment, l'utilisateur de l'autre compte (111122223333) peut charger dans le compartiment uniquement lorsque l'ACL de l'objet est spécifiée. L'ACL de l'objet doit accorder un contrôle total au propriétaire du compartiment. L'utilisateur doit alors charger les objets comme ceci :

aws s3 cp path/to/local/file s3://docexamplebucket --acl bucket-owner-full-control