Protection contre le Hot-Linking de Avatar Proxy et CDN

Mon site Discourse contient beaucoup d’images. En raison du grand nombre d’images, j’utilise une combinaison S3/CDN pour stocker et servir les images. Au sein du CDN, j’utilise diverses mesures pour empêcher le détournement d’images. L’une des mesures consiste à arrêter tout accès direct aux images et à n’autoriser l’accès qu’à partir d’une liste d’hôtes définie.

Discourse fonctionne avec cette configuration, à l’exception des avatars. Les avatars cessent de fonctionner lorsque la protection contre le hotlinking est activée.

La raison est que Discourse utilise une configuration de proxy pour les avatars. Le HTML utilise un lien proxy pour les avatars. La structure du lien est https://discourse.forum/user_avatar/discourse.forums/username/24/616_2.png.
Une fois le proxy résolu, le navigateur demande un accès direct au fichier image.

Mon CDN empêche l’accès direct avec un 403 lors de cette requête directe. Et tous les avatars personnalisés deviennent des silhouettes.

Quelles options avons-nous pour supprimer le proxy ?
Pouvons-nous modifier l’avatar pour une structure de fichier image standard ?

Ne pouvez-vous pas ajouter votre adresse IP Discourse à la liste blanche ?

Le lien d’accès direct provient de l’adresse IP de l’utilisateur. Le serveur résout les informations, mais le navigateur local effectue l’appel.

Je ne suis pas sûr que cela fonctionne ainsi. Selon votre configuration, le proxy agit réellement comme un proxy ou la CDN passe en premier. Pouvez-vous expliquer comment cela est configuré ?

Je déteste les questions vagues. À quoi pensiez-vous en demandant « cela » ?

Voici mes paramètres actuels :

Configuration de Discourse :

  • Installation standard dans un conteneur unique
  • Configuration en tant que sous-domaine : forums.domain.tld
  • Configuration S3 standard pour les téléchargements
  • Les téléchargements sont enregistrés sur S3

Configuration S3 :

  • Digital Ocean S3 Bucket
  • Bucket activé pour l’accès externe
  • Aucune autre couche de sécurité ou autorisation

Configuration CDN :

  • bunny CDN
  • Référents autorisés configurés : domain.tld et *.domain.tld
  • Le paramètre qui a bloqué l’accès aux avatars était « Bloquer l’accès direct aux fichiers URL ».

Lorsqu’il est activé, tous les avatars reçoivent une erreur 403. Lorsqu’il est désactivé, les avatars s’affichent.

Images non-avatars :

  • URL dans Discourse : https://cdn.domain.tld/optimized/3X/3/1/filename_#_size.jpeg

Images avatars :

  • URL dans Discourse : https://forums.domain.tld/user_avatar/forums.domain.tld/mazzini/48/776_2.png

Un post précédent, Comment les avatars sont-ils stockés et accédés ?, indique que Discourse utilise un proxy pour les avatars. Par conséquent, la structure d’URL pour les avatars n’est pas une structure d’URL d’image standard.

Dans mon système, les avatars sont disponibles soit depuis S3, soit depuis le CDN. Cela indique qu’à un endroit ou d’une manière ou d’une autre, l’URL de l’avatar est convertie en une URL CDN.

Lorsque cela se produit, le CDN considère l’URL comme un lien d’accès direct et bloque l’accès avec un 403.

J’espère avoir répondu à la question « cela » ?

Et je déteste quand les gens répondent comme ça alors que je passe mon temps à les aider, donc ça fait match nul :wink:.

Oui, et « proxy » signifie que la requête passe par Discourse. La requête n’est pas faite par le navigateur vers le CDN, mais par Discourse.

Avez-vous configuré le CDN comme un CDN de site complet ou comme le CDN S3 ? Je soupçonne le second cas. Et dans ce cas, la requête est faite par Discourse au CDN, sans referrer. Mais le CDN peut toujours reconnaître qu’il s’agit d’une requête légitime car la requête provient de l’IP de Discourse. D’où mon conseil de la mettre sur liste blanche.

Edit : vous pourriez vérifier en désactivant la protection pendant un court instant et en consultant les journaux de Bunny, et voir de quelle IP ils proviennent.

J’apprécie votre aide. Après plusieurs décennies de travail dans le développement et le support informatique, les questions et réponses vagues créent plus de travail que nécessaire. D’après votre expérience, je pense que vous seriez d’accord.

Le CDN est uniquement configuré pour le compartiment S3.

J’ai vérifié les journaux du CDN pour l’adresse IP de Discourse liée aux erreurs 403 avant de soumettre le sujet original. Elle ne figurait pas dans les fichiers journaux.

D’après vos commentaires, je suis retourné et j’ai réanalysé les journaux. Après avoir examiné les principaux responsables IP, j’ai constaté que les deux premiers sont des passerelles pour la société d’hébergement.

Le défi est que je ne veux pas garder une trace des adresses IP des passerelles de Digital Ocean pour que mon serveur Discourse puisse afficher correctement les images.

Merci pour votre aide.