2017-10-12 13 views
1

J'ai mis en place un résolveur de cache Amazon S3 avec le bundle Liip Imagine, et j'ai des problèmes pour obtenir les bonnes permissions sur le bucket afin d'empêcher l'affichage du contenu du répertoire dans le navigateur.Stratégie Amazon S3 + Liip Imagine Cache Resolver

Mon scénario:

Le site a fait quelques actifs d'image sur S3 - certains via le CMS uploadés et beaucoup également uploadés manuellement à l'aide du faisceau Vich Upload. J'utilise le bundle Imagine pour résoudre les images mises en cache en fonction des filtres définis dans le fichier config.yml (pour les choses comme les miniatures et les aperçus) qui sont ensuite stockés dans des répertoires séparés dans mon compartiment S3 nommé d'après le filtre. Donc, en bref, Télécharger original à S3 -> fichiers en cache résolus stockés sur S3 automatiquement. Fonctionne très bien.

Le problème

La seule façon que je suis en mesure de résoudre les fichiers mis en cache à la demande la première fois est d'avoir des autorisations publiques ouvertes sur le grand seau. Ce n'est pas bon parce que quand vous faites ceci S3 expose un "explorateur de seau" à la manière d'un fichier XML qui énumère le contenu entier de seaux (ou au moins les 1000 premiers enregistrements). J'ai besoin que tous les fichiers soient publics, mais je ne peux pas en avoir une liste à un moment donné car nous avons eu des problèmes avec les gens qui reniflaient le site de ce client avant le lancement de nouveaux produits. Je ne veux au moins pas de liste de noms de fichiers.

Ce que j'ai essayé

J'ai essayé plusieurs combinaisons de paramètres dans le seau ACL en combinaison avec la politique du godet suivant:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "AddPerm", 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::[MY_BUCKET]/*" 
     } 
    ] 
} 

Et ce que j'ai trouvé que les fichiers mis en cache ne seront pas résolus à moins que le groupe "Tout le monde" sous l'accès public ne reçoive des autorisations "Liste d'objets". Dès que je désactive cette autorisation (ce qui désactive l'affichage du fichier XML dans le navigateur), les fichiers non mis en cache ne peuvent plus être résolus à partir des téléchargements.

enter image description here

ce que j'ai essayé

J'ai essayé aussi de configurer le seau comme un site Web et un fichier téléchargé par défaut index.html dans la racine, par une suggestion que je trouve ici. Cela n'a rien fait. Peut-être qu'il me manque quelque chose.

J'ai également essayé de m'assurer que les dossiers de résolution de cache étaient publics dans S3 avec l'autorisation de la liste Objets désactivée dans le compartiment. Cela n'a pas fonctionné non plus.

L'erreur

Lorsque la liste des objets autorisation est supprimée l'erreur suivante est produite lorsque la tentative de résolution a lieu

Error executing "CreateBucket" on "https://[MY_BUCKET].s3.amazonaws.com/"; 
AWS HTTP error: Client error: `PUT https://[MY_BUCKET].s3.amazonaws.com/` 
resulted in a `403 Forbidden` response: 

<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>AccessDenied</Code> 
<Message>Access Denied</Message><RequestId>94D939 (truncated...) 
AccessDenied (client): Access Denied - <?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>AccessDenied</Code><Message>Access Denied</Message> 
<RequestId>[HIDDEN]</RequestId> 
<HostId>[HIDDEN]</HostId> 
</Error> 

Structure du godet est comme ce

[MY_BUCKET] 
    -thumbnails // <-- where thumbnails are resolved 
    -previews // <-- where previews are resolved 
    -uploads // <-- primary uploads parent dir 
    --products // <-- where products are uploaded 
    --other // <-- where other files are uploaded 
    --images // <-- where images are manually uploaded 

Mon hypothèse est que le résolveur doit lire le c ontents des répertoires afin de déterminer si le fichier a été résolu ou non.

Si nécessaire, je peux fournir des informations de configuration à partir de symfony, mais cela ne me pose aucun problème et je ne pense pas que cela soit nécessaire.

En fin de compte, je dois simplement laisser le résolveur faire son travail et empêcher l'accès du navigateur au contenu du compartiment.

Répondre

0

J'ai compris cela. Il a fallu un ajustement de la politique au niveau IAM, en changeant le nœud de ressources à partir de:

... 
"Resource":[ 
    "arn:aws:s3:::[MY_BUCKET]/*" 
] 

à:

.... 
"Resource":[ 
    "arn:aws:s3:::*" 
]