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?
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.
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).
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
J'ai effectivement utilisé l'interface utilisateur d'Amazon en suivant ce guide http://aws.Amazon.com/articles/5050/
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
À 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.
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.
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!
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