Simple Storage Service

Accès refusé en essayant de récupérer des objets téléchargés dans le seau s3 via aws sdk en utilisant cloudfront.

En utilisant les URLs signées de client-s3 sdk,j'ai été capable de PUT et DELETE des objets dans mon bucket s3.Mais lorsque j'essaie d'accéder à ces mêmes objets en utilisant une requête GET via cloudfront,s3 me refuse l'accès (Access Denied)aux objets.Dans la section des autorisations du seau,j'ai défini la politique du seau pour autoriser les demandes GET de ma distribution cloudfront.Je sais que cela fonctionne car lorsque je télécharge des objets via la console s3,je peux utiliser des URL signées par cloudfront pour obtenir les objets de s3,ce qui fonctionne.Mais une fois que j'utilise le client-s3 de manière programmatique pour télécharger l'objet,je suis incapable de le récupérer en utilisant ma distribution cloudfront.

Hi there,

Partage de l'accès aux objets téléchargés sur S3

J'ai créé un utilisateur IAM.Et c'est cet utilisateur qui est utilisé pour PUT les objets dans s3.Cela signifie donc que les actions de la politique ne s'appliquent qu'à cet utilisateur,et qu'il est donc le seul autorisé à accéder à ces objets.

Il se peut que j'interprète mal,mais si je comprends ce que vous dites,ce n'est pas exact.Une fois que vous avez écrit un objet dans votre seau,il existe plusieurs façons d'en accorder l'accès à d'autres personnes.Voici quelques exemples courants :

  1. L'entité est un rôle ou un utilisateur IAM de votre compte dont la stratégie IAM autorise l'accès S3 (par exemple s3:GetObject ). Votre utilisateur root aura un accès complet par défaut.

  2. Si l'entité est un utilisateur anonyme (toute demande non authentifiée par AWS), la stratégie de compartiment S3 ou l'ACL d'un objet individuel autorise les lectures anonymes.

  3. Si l'entité est un principe IAM d'un autre compte, la stratégie IAM du principe et votre stratégie de compartiment S3 doivent accorder l'autorisation de principe à S3.

  4. Vos utilisateurs ou rôles IAM peuvent générer une URL signée S3 pour un objet donné (en supposant qu'ils aient cette permission via une politique IAM).Toute personne disposant de cette URL peut accéder à votre objet tant que l'URL n'a pas expiré.

  5. Vous configurez une distribution CloudFront avec un compartiment S3 comme origine et la configuration de votre compartiment est correcte. Si vous utilisez le chiffrement SSE-S3, vous devez également utiliser une identité d'accès à l'origine CloudFront (OIA). Si vous utilisez SSE-KMS, vous devez utiliser Lambda et modifier la requête pour autoriser le déchiffrement de l'objet (sinon, vous obtiendrez un accès refusé ; consultez ce billet de blog pour des instructions détaillées ).

Il existe certains scénarios où les méthodes ci-dessus ne fonctionneront pas (ou ne fonctionneront pas sans étapes supplémentaires). Par exemple, un DENY dans une stratégie de compartiment annulera toujours un ALLOW dans une stratégie IAM, et vice versa. Par #5, l'utilisation de SSE ajoute des exigences supplémentaires.

Identité utilisée par CloudFront

Je suppose que Cloudfront utilise l'utilisateur racine de mon compte pour accéder aux objets du seau,c'est pourquoi l'accès lui est refusé.Ma nouvelle question est donc la suivante:comment puis-je faire en sorte que Cloudfront accède au seau en tant qu'utilisateur que j'ai créé et non en tant qu'utilisateur root ?

Ce n'est pas exact. Lors de la communication avec votre compartiment S3, CloudFront ne peut pas utiliser votre identité racine ou toute autre identité IAM dans votre compte. Vous devez considérer CloudFront comme n'importe quel autre utilisateur anonyme (c'est-à-dire qui n'a pas d'identité IAM), à une exception près : vous pouvez éventuellement créer un type spécial d'utilisateur CloudFront appelé Origin Access Identity (OAI) et l'attacher à votre CloudFront Distribution . Semblable à une identité IAM, vous pouvez faire référence à cette OAI dans votre stratégie de compartiment et accorder à CloudFront l'accès à votre compartiment.

Pourquoi CloudFront ne peut pas accéder aux objets que vous créez avec le SDK client-s3 ?

Sous le capot, la console Web S3, le kit SDK AWS et l'AWS CLI utilisent tous les mêmes API REST S3 .

Par conséquent,si vous recevez des erreurs lors du téléchargement d'un objet à partir de la console Web mais que vous n'en recevez pas si vous le téléchargez avec le SDK S3,cela signifie qu'il n'y a que deux possibilités :

  1. Lors du téléchargement d'objets,le principe AWS (c'est-à-dire l'utilisateur IAM,le rôle ou la racine du compte)que vous utilisez dans la console Web S3 provient d'un compte AWS qui n'est pas le même que celui que vous utilisez avec le SDK S3.TLDR;les choses se compliquent un peu si le compte A télécharge des objets dans le seau du compte B et que le compte B veut les lire ou les partager avec d'autres personnes en dehors du compte B.Je suppose que vous faites tout à partir d'un seul compte AWS et si c'est le cas,nous pouvons exclure cette possibilité.

  2. Bien que la même API ( PutObject ) soit utilisée dans les deux méthodes, les paramètres émis sont différents et vous obtenez une erreur car un paramètre est manquant ou a une valeur incorrecte avec votre SDK.

# 2 est presque certainement votre problème, mais sans effectuer une comparaison détaillée des paramètres que vous choisissez dans la console Web par rapport au SDK s3, mais je ne peux pas dire avec certitude. Si c'est la cause, les deux paramètres auxquels je peux penser qui pourraient causer un problème sont:

  • LCA d'objet S3
  • Paramètres de chiffrement - selon que vous utilisez ou non le chiffrement côté serveur et la méthode que vous utilisez, cela peut avoir un impact sur la capacité de CloudFront à lire à partir de S3.



Apparemment,le problème venait de la façon dont je nommais les objets dans le seau.J'ai ajouté un horodatage au format ISO8601 au nom de chaque objet lors de la création du presignedUrl s3 pour la requête PUT.Ainsi,lorsque cloudfront essaie d'y accéder,il modifie certains de ces caractères bizarres dans la chaîne de date,et en conséquence,s3 refuse l'accès.Parce que l'objet auquel Cloudfront essaie d'accéder n'existe pas.Merci pour votre aide