web-dev-qa-db-fra.com

Obtenir 403 interdit de télécharger un fichier

J'ai un seau sur s3 et un utilisateur a un accès complet à ce seau.

Je peux exécuter une commande ls et voir les fichiers dans le compartiment, mais leur téléchargement échoue avec:

A client error (403) occurred when calling the HeadObject operation: Forbidden

J'ai également tenté cette opération avec un utilisateur doté d'autorisations S3 complètes via la console IAM. Même problème. 

Pour référence, voici la politique IAM que j'ai:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mybucket",
                "arn:aws:s3:::mybucket/*"
            ]
        }
    ]
}

J'ai également essayé d'ajouter une stratégie de compartiment, même en rendant le compartiment public, et toujours impossible ... également, à partir de la console, j'ai essayé de définir des autorisations individuelles sur les fichiers du compartiment, et j'ai obtenu une erreur indiquant que je ne pouvais pas afficher le compartiment , ce qui est étrange, puisque je le visionnais depuis la console lorsque le message est apparu et que je peux ls n'importe quoi dans le seau.

EDITles fichiers de mon compartiment ont été copiés à partir d’un autre compartiment appartenant à un autre compte, à l’aide des informations d’identité de mon compte. Peut ou peut ne pas être pertinent ...

2nd EDIT juste essayé de télécharger, télécharger et copier mes propres fichiers vers et depuis ce compartiment à partir d'autres compartiments, et cela fonctionne bien. Le problème concerne spécifiquement les fichiers placés à partir du compartiment d'un autre compte.

Merci!

6
MrSilverSnorkel

Je pense que vous devez vous assurer que les autorisations sont appliquées aux objets lorsque vous les déplacez/les copiez entre des compartiments avec l'option "bucket-owner-full-control" acl.

Voici les détails sur la façon de procéder lors du déplacement ou de la copie de fichiers, ainsi que rétroactivement: https://aws.Amazon.com/premiumsupport/knowledge-center/s3-bucket-owner-access/

Vous pouvez également lire des informations sur les différentes subventions prédéfinies ici: http://docs.aws.Amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl

7
wrj

Le problème ici provient de la façon dont vous insérez les fichiers dans le compartiment. Spécifiquement les informations d'identification que vous avez et/ou les privilèges que vous accordez au moment du téléchargement. J'ai rencontré un problème similaire d'autorisations lorsque j'avais plusieurs comptes AWS, même si ma stratégie de compartiment était très ouverte (la vôtre est ici). J'avais accidentellement utilisé les informations d'identification d'un compte (appelez-le A1) lors du téléchargement dans un compartiment appartenant à un autre compte (A2). A cause de cela, A1 a gardé les autorisations sur l'objet et le propriétaire du compartiment ne les a pas obtenues. Il existe au moins 3 façons possibles de résoudre ce problème dans ce scénario au moment du téléchargement:

  • Changer de compte. Exécutez $export AWS_DEFAULT_PROFILE=A2 ou, pour une modification plus permanente, allez à modifier ~/.aws/credentials et ~/.aws/config afin de déplacer les informations d'identification et la configuration correctes sous [default]. Puis re-télécharger.
  • Spécifiez l'autre profil au moment du téléchargement: aws s3 cp foo s3://mybucket --profile A2
  • Ouvrez les autorisations au propriétaire du compartiment (ne nécessite pas de changement de profil): aws s3 cp foo s3://mybucket --acl bucket-owner-full-control

Notez que les deux premières manières impliquent d'avoir un profil AWS distinct. Si vous souhaitez conserver deux ensembles d’identifiants de compte, c’est la voie à suivre. Vous pouvez configurer un profil avec vos clés, votre région, etc. en effectuant aws configure --profile Foo. Voir ici pour plus d’informations sur les profils nommés. 

Il existe également des manières légèrement plus compliquées de le faire rétroactivement (post upload) que vous pouvez lire à propos de ici .

5
watsonic

Pour définir correctement les autorisations appropriées pour les fichiers nouvellement ajoutés, ajoutez cette stratégie de compartiment:

[...]
{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::123456789012::user/their-user"
    },
    "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
    ],
    "Resource": "arn:aws:s3:::my-bucket/*"
}

Votre politique de compartiment est encore plus ouverte, ce n'est donc pas ce qui vous bloque.

Cependant, le téléchargeur doit définir la liste de contrôle d'accès pour les fichiers nouvellement créés. Exemple Python:

import boto3

client = boto3.client('s3')
local_file_path = '/home/me/data.csv'
bucket_name = 'my-bucket'
bucket_file_path = 'exports/data.csv'
client.upload_file(
    local_file_path,
    bucket_name, 
    bucket_file_path, 
    ExtraArgs={'ACL':'bucket-owner-full-control'}
)

source: https://medium.com/artificial-industry/how-to-download-files-that-others-put-put-in-your-aws-s3-bucket-2269e20ed041 (disclaimer: écrit par moi)

0
Nino van Hooff