21 votes

Empêcher le hotlinking d'Amazon Cloudfront

J'utilise Amazon Cloudfront pour héberger toutes les images et vidéos de mon site, afin de les servir plus rapidement à mes utilisateurs qui sont assez dispersés dans le monde. J'applique également une mise en cache directe assez agressive aux éléments hébergés sur Cloudfront, en définissant les paramètres suivants Cache-Control à public, max-age=7776000 .

J'ai récemment découvert, à mon grand dam, que des sites tiers établissaient des liens directs avec mon serveur Cloudfront pour afficher des images sur leurs propres pages, sans autorisation.

J'ai configuré .htaccess pour empêcher les liens chauds sur mon propre serveur, mais je n'ai pas trouvé de moyen de le faire sur Cloudfront, qui ne semble pas prendre en charge cette fonctionnalité de manière native. Et, chose ennuyeuse, les Bucket Policies d'Amazon, qui pourraient être utilisées pour empêcher le hotlinking, n'ont d'effet que sur S3, elles n'ont aucun effet sur les distributions CloudFront [ lien ]. Si vous voulez profiter de ces politiques, vous devez servir votre contenu directement depuis S3.

Parcourir les journaux de mon serveur pour trouver les hotlinkers et modifier manuellement les noms de fichiers n'est pas vraiment une option réaliste, bien que je l'aie fait pour mettre fin aux infractions les plus flagrantes.

Toute suggestion serait la bienvenue.

11voto

Blaise Points 1979

Vous pouvez faire suivre le Referer l'en-tête de votre origine

  1. Allez dans les paramètres de CloudFront
  2. Modifier les paramètres d'une distribution
  3. Allez dans l'onglet Comportements et modifiez ou créez un comportement.
  4. Mettre les en-têtes de transfert sur une liste blanche
  5. Ajouter Referer comme en-tête de liste blanche
  6. Enregistrez les paramètres dans le coin inférieur droit

Veillez à gérer l'en-tête Referer sur votre origine également.

10voto

zimbatm Points 192

L'approche officielle consiste à utiliser urls signées pour vos médias. Pour chaque média que vous souhaitez distribuer, vous pouvez générer une url spécialement conçue qui fonctionne dans une contrainte donnée de temps et d'adresses IP sources.

Une approche pour les pages statiques consiste à générer des urls temporaires pour les médias inclus dans cette page, qui sont valables pour deux fois la durée de la mise en cache de la page. Disons que le temps de mise en cache de votre page est de 1 jour. Tous les 2 jours, les liens seront invalidés, ce qui obligera les hotlinkers à mettre à jour leurs urls. Ce n'est pas infaillible, car ils peuvent construire des outils pour obtenir les nouvelles urls automatiquement, mais cela devrait empêcher la plupart des gens.

Si votre page est dynamique, vous n'avez pas à vous soucier de vider le cache de votre page et vous pouvez simplement générer des urls qui ne fonctionnent que pour l'IP du demandeur.

8voto

RapidNFC Points 119

Nous avons eu de nombreux problèmes de hotlinking. Au final, nous avons créé des sprites css pour beaucoup de nos images. En ajoutant des espaces blancs en bas et sur les côtés ou en combinant des images ensemble.

Nous les affichons correctement sur nos pages à l'aide de CSS, mais tous les hotlinks affichent les images de manière incorrecte, à moins de copier également les CSS/HTML.

Nous avons constaté qu'ils ne s'en soucient pas (ou qu'ils ne savent pas comment faire).

6voto

Redtopia Points 721

Depuis octobre 2015, vous pouvez utiliser AWS WAF pour restreindre l'accès aux fichiers Cloudfront. Voici un article de AWS qui annonce le WAF et explique ce que vous pouvez faire avec. Voici un article qui m'a aidé à configurer ma première ACL pour restreindre l'accès en fonction du référent.

En fait, j'ai créé une nouvelle ACL avec une action par défaut de DENY. J'ai ajouté une règle qui vérifie la fin de la chaîne de l'en-tête referer pour mon nom de domaine (en minuscules). Si cette règle est acceptée, l'accès est autorisé.

Après avoir assigné mon ACL à ma distribution Cloudfront, j'ai essayé de charger un de mes fichiers de données directement dans Chrome et j'ai obtenu cette erreur :

Chrome error message when trying to access a Cloudfront file directly after applying a WAF ACL

2voto

Chris W Points 56

Pour autant que je sache, il n'existe actuellement aucune solution, mais j'ai quelques suggestions, peut-être pertinentes, peut-être non pertinentes...

Premier : De nombreuses personnes ont posé cette question sur les forums d'assistance de Cloudfront. Voir aquí y aquí par exemple.

Il est clair qu'AWS profite des liens hypertextes : plus il y a de visites, plus ils nous facturent ! Je pense que nous (les utilisateurs de Cloudfront) devons lancer une sorte de campagne fortement orchestrée pour les inciter à proposer la vérification des référents comme fonctionnalité.

Une autre solution temporaire à laquelle j'ai pensé est de changer le CNAME que j'utilise pour envoyer le trafic à cloudfront/s3. Disons que vous envoyez actuellement toutes vos images à :

cdn.blahblahblah.com (qui redirige vers un seau cloudfront/s3)

Vous pourriez le changer en cdn2.blahblahblah.com et supprimer l'entrée DNS de cdn.blahblahblah.com.

En tant que changement de DNS, cela mettrait hors service toutes les personnes qui font actuellement des hotlinks avant que leur trafic n'arrive à proximité de votre serveur : l'entrée DNS ne serait tout simplement pas consultée. Il faudrait modifier régulièrement le CNAME cdn pour que cela soit efficace (disons une fois par mois ?), mais cela fonctionnerait.

Il s'agit en fait d'un problème plus important qu'il n'y paraît, car cela signifie que les gens peuvent copier des copies entières des pages de votre site Web (y compris les images) beaucoup plus facilement - il n'y a donc pas que les images que vous perdez et pas seulement le fait que vous payez pour servir ces images. Les moteurs de recherche concluent parfois que vos pages sont des copies et que les copies sont les originaux... et votre trafic s'envole.

J'envisage d'abandonner Cloudfront au profit d'un serveur dédié ultra-rapide, placé à un endroit stratégique (qui servira tout le contenu au monde entier à partir d'un seul endroit), ce qui me permettra d'avoir un meilleur contrôle sur ce genre de choses.

Quoi qu'il en soit, j'espère que quelqu'un d'autre aura une meilleure réponse !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X