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

La sicurezza non era mai stata pensata per coprire gli avatar; non si tratta di un caso d’uso che avevamo previsto.

13 Mi Piace

Avviso: Impostare il bucket S3 su “Blocca tutto l’accesso pubblico” non è corretto

@genachka @AntiMetaman @Hugh_Roberts @znedw @Thamer

Sto per modificare l’OP. Dopo aver parlato con @schleifer, membro del nostro team di infrastruttura, ho confermato che avevo sbagliato a consigliare di abilitare l’impostazione “Blocca tutto l’accesso pubblico”. Disattiva questa impostazione per il tuo bucket S3, quindi esegui uploads:sync_s3_acls per assicurarti che gli ACL siano corretti e riprova con gli avatar personalizzati.

Un’altra cosa che tutti devono verificare è che il bucket su cui stai caricando i file non abbia una policy del bucket pubblica. Una policy del bucket pubblica sarà simile a questa:

{
    "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 consentendo a * di eseguire GetObject, il che significa permettere a chiunque di scaricare qualsiasi cosa nel bucket. Questo etichetta apparirà anche se la policy è pubblica:

Mi scuso per questo. @AntiMetaman, né @schleifer né io siamo riusciti a riprodurre questo errore:

Sarebbe utile se potessi fornire maggiori informazioni sulla tua configurazione S3/AWS.

7 Mi Piace

@martin Grazie. Il mio problema non era quell’errore, ma il fatto che gli anonimi non riuscissero ad accedere alla pagina. Se imposto il bucket di caricamento su privato, quell’errore non si presenta più e posso caricare. Sul mio sito non ho l’opzione “Login richiesto” attiva.

Non avevo mai abilitato l’opzione “Blocca tutti gli accessi pubblici” nelle impostazioni del mio bucket. Se mi stai dicendo che gli anonimi dovrebbero comunque poter accedere a un argomento, leggerlo e visualizzare le immagini protette, allora posso riprovare. Se l’aggiunta di sicurezza ai media impedisce agli anonimi di vedere quelle immagini, preferisco proteggere solo gli allegati.

Se può essere d’aiuto, sto utilizzando BackBlaze B2 con BunnyCDN. Le impostazioni del mio bucket di caricamento sono attualmente pubbliche:

4 Mi Piace

È proprio questo il succo delle cose. Qualsiasi cosa che debba essere privata avrà un ACL privato impostato e sarà inaccessibile a meno che non venga utilizzata un’URL firmata. Nota che la policy del bucket non è pubblica. E sì, tutte quelle impostazioni “Blocca accesso pubblico” dovrebbero essere deselezionate. Se sei interessato a capire come determiniamo se un caricamento è sicuro, tutte le regole sono qui discourse/lib/upload_security.rb at main · discourse/discourse · GitHub e qui discourse/app/models/post.rb at main · discourse/discourse · GitHub

Non sono familiare con BackBlaze, scusa. Non sono sicuro di come le impostazioni mostrate si traducano in una policy del bucket. Fondamentalmente, non vuoi che la policy del bucket sia Pubblica e non vuoi attivare “Blocca tutto l’accesso pubblico”. In questo modo possiamo impostare correttamente ACL private e pubbliche. Se non hai l’accesso che richiede il login, qualsiasi caricamento effettuato in un topic che non è in una PM o in una categoria privata dovrebbe essere pubblico e accessibile agli anonimi. Le immagini non dovrebbero essere sicure in un topic accessibile agli anonimi.

5 Mi Piace

L’implementazione dei media sicuri non è compatibile con Backblaze. Supportano gli URL firmati in anticipo?

1 Mi Piace

@riking

Sì, gli URL pre-firmati sono supportati: https://help.backblaze.com/hc/en-us/articles/360047815993-Does-the-B2-S3-Compatible-API-support-Pre-Signed-URLs-

@martin

Sì, cambiare il bucket da pubblico a privato fa esattamente questo. L’ho fatto e mi ha permesso di caricare, ma come anonimo non potevo visualizzare gli argomenti.

4 Mi Piace

@martin grazie per il chiarimento. Posso confermare che, lasciando l’impostazione S3 come mostrato nel mio screenshot (Pubblica) e con tutte le caselle deselezionate (come da tua indicazione), le avatar personalizzate e le immagini del profilo funzionano finalmente correttamente, mentre i caricamenti protetti nei topic continuano a funzionare. Grazie!

4 Mi Piace

Ho unito questa PR questa settimana e sto aggiungendo questi dettagli all’OP:


Se desideri consentire l’inserimento di immagini sicure nelle e-mail, puoi configurare le seguenti impostazioni del sito:

  • secure_media_allow_embed_images_in_emails: Se abilitato, le immagini sicure verranno inserite nelle e-mail invece di essere oscurate.
  • secure_media_max_email_embed_image_size_kb: Il limite massimo di dimensione per le immagini sicure da inserire, con un valore predefinito di 1 MB, per evitare che l’e-mail diventi troppo grande. Il massimo è 10 MB. Funziona in combinazione con email_total_attachment_size_limit_kb.

Le immagini sicure verranno aggiunte come allegati alle e-mail e inserite utilizzando il formato URL cid:, poiché il supporto per gli URL base64 nei client di posta è ancora instabile.

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

image

10 Mi Piace

Ulteriore addendum al mio post precedente; da questa PR:

Ora abilitiamo di default l’incorporamento sicuro delle immagini multimediali.

5 Mi Piace

Dopo aver configurato il caricamento sicuro dei media (seguendo la guida dell’OP), tutto funziona correttamente (allegati, immagini, ecc.), tranne i caricamenti che non sono allegati ai topic (come il logo del sito o l’avatar del profilo), che generano un popup “Accesso negato” in Discourse.
Ho sbagliato qualche impostazione?

Per favore, leggi l’argomento: il tuo problema è stato affrontato in alcuni post precedenti a questo.

3 Mi Piace

Ho letto tutto con attenzione. Per favore, fammi sapere esattamente cosa intendi con i pochi post precedenti. Non vedo questo problema.
Modifica:
Cercando di leggere tra le righe, vedo che questo thread era più lungo in passato, ma alcune risposte chiave sono state cancellate; vedo riferimenti a risposte che non esistono e menzioni di screenshot che non appaiono nel thread.
Se ho capito correttamente, la raccomandazione è di impostare il bucket S3 in modo che NON blocchi affatto l’accesso pubblico. Voglio solo confermare questo e chiedere se è sicuro?

1 Mi Piace

Corretto.

Il post originale è effettivamente scomparso, ma il problema e la soluzione sono ancora presenti

6 Mi Piace

Ho notato un bug relativo all’uso dei media sicuri e https://meta.discourse.org/t/knowledge-base-plugin/115288
I collegamenti agli allegati nella knowledge base non si aprono (reindirizzano a una pagina 404) a meno che non si forzi l’apertura in una nuova finestra.
La cosa ancora più strana è che lo stesso allegato può essere aperto senza problemi dal topic Discourse associato all’elemento della knowledge base.

Modifica:
Lo stesso bug si verifica quando qualcuno copia un collegamento a un allegato da una risposta a un’altra. Il collegamento è naturalmente identico, ma funziona solo dalla risposta originale, a meno che non si forzi l’apertura in una nuova finestra.

1 Mi Piace

E cosa succede con i media sicuri se non si utilizza S3? Attualmente sembra che, se si dispone del link diretto al file caricato, sia possibile scaricare tale file senza effettuare l’accesso. Questo rappresenta un problema di sicurezza…

I media sicuri richiedono S3.
Questa intera funzionalità è stata sviluppata per rendere impossibile condividere e accedere a link diretti.

11 Mi Piace

Questa è un’ottima funzionalità. Grazie per averla sviluppata. Minio, un sostituto gratuito e compatibile di S3, non supporta gli ACL e non li supporterà mai. La loro argomentazione, che è valida, è che gli ACL non sono una funzionalità utile e influenzano negativamente le prestazioni perché richiedono una seconda operazione di scrittura. Il caricamento sicuro dei file multimediali funzionerà con Discourse: il task uploads:secure_upload_analyse_and_update genererà un errore nell’ultimo passaggio, ma sembra che sia possibile ignorarlo. Detto questo, c’è qualche motivo per cui Discourse dovrebbe effettuare chiamate ACL?

3 Mi Piace

Sì, perché il bucket S3 è privato in base alla configurazione dell’OP, tutti gli upload non sicuri devono avere l’ACL impostata su pubblico, mentre gli upload sicuri avranno un ACL privato in modo che l’URL S3 possa essere accessibile direttamente. Non credo che abbiamo intenzione di modificare questo funzionamento al momento; penso che ci sarebbe un notevole lavoro da svolgere per evitare di utilizzare le ACL in assoluto per le sostituzioni S3.

7 Mi Piace