Téléversements Sécurisés

Ajouté dans la version 2.4 de Discourse en février, la fonctionnalité Téléchargements Sécurisés offre un niveau de sécurité accru pour TOUS les fichiers téléchargés (images, vidéos, audio, texte, PDF, ZIP, etc.) au sein d’une instance Discourse.

Prérequis

Vous devez avoir activé les téléchargements S3 sur votre site, ce qui nécessite de remplir les paramètres suivants :

  • Clé d’accès S3 (S3 access key id)
  • Clé secrète d’accès S3 (S3 secret access key)
  • Région S3
  • Bac de téléchargement S3 (S3 upload bucket)

Vous devez également utiliser un bac S3 qui ne possède pas de politique de bac publique, et vous devez vous assurer que tous les téléchargements existants ont une ACL S3 de type public-read. Consultez la section « Activation des téléchargements sécurisés » ci-dessous.

Une fois ces prérequis satisfaits, vous pouvez activer le paramètre de site « téléchargements sécurisés ».

Activation des téléchargements sécurisés

:dragon: :warning: ICÔNE DE DRAGON : ATTENTION AUX DANGERS :warning: :dragon:

Il s’agit d’une fonctionnalité avancée et le support en dehors de notre offre Entreprise sera très limité. N’activez les téléchargements sécurisés que si vous êtes un utilisateur expert.


Pour activer les téléchargements sécurisés, vous devez suivre ces étapes :

  1. Assurez-vous que les téléchargements S3 sont configurés.
  2. Notez si votre bac S3 possède une politique de bac publique. Si c’est le cas, une étape supplémentaire est requise (étape 4).
  3. Exécutez la tâche rake uploads:sync_s3_acls. Cela garantira que tous vos téléchargements ont la bonne ACL dans S3. C’est important ; si vous effectuez l’étape 4 avant celle-ci, certains téléchargements pourraient devenir inaccessibles sur votre forum.
  4. Supprimez la politique de bac publique de votre bac si elle était présente à l’étape 1.
  5. Activez le paramètre de site « téléchargements sécurisés ». Activez optionnellement le paramètre de site « empêcher les anonymes de télécharger des fichiers » pour empêcher les utilisateurs anonymes de télécharger des pièces jointes à partir de publications publiques. Tous les téléchargements effectués à partir de maintenant pourraient être marqués comme sécurisés selon les conditions ci-dessous.
  6. Si vous souhaitez que tous les téléchargements soient rétrospectivement analysés et éventuellement marqués comme sécurisés, exécutez la tâche rake uploads:secure_upload_analyse_and_update.

:exclamation: Note sur la politique de bac S3 :exclamation:

Vous devez vous assurer que le bac vers lequel vous téléchargez ne possède pas de politique de bac publique. Une politique de bac publique ressemblera à ceci :

{
    "Version": "2012-10-17",
    "Id": "ComputedBucketPolicy",
    "Statement": [
        {
            "Sid": "AllowWorldRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
    ]
}

La partie importante ici est que nous autorisons * à obtenir l’objet (GetObject), ce qui signifie que n’importe qui peut télécharger n’importe quoi dans le bac. Cette étiquette indiquera également si la politique est publique :

Les paramètres ici ne doivent pas être modifiés. L’image ci-dessous montre l’état idéal pour l’onglet « Bloquer l’accès public » :

Ce que cela fait

Une fois que vous avez activé les téléchargements sécurisés, tout fichier téléchargé via le compositeur sera marqué comme sécurisé ou non sécurisé selon les critères suivants :

  • Si vous avez activé le paramètre de site « connexion requise », tous les téléchargements seront marqués comme sécurisés, et les utilisateurs anonymes ne pourront pas y accéder.
  • Si vous téléchargez quelque chose dans un message privé, il sera marqué comme sécurisé.
  • Si vous téléchargez quelque chose dans un sujet situé dans une catégorie privée, il sera marqué comme sécurisé.

Le téléchargement sur S3 aura une ACL privée, de sorte que les liens directs vers le fichier sur S3 renverront une erreur 403 accès refusé. Tout accès aux téléchargements sécurisés se fera via une URL signée S3. Cela sera cependant caché à vos utilisateurs ; si un téléchargement est sécurisé, toute référence à celui-ci sera faite via l’URL Discourse /secure-uploads/.

Permissions et contrôle d’accès

L’URL /secure-uploads/ déterminera si l’utilisateur actuel est autorisé à accéder au média et le servira s’il l’est. Lors de la création du téléchargement, la publication dans laquelle il apparaît en premier sera définie comme sa « publication de contrôle d’accès » et toutes les permissions seront basées sur cette publication.

  • Si vous avez activé le paramètre de site « connexion requise », les utilisateurs anonymes recevront toujours une erreur 404 en accédant à l’URL.
  • Si vous accédez à un média dont la publication de contrôle d’accès est un message privé, l’utilisateur doit faire partie de ce sujet de message privé pour accéder au média, sinon l’utilisateur recevra une erreur 403.
  • Si vous accédez à un média dont la publication de contrôle d’accès est dans un sujet situé dans une catégorie privée, l’utilisateur doit avoir accès à cette catégorie pour accéder au média, sinon l’utilisateur recevra une erreur 403.

Copier les URL /secure-uploads/ entre des publications et des sujets est imprudent, car différents utilisateurs auront différents niveaux d’accès au sein de vos forums Discourse. Les nouveaux téléchargements doivent toujours être créés via le compositeur. Les Oneboxes et les images liées directement respecteront également les règles des téléchargements sécurisés. Les paramètres de site, les émojis et les téléchargements de thèmes sont non affectés par les téléchargements sécurisés, car ils doivent être publics.

:warning: Si une publication de contrôle d’accès est supprimée, le téléchargement attaché ne sera plus accessible. :warning:

Déplacement de publications avec des téléchargements sécurisés

Si vous déplacez une « publication de contrôle d’accès » entre différents contextes de sécurité, le téléchargement attaché peut éventuellement être changé en sécurisé ou non sécurisé. Voici les situations qui peuvent modifier la sécurité d’un téléchargement :

  • Changer la catégorie d’un sujet. Cela parcourra tous les sujets du sujet et mettra à jour l’état de sécurité des téléchargements en conséquence.
  • Changer un sujet entre un sujet public et un message privé. Cela fera la même chose que ci-dessus.
  • Déplacer des publications d’un sujet vers un autre sujet nouveau ou existant. Cela exécutera la même opération que ci-dessus sur le sujet cible.

Téléchargements sécurisés dans les e-mails

L’intégration d’images sécurisées dans les e-mails est activée par défaut. Vous pouvez configurer ces paramètres de site pour un contrôle plus poussé :

  • secure_uploads_allow_embed_images_in_emails : Désactivez ceci pour censurer les images sécurisées dans les e-mails.
  • secure_uploads_max_email_embed_image_size_kb : La limite de taille de l’image sécurisée que nous intégrerons, par défaut 1 Mo, afin que l’e-mail ne devienne pas trop volumineux. Le maximum est de 10 Mo. Fonctionne de concert avec email_total_attachment_size_limit_kb.

Les images sécurisées seront ajoutées en tant que pièces jointes aux e-mails et intégrées en utilisant le format d’URL cid: car le support des URL base64 dans les clients de messagerie est encore instable.

Si vous n’avez pas activé secure_uploads_allow_embed_images_in_emails, ou si les images commencent à dépasser les limites de taille, voici ce que vous verrez à la place des images sécurisées (également pour l’audio et la vidéo sécurisés qui ne sont pas intégrés) :

image

Clients hébergés

Pour le moment, les téléchargements sécurisés sont disponibles uniquement pour nos clients de l’offre Entreprise. Veuillez nous contacter pour plus de détails.

51 « J'aime »
Files/Download Manager For Discourse
Prevent guests from watching images
Register to download
Need log the who downloaded attachments
S3 Bucket objects restricted access policy as per Discourses groups
Signed Google Cloud CDN URLs
Search engines and private messages?
How to make uploads available only to logged-in users
S3 Object Storage for uploads- possible to make private? (and CDN question)
Discourse jumps back 20 posts in post history when navigating to new topic
Discourse jumps back 20 posts in post history when navigating to new topic
Why run UpdatePostUploadsSecureStatus even when secure uploads is disabled?
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
Understanding Uploads, Images, and Attachments
Capacity planning / Resource requirements
Can't always select any category in composer
How the media in the posts look like when secure uploads are enabled?
S3 Object Storage for uploads- possible to make private? (and CDN question)
Personal Message attachments accessible to unauthenticated users (missing auth check)
Potential Directory Traversal: /uploads/* allows cross-directory file access
S3 Storage with no Public access
Are the images published in the Staff category publicly visible?
Login Only - Does it actually stop all traffic access without login?
为啥我的七牛云s3附件上传成功后,论坛中无法加载出来?
Why you should use Discourse internally for your company/team instead of Slack (4 years use case)
Remove images from emailed reply to forum
Files/Download Manager For Discourse
Topic replies invisible until topic owner decides to reveal them?
Securing private group/category resources
PDF embedding and reading help
Inline PDF Previews
Upload objects to private S3 is not working
Spammers using uploaded images in spam e-mails. Any advice how to resolve?
Secure Media Uploads breaks Category Logos
How to allow downloading images along with other user data (csv) from activity section?
Discourse 2.6.0.beta3 Release Notes
Lock Downloads in discourse
What’s the suggested method to use secure images?
Page Publishing
Errors on Exporting Data from Teams to Self Hosted Discourse on Digital Ocean

There should probably be a lot of warnings around this feature @martin as it is an :warning: ADVANCED thing, not for the faint of :heart:, and there is a limit to how much we will support it outside our enterprise tier. Bring your own expertise…

9 « J'aime »

La sécurité n’a jamais été conçue pour couvrir les avatars ; ce n’est pas un cas d’usage que nous avions prévu.

13 « J'aime »

Avis : Définir le bucket S3 sur « Bloquer tout accès public » n’est pas correct

@genachka @AntiMetaman @Hugh_Roberts @znedw @Thamer

Je vais modifier le premier message. Après avoir discuté avec @schleifer, membre de notre équipe infrastructure, j’ai confirmé que je me trompais en conseillant d’activer le paramètre « Bloquer tout accès public ». Désactivez cette option pour votre bucket S3, puis exécutez uploads:sync_s3_acls pour vous assurer que les ACL sont correctes, et réessayez ensuite avec les avatars personnalisés.

Une autre chose que chacun doit vérifier est que le bucket vers lequel vous uploadez ne possède pas de politique de bucket publique. Une politique de bucket publique contiendra quelque chose comme ceci :

{
    "Version": "2012-10-17",
    "Id": "ComputedBucketPolicy",
    "Statement": [
        {
            "Sid": "AllowWorldRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
    ]
}

L’élément important ici est que nous autorisons * à effectuer GetObject, ce qui signifie permettre à n’importe qui de télécharger n’importe quoi dans le bucket. Cette étiquette indiquera également si la politique est publique :

Mes excuses pour cela. @AntiMetaman, ni @schleifer ni moi n’avons pu reproduire cette erreur :

Il serait utile si vous pouviez fournir plus d’informations sur votre configuration S3/AWS.

7 « J'aime »

@martin Merci. Mon problème ne venait pas de cette erreur, mais du fait que les anonymes ne pouvaient pas accéder à la page. Si je définis le bucket d’upload comme privé, cette erreur disparaît et je peux effectuer des uploads. Je n’ai pas activé l’option « Connexion requise » sur mon site.

Je n’avais jamais activé l’option « Bloquer tout accès public » dans les paramètres de mon bucket au départ. Si vous me dites que les anonymes devraient quand même pouvoir accéder à un sujet, le lire et voir les images sécurisées, alors je peux réessayer. Si l’ajout de sécurité aux médias empêche les anonymes de voir ces images, je préfère alors sécuriser uniquement les pièces jointes.

Si cela aide, j’utilise BackBlaze B2 avec BunnyCDN. Mes paramètres de bucket d’upload sont actuellement publics :

4 « J'aime »

C’est bien cela, oui. Tout ce qui doit rester privé aura une ACL privée définie et sera inaccessible sauf si une URL signée est utilisée. Notez que la politique du bucket n’est pas publique. Et oui, tous les paramètres de type « Bloquer l’accès public » doivent être décochés. Si vous souhaitez comprendre comment nous déterminons si un téléchargement est sécurisé, toutes les règles se trouvent ici : discourse/lib/upload_security.rb at main · discourse/discourse · GitHub et ici : discourse/app/models/post.rb at main · discourse/discourse · GitHub

Je ne connais pas bien BackBlaze, désolé. Je ne suis pas certain de savoir comment les paramètres affichés se traduisent en politique de bucket. Fondamentalement, vous ne voulez pas que la politique du bucket soit « Public », et vous ne voulez pas activer « Bloquer tout accès public ». De cette façon, nous pouvons définir correctement les ACL privées et publiques. Si vous n’avez pas l’option « Connexion requise » activée, alors tout téléchargement effectué dans un sujet qui n’est pas dans un MP ou une catégorie privée doit être public et accessible par les anonymes. Les images ne doivent pas être sécurisées dans un sujet accessible par les anonymes.

5 « J'aime »

L’implémentation des médias sécurisés n’est pas compatible avec Backblaze. Prend-elle en charge les URL signées préliminairement ?

1 « J'aime »

@riking

Oui, les URL pré-signées sont prises en charge : https://help.backblaze.com/hc/en-us/articles/360047815993-Does-the-B2-S3-Compatible-API-support-Pre-Signed-URLs-

@martin

Oui, passer un bucket de public à privé fait cela. Je l’ai fait et cela m’a permis de télécharger, mais en tant qu’anonyme, je ne pouvais pas voir les sujets.

4 « J'aime »

@martin merci pour les précisions. Je peux confirmer qu’en laissant le paramètre S3 comme sur ma capture d’écran (Public et toutes les cases décochées, comme tu l’as suggéré), les avatars personnalisés et les images de profil fonctionnent enfin, tout en conservant le bon fonctionnement des téléchargements sécurisés pour les sujets. Merci !

4 « J'aime »

J’ai fusionné cette PR cette semaine et j’ajoute ces détails à l’OP :


Si vous souhaitez autoriser l’intégration d’images sécurisées dans les e-mails, vous pouvez configurer les paramètres du site suivants :

  • secure_media_allow_embed_images_in_emails : Si activé, nous intégrerons des images sécurisées dans les e-mails au lieu de les censurer.
  • secure_media_max_email_embed_image_size_kb : La limite de taille pour l’image sécurisée intégrée, par défaut 1 Mo, afin que l’e-mail ne devienne pas trop volumineux. La limite maximale est de 10 Mo. Fonctionne en tandem avec email_total_attachment_size_limit_kb.

Les images sécurisées seront ajoutées en tant que pièces jointes aux e-mails et intégrées en utilisant le format d’URL cid:, car la prise en charge des URLs en base64 dans les clients de messagerie reste encore instable.

Si vous n’avez pas activé secure_media_allow_embed_images_in_emails, ou si les images dépassent les limites de taille, voici ce que vous verrez à la place des images sécurisées (ainsi que pour les audio et vidéos sécurisés qui ne sont pas intégrés) :

image

10 « J'aime »

Ajout supplémentaire à mon message précédent ; à partir de cette PR :

Nous activons désormais par défaut l’intégration sécurisée des images multimédias.

5 « J'aime »

Après avoir configuré les téléchargements de médias sécurisés (en suivant le guide du sujet original), tout fonctionne bien (pièces jointes, images, etc.), sauf les téléchargements qui ne sont pas des pièces jointes de sujet (comme le logo du site ou l’avatar du profil), qui déclenchent une fenêtre contextuelle « Accès refusé » dans Discourse.
Ai-je mal configuré quelque chose ?

Veuillez lire le sujet, votre problème a été abordé dans quelques messages au-dessus de celui-ci.

3 « J'aime »

J’ai tout lu attentivement. Veuillez me préciser ce que vous entendez exactement par les quelques messages ci-dessus. Je ne vois pas ce problème.
Édition :
En essayant de lire entre les lignes, je constate que ce fil de discussion était autrefois plus long, mais que certaines réponses clés ont été supprimées. Je vois des références à des réponses qui n’existent plus et des mentions de captures d’écran qui n’apparaissent pas dans le fil.
Cependant, si j’ai bien compris, la recommandation est de configurer le bucket S3 pour qu’il ne bloque aucun accès public. Je souhaite simplement confirmer cela et demander si c’est sécurisé ?

1 « J'aime »

C’est exact.

Le message d’origine a bien disparu, mais le problème et la solution sont toujours là.

6 « J'aime »

J’ai remarqué un bug lors de l’utilisation de médias sécurisés et https://meta.discourse.org/t/knowledge-base-plugin/115288. Les liens vers les pièces jointes dans la base de connaissances échouent à s’ouvrir (redirection vers une page 404), sauf si on les force à s’ouvrir dans une nouvelle fenêtre.

L’étrangeté supplémentaire est que la même pièce jointe peut être ouverte sans problème depuis le sujet Discourse associé à l’élément de la base de connaissances.

Édition : Le même bug se produit lorsqu’une personne copie un lien vers une pièce jointe d’une réponse à une autre. Le lien est exactement le même, bien sûr, mais il ne fonctionne que depuis la réponse d’origine, sauf si on le force à s’ouvrir dans une nouvelle fenêtre.

1 « J'aime »

Que se passe-t-il pour les médias sécurisés si S3 n’est pas utilisé ?

Actuellement, il semble que si vous disposez du lien direct vers le fichier téléchargé, vous puissiez le télécharger sans vous connecter. Cela constitue donc un problème de sécurité…

Les médias sécurisés nécessitent S3.
Cette fonctionnalité a été entièrement développée pour rendre impossible le partage et l’accès via des liens directs.

11 « J'aime »

C’est une excellente fonctionnalité. Merci de l’avoir développée. Minio, un remplacement gratuit et direct pour S3, ne prend pas en charge les ACL et ne le fera jamais. Leur argument, qui est pertinent, est que les ACL ne sont pas une fonctionnalité utile et affectent négativement les performances car elles nécessitent une seconde opération d’écriture. Les téléversements de médias sécurisés fonctionneront avec Discourse — la tâche uploads:secure_upload_analyse_and_update échouera à l’étape finale, mais il semble que vous puissiez l’ignorer. Cela dit, y a-t-il une raison pour que Discourse effectue des appels ACL ?

3 « J'aime »

Oui, car le bucket S3 est privé selon la configuration du sujet original, tout téléchargement non sécurisé doit avoir son ACL défini sur public, et les téléchargements sécurisés auront un ACL privé afin que l’URL S3 puisse être accédée directement. Je ne pense pas que nous ayons actuellement des plans pour modifier le fonctionnement de ceci ; je pense qu’il y aurait beaucoup de travail à faire pour éviter d’utiliser les ACLs pour les remplacements S3.

7 « J'aime »