web-dev-qa-db-fra.com

Autorisations de fichier Amazon S3, accès refusé lors de la copie depuis un autre compte

J'ai un ensemble de fichiers vidéo qui ont été copiés d'un compartiment AWS d'un autre compte vers mon compte dans mon propre compartiment. 

Je rencontre maintenant un problème avec tous les fichiers où je reçois des erreurs d'accès refusé lorsque j'essaie de rendre tous les fichiers publics.

Plus précisément, je me connecte à mon compte AWS, passe en S3, explore en détail les structures de dossiers pour localiser l'un des fichiers vidéo.

Lorsque je regarde ce fichier spécifique, l'onglet des autorisations sur les fichiers ne montre aucune autorisation attribuée à qui que ce soit. Aucun utilisateur, groupe ou autorisation système n'a été attribué.

Au bas de l'onglet Autorisations, je vois une petite boîte qui dit "Erreur: Accès refusé". Je ne peux rien changer au fichier. Je ne peux pas ajouter de méta-données. Je ne peux pas ajouter d'utilisateur au fichier. Je ne peux pas rendre le fichier public.

Existe-t-il un moyen de prendre le contrôle de ces fichiers afin de les rendre publics? Il y a plus de 15 000 fichiers/environ 60 Go de fichiers. J'aimerais éviter de télécharger et de re-télécharger tous les fichiers.

Avec l'aide et les suggestions des gens ici, j'ai essayé ce qui suit. J'ai créé un nouveau dossier dans mon panier appelé "média". 

J'ai essayé cette commande: 

aws s3 cp s3://mybucket/2014/09/17/thumb.jpg s3://mybucket/media --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers full=emailaddress=my_aws_account_email_address

Je reçois une erreur fatale 403 lors de l'appel de l'opération HeadObject: Interdit.

13
Robbiegod

Une énigme très intéressante! Heureusement, il existe une solution.

Tout d'abord, un récapitulatif:

  • Seau A dans le compte A
  • Bucket B dans le compte B
  • L'utilisateur du compte A copie les objets dans le compartiment B (après avoir obtenu les autorisations appropriées).
  • Les objets dans le compartiment B appartiennent toujours au compte A et n'est pas accessible par le compte B

J'ai réussi à reproduire cela et peux confirmer que les utilisateurs du compte B ne peuvent pas accéder au fichier, pas même l'utilisateur root du compte B!

Heureusement, les choses peuvent être réparées. La commande aws s3 cp dans L'interface de ligne de commande AWS peut mettre à jour les autorisations sur un fichier lorsqu'elle est copiée sous le même nom. Cependant, pour déclencher cela, vous devez également mettre à jour quelque chose d'autre sinon vous obtenez cette erreur:

Cette demande de copie est illégale car elle tente de copier un objet sur lui-même sans modifier ses métadonnées, sa classe de stockage, son emplacement de redirection de site Web ou ses attributs de chiffrement.

Par conséquent, les autorisations peuvent être mises à jour avec cette commande:

aws s3 cp s3://my-bucket/ s3://my-bucket/ --recursive --acl bucket-owner-full-control --metadata "One=Two"
  • Doit être exécuté par un compte Utilisateur ayant les autorisations d'accès aux objets (par exemple, l'utilisateur qui a initialement copié les objets dans Bucket B)
  • Le contenu des métadonnées est sans importance, mais nécessaire pour forcer la mise à jour
  • --acl bucket-owner-full-control accordera la permission au compte B afin que vous puissiez utiliser les objets normalement

Résultat final: Un seau que vous pouvez utiliser!

20
John Rotenstein
aws s3 cp s3://account1/ s3://accountb/ --recursive --acl bucket-owner-full-control 
1
Achyuth

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

Et définissez ACL pour les fichiers nouvellement créés dans le code. 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)

1
Nino van Hooff

Je crains que vous ne puissiez pas transférer la propriété comme vous le souhaitez. Voici ce que vous avez fait:

Ancien compte copie les objets dans le nouveau compte.

La "bonne" façon de procéder (en supposant que vous souhaitiez devenir propriétaire du nouveau compte) serait la suivante:

Nouveau compte copie les objets de l'ancien compte.

Voir la petite mais importante différence? Docs S3 genre de l'expliquer.

Je pense que vous pourriez vous en sortir sans avoir à télécharger le tout en copiant simplement tous les fichiers dans le même compartiment, puis en supprimant les anciens fichiers. Assurez-vous de pouvoir modifier les autorisations après la copie. Cela devrait aussi vous faire économiser de l'argent, car vous n'aurez pas à payer les coûts de transfert de données pour tout télécharger.

0
Viccari