web-dev-qa-db-fra.com

S3: rendre un dossier public privé à nouveau?

Comment rendre à nouveau un dossier public AWS S3 privé?

J'essayais des données de transfert, alors j'ai rendu le dossier entier public dans un compartiment. Je voudrais restreindre son accès à nouveau. Alors, comment puis-je rendre le dossier privé à nouveau?

53
GoodGets

D'après ce que j'ai compris, l'option "Rendre public" dans la console de gestion ajoute de manière récursive une subvention publique pour chaque objet "dans" le répertoire. Vous pouvez le voir en cliquant avec le bouton droit de la souris sur un fichier, puis en cliquant sur "Propriétés". Vous devez ensuite cliquer sur 'Autorisations' et une ligne devrait apparaître:

 Grantee:  Everyone  [x] open/download  [] view permissions   [] edit permission.

Si vous téléchargez un nouveau fichier dans ce répertoire, il n'aura pas cet ensemble d'accès public et ne sera donc pas privé.

Vous devez supprimer l'autorisation de lecture publique une par une, soit manuellement si vous ne disposez que de quelques clés, soit à l'aide d'un script. 

J'ai écrit un petit script en Python avec le module 'boto' pour supprimer de manière récursive l'attribut 'public read' de toutes les clés d'un dossier S3:

#!/usr/bin/env python
#remove public read right for all keys within a directory

#usage: remove_public.py bucketName folderName

import sys
import boto

bucketname = sys.argv[1]
dirname = sys.argv[2]
s3 = boto.connect_s3()
bucket = s3.get_bucket(bucketname)

keys = bucket.list(dirname)

for k in keys:
    new_grants = []
    acl = k.get_acl()
    for g in acl.acl.grants:
        if g.uri != "http://acs.amazonaws.com/groups/global/AllUsers":
            new_grants.append(g)
    acl.acl.grants = new_grants
    k.set_acl(acl)

Je l'ai testé dans un dossier avec (seulement) 2 objets et cela a fonctionné. Si vous avez beaucoup de clés, cela peut prendre un certain temps et une approche parallèle peut être nécessaire.

34
ascobol

La réponse acceptée fonctionne bien - semble également définir les ACL de manière récursive sur un chemin s3 donné. Cependant, cela peut également être fait plus facilement par un outil tiers appelé s3cmd - nous l'utilisons beaucoup dans mon entreprise et il semble être assez populaire dans la communauté AWS.

Par exemple, supposons que vous ayez ce type de seau et de structure de répertoire s3: s3://mybucket.com/topleveldir/scripts/bootstrap/tmp/. Supposons maintenant que vous ayez marqué l'intégralité de la scripts "répertoire" comme public à l'aide de la console Amazon S3. 

Maintenant, pour rendre l’ensemble scripts "arborescence de répertoires" de manière récursive (c.-à-d. Y compris les sous-répertoires et leurs fichiers) à nouveau privé:

s3cmd setacl --acl-private --recursive s3://mybucket.com/topleveldir/scripts/

Il est également facile de rendre récursivement public scripts "arborescence de répertoires" à nouveau si vous voulez: 

s3cmd setacl --acl-public --recursive s3://mybucket.com/topleveldir/scripts/

Vous pouvez également choisir de définir l'autorisation/ACL uniquement sur un "répertoire" s3 donné (c'est-à-dire non récursivement) en omettant simplement --recursive dans les commandes ci-dessus.

Pour que s3cmd fonctionne, vous devez d'abord fournir votre accès AWS et vos clés secrètes à s3cmd via s3cmd --configure (voir http://s3tools.org/s3cmd pour plus de détails).

53
nonbeing

Pour AWS CLI, c'est assez simple.

Si l'objet est: s3://<bucket-name>/file.txt

Pour un seul objet:

aws s3api put-object-acl --acl private --bucket <bucket-name> --key file.txt

Pour tous les objets dans le seau (bash one-liner):

aws s3 ls --recursive s3://<bucket-name> | cut -d' ' -f5- | awk '{print $NF}' | while read line; do
    echo "$line"
    aws s3api put-object-acl --acl private --bucket <bucket-name> --key "$line"
done
10
Varun Chandak

J'ai effectivement utilisé l'interface utilisateur d'Amazon en suivant ce guide http://aws.Amazon.com/articles/5050/

although it looks somewhat different than that guide

8
comandante N

A partir de la liste de compartiment AWS S3 (l'interface utilisateur AWS S3), vous pouvez modifier les autorisations du fichier individuel après avoir rendu public un fichier soit manuellement ou en rendant le contenu du dossier entier public (To clarifiez, je me réfère à un dossier dans un seau). Pour rétablir l'attribut public à privé, vous cliquez sur le fichier, puis allez dans les autorisations et cliquez dans l'en-tête bouton radial sous "TOUT LE MONDE". Vous obtenez une deuxième fenêtre flottante où vous pouvez décocher l'attribut * read object ". N'oubliez pas de sauvegarder la modification. Si vous essayez d'accéder au lien, vous devriez obtenir le message typique" Accès refusé ". J'ai joint deux captures d'écran. Cliquez sur le fichier et suivez la procédure ci-dessus pour afficher la deuxième capture d'écran, qui présente les 4 étapes. Notez que pour modifier plusieurs fichiers, vous devez utiliser les scripts tels que proposés dans les publications précédentes. -Kf

 First: Bucket listing in AWS-S3


 Second:steps to change access permission

6
K F

À partir de maintenant, selon la boto docs vous pouvez le faire de cette façon

#!/usr/bin/env python
#remove public read right for all keys within a directory

#usage: remove_public.py bucketName folderName

import sys
import boto

bucketname = sys.argv[1]
dirname = sys.argv[2]
s3 = boto.connect_s3()
bucket = s3.get_bucket(bucketname)

keys = bucket.list(dirname)

for k in keys:
    # options are 'private', 'public-read'
    # 'public-read-write', 'authenticated-read'
    k.set_acl('private') 

En outre, vous pouvez envisager de supprimer toute stratégie de compartiment sous l'onglet autorisations du compartiment s3.

3
Levon

Bien que la réponse de @ kintuparantu fonctionne à merveille, il convient de noter que, en raison de la partie awk, le script ne prend en compte que la dernière partie des résultats ls. Si le nom de fichier contient des espaces, awk obtiendra uniquement le dernier segment du nom de fichier divisé par des espaces, et non le nom de fichier entier.

Exemple: Un fichier avec un chemin tel que folder1/subfolder1/this is my file.txt donnerait une entrée appelée simplement file.txt.

Pour éviter que cela ne se produise tout en utilisant son script, vous devez remplacer $NF dans awk {print $NF} par une séquence d’espaces réservés pour variables, qui prend en compte le nombre de segments résultant de l’opération 'division par espace' Je suis allé avec une exagération, mais pour être tout à fait honnête, je pense qu'une approche complètement nouvelle serait probablement préférable pour traiter ces cas. Voici le code mis à jour:

#!/bin/sh
aws s3 ls --recursive s3://plusplus-staging | awk '{print $4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25}' | while read line; do
    echo "$line"
    aws s3api put-object-acl --acl private --bucket plusplus-staging --key "$line"
done

Je devrais également mentionner que l'utilisation de cut n'a eu aucun résultat pour moi, alors je l'ai supprimée. Les crédits vont toujours à @kintuparantu, car il a construit le script.

2
Luca Bezerra

Je l'ai fait aujourd'hui. Ma situation était que j'avais certains répertoires de premier niveau dont les fichiers devaient être privés. J'ai eu quelques dossiers qui devaient être laissés public.

J'ai décidé d'utiliser le s3cmd comme beaucoup de gens l'ont déjà montré. Mais étant donné le nombre considérable de fichiers, je voulais exécuter des travaux s3cmd parallèles pour chaque répertoire. Et comme cela allait prendre un jour ou deux, je voulais les exécuter en tant que processus d'arrière-plan sur une machine EC2.

J'ai configuré une machine Ubuntu en utilisant le type t2.xlarge. J'ai choisi le xlarge après que s3cmd a échoué avec des messages de mémoire insuffisante sur une micro-instance. xlarge est probablement excessif, mais ce serveur ne sera opérationnel que pendant un jour.

Une fois connecté au serveur, j'ai installé et configuré s3cmd:

Sudo apt-get install python-setuptools wget https://sourceforge.net/projects/s3tools/files/s3cmd/2.0.2/s3cmd-2.0.2.tar.gz/download mv download s3cmd.tar.gz tar xvfz s3cmd.tar.gz cd s3cmd-2.0.2/ python setup.py install Sudo python setup.py install cd ~ s3cmd --configure

À l’origine, j’ai essayé d’utiliser screen, mais j’ai eu quelques problèmes. La plupart des processus étaient abandonnés depuis screen -r malgré l’exécution de la commande d’écran appropriée, telle que screen -S directory_1 -d -m s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_1. J'ai donc fait quelques recherches et trouvé la commande Nohup. Voici ce que j'ai fini avec:

Nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_1 > directory_1.out & Nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_2 > directory_2.out & Nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_3 > directory_3.out &

Avec une erreur multi-curseur, cela devient assez facile (j'ai utilisé aws s3 ls s3//my_bucket pour lister les répertoires).

En faisant cela, vous pouvez logout comme vous le souhaitez, puis reconnectez-vous et conservez l'un de vos journaux. Vous pouvez aligner plusieurs fichiers tels que: tail -f directory_1.out -f directory_2.out -f directory_3.out

Donc, configurez s3cmd puis utilisez Nohup comme je l’ai démontré et vous êtes prêt à partir. S'amuser!

1
Steve Potter

Il semble que cela soit maintenant adressé par Amazon:

La sélection de la case à cocher suivante rend le compartiment et son contenu de nouveau privés:

Bloquer l'accès public et inter-comptes si le compartiment a des politiques publiques

https://aws.Amazon.com/blogs/aws/Amazon-s3-block-public-access-another-layer-of-protection-for-your-accounts-and-buckets/

 enter image description here 

0
Spiff

 enter image description here

Si vous avez un navigateur S3, vous aurez la possibilité de le rendre public ou privé.

0
Avinash Clinton