Caricamenti sicuri

Aggiunto nella release di Discourse 2.4 di febbraio, il funzionalità Secure Uploads offre un livello di sicurezza superiore per TUTTI i file caricati (immagini, video, audio, testo, PDF, ZIP e altri) all’interno di un’istanza Discourse.

Prerequisiti

Devi aver abilitato i caricamenti su S3 sul tuo sito, il che richiede di compilare le seguenti impostazioni:

  • S3 access key id
  • S3 secret access key
  • S3 region
  • S3 upload bucket

Devi inoltre utilizzare un bucket S3 che non abbia una policy di bucket pubblica e assicurarti che tutti i file caricati esistente abbiano un ACL S3 di tipo public-read. Consulta la sezione “Abilitazione dei Secure Uploads” di seguito.

Una volta soddisfatti questi prerequisiti, puoi abilitare l’impostazione del sito “secure uploads”.

Abilitazione dei Secure Uploads

:dragon: :warning: ATTENZIONE: PERICOLO :warning: :dragon:

Questa è una funzionalità avanzata e il supporto al di fuori del nostro piano Enterprise sarà al massimo limitato. Abilita i secure uploads solo se sei un utente esperto.


Per abilitare i secure uploads, devi seguire questi passaggi:

  1. Assicurati di aver configurato i caricamenti su S3.
  2. Verifica se il tuo bucket S3 ha una policy di bucket pubblica. Se è così, è necessario un passaggio aggiuntivo (passaggio 4).
  3. Esegui il task rake uploads:sync_s3_acls. Questo garantirà che tutti i tuoi file caricati abbiano l’ACL corretto su S3. Questo è importante; se esegui il passaggio 4 prima di questo, alcuni file potrebbero diventare inaccessibili sul tuo forum.
  4. Rimuovi la policy di bucket pubblica dal tuo bucket se era presente nel passaggio 1.
  5. Abilita l’impostazione del sito “secure uploads”. Opzionalmente, abilita l’impostazione del sito “prevent anons from downloading files” per impedire agli utenti anonimi di scaricare allegati da post pubblici. Da questo momento in poi, tutti i caricamenti potrebbero essere contrassegnati come secure in base alle condizioni riportate di seguito.
  6. Se desideri che tutti i file caricati in precedenza vengano analizzati e potenzialmente contrassegnati come secure, esegui il task rake uploads:secure_upload_analyse_and_update.

:exclamation: Nota sulla policy del bucket S3 :exclamation:

Devi assicurarti che il bucket su cui stai caricando i file non abbia una policy di bucket pubblica. Una policy di bucket pubblica avrà qualcosa di simile a questo:

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

La parte importante qui è che stiamo permettendo a * di ottenere oggetti (GetObject), il che significa che chiunque può scaricare qualsiasi cosa nel bucket. Questa etichetta indicherà anche se la policy è pubblica:

Le impostazioni qui non dovrebbero essere modificate. Nell’immagine è mostrato lo stato ideale per la scheda “Block public access”:

Cosa fa

Una volta abilitati i Secure Uploads, qualsiasi file caricato tramite il Composer verrà contrassegnato come secure o non secure in base ai seguenti criteri:

  • Se hai abilitato l’impostazione del sito “login required”, tutti i caricamenti verranno contrassegnati come secure e gli utenti anonimi non potranno accedervi.
  • Se stai caricando qualcosa all’interno di un Messaggio Privato, verrà contrassegnato come secure.
  • Se stai caricando qualcosa all’interno di un Argomento che si trova in una Categoria privata, verrà contrassegnato come secure.

Il caricamento su S3 avrà un ACL privato, quindi i collegamenti diretti al file su S3 restituiranno un errore 403 “access denied”. Qualsiasi accesso ai secure uploads avverrà tramite un URL firmato di S3. Tuttavia, questo sarà nascosto ai tuoi utenti; se un caricamento è secure, qualsiasi riferimento ad esso verrà effettuato tramite l’URL Discourse /secure-uploads/.

Permessi e controllo degli accessi

L’URL /secure-uploads/ determinerà se l’utente corrente è autorizzato ad accedere al file multimediale e lo servirà se lo è. Quando il caricamento viene creato, il post in cui appare per la prima volta verrà impostato come suo “post di controllo degli accessi” e tutti i permessi saranno basati su quel post.

  • Se hai abilitato l’impostazione del sito “login required”, gli utenti anonimi riceveranno sempre un errore 404 tentando di accedere all’URL.
  • Se si accede a un file multimediale il cui post di controllo degli accessi è un Messaggio Privato, l’utente deve far parte di quell’argomento di Messaggio Privato per accedere al file, altrimenti riceverà un errore 403.
  • Se si accede a un file multimediale il cui post di controllo degli accessi è all’interno di un argomento che si trova in una Categoria privata, l’utente deve avere accesso a quella categoria per accedere al file, altrimenti riceverà un errore 403.

Copiare gli URL /secure-uploads/ tra Post e Argomenti non è consigliabile, poiché diversi utenti avranno diversi livelli di accesso all’interno dei tuoi forum Discourse. I nuovi caricamenti dovrebbero sempre essere creati tramite il Composer. Anche le Onebox e le immagini hotlinked rispetteranno le regole dei secure uploads. Le impostazioni del sito per i caricamenti, gli emoji e i caricamenti dei temi non sono influenzati dai secure uploads, poiché devono essere pubblici.

:warning: Se un post di controllo degli accessi viene eliminato, il caricamento allegato non sarà più accessibile. :warning:

Spostamento di post con secure uploads

Se sposti un “post di controllo degli accessi” tra diversi contesti di sicurezza, il caricamento allegato potrebbe cambiare da secure a non secure o viceversa. Queste sono le situazioni che possono modificare la sicurezza di un caricamento:

  • Cambiare la categoria di un argomento. Verranno esaminati tutti i post nell’argomento e lo stato di sicurezza dei caricamenti verrà aggiornato di conseguenza.
  • Cambiare un argomento da pubblico a messaggio privato o viceversa. Verrà eseguito lo stesso processo sopra.
  • Spostare post da un argomento a un altro argomento esistente o nuovo. Verrà eseguito lo stesso processo sopra sull’argomento di destinazione.

Secure uploads nelle email

L’incorporamento di immagini secure nelle email è abilitato per impostazione predefinita. Puoi configurare le seguenti impostazioni del sito per un controllo maggiore:

  • secure_uploads_allow_embed_images_in_emails: Disabilita questa opzione per oscurare le immagini secure nelle email.
  • secure_uploads_max_email_embed_image_size_kb: Il limite massimo di dimensione dell’immagine secure che verrà incorporata, predefinito a 1 MB, per evitare che l’email diventi troppo grande. Il massimo è 10 MB. Funziona in tandem con email_total_attachment_size_limit_kb.

Le immagini secure verranno aggiunte come allegati email e incorporate utilizzando il formato URL cid:, poiché il supporto degli URL base64 nei client di posta elettronica è ancora instabile.

Se non hai abilitato secure_uploads_allow_embed_images_in_emails o se le immagini superano i limiti di dimensione, ecco cosa vedrai al posto delle immagini secure (anche audio e video secure che non vengono incorporati):

image

Client Ospitati

Al momento, i secure uploads sono disponibili solo per i clienti del piano Enterprise. Contattaci per ulteriori dettagli.

51 Mi Piace
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 Mi Piace

The security was never intended to cover avatars, this is not a use case we planned for

13 Mi Piace

Advisory: Setting the S3 bucket to “Block all public access” is not correct

@genachka @AntiMetaman @Hugh_Roberts @znedw @Thamer

I am going to amend the OP. After talking with our infrastructure team member @schleifer I confirmed that I was incorrect to advise that the “Block all public access” setting should be enabled. Turn this off for your S3 bucket and then run uploads:sync_s3_acls to ensure the ACLs are correct and then try again with the custom avatars.

An additional thing that everyone needs to make sure is that the bucket you are uploading to does not have a Public bucket policy. A public bucket policy will have something like this:

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

The important part here is that we are Allowing * to GetObject, which is saying let anyone download anything in the bucket. This label will also show if the policy is Public:

image

My apologies for this. @AntiMetaman neither @schleifer or I could reproduce this error:

It would be helpful if you could provide more information about your S3/AWS setup.

7 Mi Piace

@martin Thanks. My issue wasn’t that error but anons unable to access the page. If I set the upload bucket to private, then I dont have that error anymore and I can upload. I don’t have login as required on my site.

I never had the “Block all public access” enabled for my bucket settings in the first place. If you are telling me that anons should still be able to access a topic, read it, and view secure images - then I can try this again. If adding security to media prevents anons from seeing those images, then I’d rather just secure attachments only.

If it helps, I am using BackBlaze B2 with BunnyCDN. My upload bucket settings are currently public:

4 Mi Piace

This is the gist of it yes. Anything that needs to be private will have a private ACL set and is inaccessible unless a presigned URL is used. Note that the bucket policy is not Public. And yes all those “Block public access” settings should be unchecked. If you are interested in how we determine whether an upload is secure all of the rules are here discourse/lib/upload_security.rb at main · discourse/discourse · GitHub and here discourse/app/models/post.rb at main · discourse/discourse · GitHub

I am not familiar with BackBlaze sorry. I am not sure how the settings shown would translate to a bucket policy. Basically you do not want Public as the bucket policy, and you do not want to turn on “Block all public access”. That way we can set private and public ACLs appropriately. If you do not have login required then any upload made in a topic that is not in a PM or private category should be public and accessible by anons. The images should not be secure in a topic accessible by anons.

5 Mi Piace

The secure media implementation is not compatible with Backblaze. Do they support pre-signed URLs?

1 Mi Piace

@riking

Yes, pre-signed URLs are supported: Does the B2 S3 Compatible API support Pre-Signed URLs? – Backblaze Help

@martin

Yes, changing the bucket from public to private does this. I did this and it allowed me to upload, but as an anon I couldn’t view topics.

4 Mi Piace

@martin thanks for the clarification. And I can confirm that with leaving the setting on the S3 as in my screenshot as Public and everything unchecked (and suggested by you) that the custom avatars / profile images are finally working while the topic secured uploads remain working as well. Thank you!

4 Mi Piace

I merged this PR this week and I am adding these details to the OP:


If you want to allow embedding secure images in emails you can configure these site settings:

  • secure_media_allow_embed_images_in_emails : If enabled we will embed secure images in emails instead of redacting them.
  • secure_media_max_email_embed_image_size_kb : The cap to the size of the secure image we will embed, defaulting to 1mb, so the email does not become too big. Max is 10mb. Works in tandem with email_total_attachment_size_limit_kb .

The secure images will be added as email attachments and embedded using the cid: url format because base64 URL support in email clients is still flaky.

If you don’t have secure_media_allow_embed_images_in_emails enabled, or if the images start to exceed the size limits, then this is what you will see in place of secure images (also secure audio and video which is not embedded):

image

10 Mi Piace

Further addendum to my previous post; from this PR:

We now enable secure media image embedding by default.

5 Mi Piace

After setting up secure media uploads (following the OP guide) everything works well (attachments, images…) except uploads that are not topic attachments (like site logo, profile avatar) those raise “Access Denied” pop up in Discourse.
Did i mess up some setting?

Please read the topic, your issue is addressed a few posts above this one.

3 Mi Piace

I read everything carefully. Please let me know what exactly you mean by few posts above. I don’t see this issue.
Edit:
Trying to read between the lines here, i see that this thread used to be longer but some key replies were deleted from it, i see references to replies that don’t exist and mentions of screenshots that don’t appear in the thread.
If I understand correctly though, the recommendation is to set S3 bucket to NOT block any public access at all. I just want to confirm that, and ask if it is safe?

1 Mi Piace

Correct.

The original post is indeed gone but the problem and solution are still there

6 Mi Piace

I noticed a bug with using secure media and Knowledge Base Plugin
Links to attachments in the knowledge base fail to open (redirect to 404 page) unless forced to be opened in a new window.
The extra weird thing is that the very same attachment can be opened without issue from the Discourse topic associated with the knowledge base item.

Edit:
The same bug happens when someone is copying a link to an attachment from one reply to another. the link is the exact same one naturally, but it only works from the original reply, unless forced to be opened in a new window.

1 Mi Piace

What about secure media if s3 is not used?
Currently it looks like that, if you have the direct link to the uploaded file, you can download that file without login. Which is like a security issue then…

Secure media requires s3.
This entire feature was developed to make it impossible to share and access direct links.

11 Mi Piace

This is an excellent feature. Thank you for developing it. Minio, a free drop-in replacement for S3, has no support for ACLs and never will. Their argument, which is a good one, is that ACL are not a useful feature and negatively affect performance because they require a second write operation. Secure media uploads will work with Discourse - the uploads:secure_upload_analyse_and_update task will error out on the final step but it seems you can ignore it. That said, is there any reason for Discourse to make ACL calls at all?

3 Mi Piace

Yes, because the S3 bucket is private based on the setup in the OP, any non-secure uploads need to have their ACL set to public, and secure uploads will have a private ACL so the S3 URL can be accessed directly. I do not think we have plans at this time to modify how this works; I think there would be quite a bit of work involved to avoid using ACLs altogether for S3 replacements.

7 Mi Piace