Sichere Uploads

Im Februar wurde in der Discourse 2.4-Veröffentlichung die Funktion „Secure Uploads" eingeführt, die ein höheres Maß an Sicherheit für ALLE Uploads (Bilder, Videos, Audiodateien, Text, PDFs, ZIPs und andere) innerhalb einer Discourse-Instanz bietet.

Voraussetzungen

Sie müssen S3-Uploads auf Ihrer Site aktiviert haben, wofür folgende Einstellungen ausgefüllt sein müssen:

  • S3 Access Key ID
  • S3 Secret Access Key
  • S3 Region
  • S3 Upload Bucket

Zusätzlich müssen Sie einen S3-Bucket verwenden, der keine öffentliche Bucket-Richtlinie (Public Bucket Policy) hat, und Sie müssen sicherstellen, dass alle vorhandenen Uploads eine öffentliche Lese-ACL (public-read S3 ACL) besitzen. Weitere Informationen finden Sie im Abschnitt „Secure Uploads aktivieren" unten.

Nachdem diese Voraussetzungen erfüllt sind, können Sie die Site-Einstellung „secure uploads" aktivieren.

Secure Uploads aktivieren

:dragon: :warning: HIER GIBT ES DRACHEN :warning: :dragon:

Dies ist eine erweiterte Funktion, und der Support außerhalb unseres Enterprise-Tarifs wird bestenfalls begrenzt sein. Aktivieren Sie Secure Uploads nur, wenn Sie ein erfahrener Benutzer sind.


Um Secure Uploads zu aktivieren, müssen Sie die folgenden Schritte ausführen:

  1. Stellen Sie sicher, dass S3-Uploads konfiguriert sind.
  2. Notieren Sie sich, ob Ihr S3-Bucket eine öffentliche Bucket-Richtlinie hat. Falls ja, ist ein zusätzlicher Schritt erforderlich (Schritt 4).
  3. Führen Sie den Rake-Task uploads:sync_s3_acls aus. Dadurch wird sichergestellt, dass alle Ihre Uploads die korrekte ACL in S3 haben. Dies ist wichtig; wenn Sie Schritt 4 vor diesem Schritt ausführen, können einige Uploads auf Ihrem Forum unzugänglich werden.
  4. Entfernen Sie die öffentliche Bucket-Richtlinie aus Ihrem Bucket, falls sie in Schritt 1 vorhanden war.
  5. Aktivieren Sie die Site-Einstellung „secure uploads". Optional können Sie auch die Site-Einstellung „prevent anons from downloading files" aktivieren, um zu verhindern, dass anonyme Benutzer Anhänge aus öffentlichen Beiträgen herunterladen. Alle Uploads ab diesem Zeitpunkt können je nach den unten genannten Bedingungen als sicher markiert werden.
  6. Wenn Sie möchten, dass alle Uploads rückwirkend analysiert und ggf. als sicher markiert werden, führen Sie den Rake-Task uploads:secure_upload_analyse_and_update aus.

:exclamation: Hinweis zur S3-Bucket-Richtlinie :exclamation:

Sie müssen sicherstellen, dass der Bucket, in den Sie hochladen, keine öffentliche Bucket-Richtlinie hat. Eine öffentliche Bucket-Richtlinie sieht ungefähr so aus:

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

Der wichtige Teil hier ist, dass wir * das Erhalten von Objekten (GetObject) erlauben, was bedeutet, dass jeder alles im Bucket herunterladen darf. Dieses Label zeigt auch an, ob die Richtlinie öffentlich ist:

Die Einstellungen hier sollten nicht geändert werden. Abgebildet ist der ideale Zustand für den Reiter „Block public access":

Was es bewirkt

Sobald Sie Secure Uploads aktiviert haben, wird jede über den Composer hochgeladene Datei basierend auf den folgenden Kriterien entweder als sicher oder als nicht sicher markiert:

  • Wenn Sie die Site-Einstellung „login required" aktiviert haben, werden alle Uploads als sicher markiert, und anonyme Benutzer können nicht darauf zugreifen.
  • Wenn Sie etwas innerhalb einer persönlichen Nachricht hochladen, wird dies als sicher markiert.
  • Wenn Sie etwas innerhalb eines Themas hochladen, das sich in einer privaten Kategorie befindet, wird dies als sicher markiert.

Der Upload in S3 hat eine private ACL, sodass direkte Links zur Datei in S3 einen 403-Fehler (Zugriff verweigert) auslösen. Jeder und alle Zugriffe auf sichere Uploads erfolgen über eine S3-presigned URL. Dies wird für Ihre Benutzer jedoch verborgen sein; wenn ein Upload sicher ist, erfolgt jeder Verweis darauf über die Discourse-URL /secure-uploads/.

Berechtigungen und Zugriffskontrolle

Die URL /secure-uploads/ ermittelt, ob der aktuelle Benutzer auf das Medium zugreifen darf, und liefert es, falls ja. Beim Erstellen des Uploads wird der Beitrag, in dem er erstmals erscheint, als sein „Zugriffskontroll-Beitrag" festgelegt, und alle Berechtigungen basieren auf diesem Beitrag.

  • Wenn Sie die Site-Einstellung „login required" aktiviert haben, erhalten anonyme Benutzer beim Zugriff auf die URL immer einen 404-Fehler.
  • Wenn Sie auf Medien zugreifen, deren Zugriffskontroll-Beitrag eine persönliche Nachricht ist, muss der Benutzer Teil dieses persönlichen Nachrichtenthemas sein, um auf das Medium zugreifen zu können; andernfalls erhält der Benutzer einen 403-Fehler.
  • Wenn Sie auf Medien zugreifen, deren Zugriffskontroll-Beitrag sich in einem Thema innerhalb einer privaten Kategorie befindet, muss der Benutzer Zugriff auf diese Kategorie haben, um auf das Medium zugreifen zu können; andernfalls erhält der Benutzer einen 403-Fehler.

Das Kopieren von /secure-uploads/-URLs zwischen Beiträgen und Themen ist unratsam, da verschiedene Benutzer unterschiedliche Zugriffsebenen in Ihren Discourse-Foren haben. Neue Uploads sollten immer über den Composer erstellt werden. Oneboxes und direkt verlinkte Bilder beachten ebenfalls die Regeln für sichere Uploads. Site-Einstellungen, Emojis und Theme-Uploads sind nicht von sicheren Uploads betroffen, da diese öffentlich sein müssen.

:warning: Wenn ein Zugriffskontroll-Beitrag gelöscht wird, ist der angehängte Upload nicht mehr zugänglich. :warning:

Verschieben von Beiträgen mit sicheren Uploads

Wenn Sie einen „Zugriffskontroll-Beitrag" zwischen verschiedenen Sicherheitskontexten verschieben, kann der angehängte Upload möglicherweise als sicher oder nicht sicher geändert werden. Dies sind die Situationen, die die Sicherheit eines Uploads ändern können:

  • Ändern einer Themenkategorie. Durchläuft alle Beiträge im Thema und aktualisiert den Sicherheitsstatus der Uploads entsprechend.
  • Ändern eines Themas zwischen einem öffentlichen Thema und einer persönlichen Nachricht. Führt dasselbe wie oben aus.
  • Verschieben von Beiträgen von einem Thema in ein neues oder bestehendes anderes Thema. Führt dasselbe wie oben im Zielthema aus.

Sichere Uploads in E-Mails

Das Einbetten sicherer Bilder in E-Mails ist standardmäßig aktiviert. Sie können diese Site-Einstellungen für weitere Kontrolle konfigurieren:

  • secure_uploads_allow_embed_images_in_emails: Deaktivieren Sie dies, um sichere Bilder in E-Mails zu entfernen.
  • secure_uploads_max_email_embed_image_size_kb: Die Obergrenze für die Größe des sicheren Bildes, das wir einbetten, standardmäßig 1 MB, damit die E-Mail nicht zu groß wird. Maximum ist 10 MB. Funktioniert zusammen mit email_total_attachment_size_limit_kb.

Die sicheren Bilder werden als E-Mail-Anhänge hinzugefügt und unter Verwendung des cid:-URL-Formats eingebettet, da die Unterstützung von Base64-URLs in E-Mail-Clients noch unzuverlässig ist.

Wenn Sie secure_uploads_allow_embed_images_in_emails nicht aktiviert haben oder wenn die Bilder die Größenbeschränkungen überschreiten, sehen Sie anstelle sicherer Bilder Folgendes (auch sichere Audio- und Videodateien, die nicht eingebettet sind):

image

Gehostete Kunden

Derzeit ist Secure Uploads nur für unsere Enterprise-Pläne verfügbar. Bitte kontaktieren Sie uns für weitere Details.

51 „Gefällt mir“
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 „Gefällt mir“

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

13 „Gefällt mir“

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 „Gefällt mir“

@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 „Gefällt mir“

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 „Gefällt mir“

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

1 „Gefällt mir“

@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 „Gefällt mir“

@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 „Gefällt mir“

Ich habe diese PR diese Woche gemerged und füge diese Details zur OP hinzu:


Wenn Sie das Einbetten sicherer Bilder in E-Mails zulassen möchten, können Sie diese Seiteneinstellungen konfigurieren:

  • secure_media_allow_embed_images_in_emails: Wenn aktiviert, werden sichere Bilder in E-Mails eingebettet, anstatt sie zu schwärzen.
  • secure_media_max_email_embed_image_size_kb: Die Obergrenze für die Größe des eingebetteten sicheren Bilds, standardmäßig 1 MB, damit die E-Mail nicht zu groß wird. Das Maximum beträgt 10 MB. Funktioniert in Kombination mit email_total_attachment_size_limit_kb.

Die sicheren Bilder werden als E-Mail-Anhänge hinzugefügt und mit dem cid:-URL-Format eingebettet, da die Unterstützung für Base64-URLs in E-Mail-Clients noch unzuverlässig ist.

Wenn secure_media_allow_embed_images_in_emails nicht aktiviert ist oder wenn die Bilder die Größenbeschränkungen überschreiten, sehen Sie stattdessen Folgendes anstelle sicherer Bilder (auch sichere Audio- und Videodateien, die nicht eingebettet werden):

image

10 „Gefällt mir“

Ergänzung zu meinem vorherigen Beitrag; aus diesem PR:

Wir aktivieren jetzt standardmäßig die sichere Einbettung von Medienbildern.

5 „Gefällt mir“

Nach dem Einrichten sicherer Medien-Uploads (nach der Anleitung des Originalposters) funktioniert alles einwandfrei (Anhänge, Bilder usw.), außer Uploads, die keine Themenanhänge sind (wie das Seitenlogo oder der Profil-Avatar). Diese lösen in Discourse einen “Zugriff verweigert”-Popup auf.
Habe ich vielleicht eine Einstellung falsch gemacht?

Bitte lies den Beitrag. Dein Problem wird ein paar Beiträge weiter oben behandelt.

3 „Gefällt mir“

Ich habe alles sorgfältig gelesen. Bitte teilen Sie mir mit, was genau Sie mit den wenigen Beiträgen weiter oben meinen. Ich sehe dieses Problem nicht.

Edit:
Wenn ich zwischen den Zeilen lese, scheint dieser Thread früher länger gewesen zu sein, aber einige wichtige Antworten wurden daraus gelöscht. Ich sehe Verweise auf Antworten, die nicht existieren, und Erwähnungen von Screenshots, die im Thread nicht angezeigt werden.

Wenn ich es richtig verstehe, lautet die Empfehlung, das S3-Bucket so einzustellen, dass es keinen öffentlichen Zugriff blockiert. Ich möchte das nur bestätigen und fragen, ob das sicher ist?

1 „Gefällt mir“

Richtig.

Der ursprüngliche Beitrag ist zwar tatsächlich weg, aber das Problem und die Lösung sind weiterhin vorhanden.

6 „Gefällt mir“

Ich habe einen Fehler beim Verwenden von gesicherten Medien bemerkt: https://meta.discourse.org/t/knowledge-base-plugin/115288

Links zu Anhängen in der Wissensdatenbank lassen sich nicht öffnen (sie leiten auf eine 404-Seite weiter), es sei denn, sie werden gezwungen, in einem neuen Fenster zu öffnen.

Das besonders Seltsame ist, dass derselbe Anhang problemlos von dem mit dem Eintrag der Wissensdatenbank verknüpften Discourse-Thema aus geöffnet werden kann.

Edit:
Der gleiche Fehler tritt auf, wenn jemand einen Link zu einem Anhang von einer Antwort in eine andere kopiert. Der Link ist natürlich exakt derselbe, funktioniert aber nur in der ursprünglichen Antwort, es sei denn, er wird gezwungen, in einem neuen Fenster zu öffnen.

1 „Gefällt mir“

Wie sieht es mit gesicherten Medien aus, wenn S3 nicht verwendet wird? Derzeit sieht es so aus, als könnte man die hochgeladene Datei herunterladen, ohne sich einzuloggen, sofern man den direkten Link besitzt. Das stellt dann ein Sicherheitsproblem dar.

Gesicherte Medien erfordern S3.
Diese gesamte Funktion wurde entwickelt, um das Teilen und Zugreifen auf direkte Links unmöglich zu machen.

11 „Gefällt mir“

Das ist eine hervorragende Funktion. Vielen Dank für die Entwicklung. Minio, ein kostenloser Drop-in-Ersatz für S3, unterstützt keine ACLs und wird dies auch nie tun. Ihr Argument, das gut begründet ist, lautet, dass ACLs keine nützliche Funktion sind und die Leistung negativ beeinflussen, da sie einen zweiten Schreibvorgang erfordern. Sichere Medien-Uploads funktionieren mit Discourse – die Aufgabe uploads:secure_upload_analyse_and_update schlägt im letzten Schritt fehl, aber es scheint, dass man diesen Fehler ignorieren kann. Dennoch: Gibt es einen Grund, warum Discourse überhaupt ACL-Aufrufe tätigen sollte?

3 „Gefällt mir“

Ja, da der S3-Bucket gemäß der Einrichtung im ursprünglichen Beitrag privat ist, müssen nicht-sichere Uploads eine öffentliche ACL-Zuweisung erhalten, während sichere Uploads eine private ACL erhalten, damit auf die S3-URL direkt zugegriffen werden kann. Ich glaube nicht, dass wir derzeit Pläne haben, diese Funktionsweise zu ändern; ich denke, es wäre mit erheblichem Aufwand verbunden, den Einsatz von ACLs für S3-Ersatzlösungen vollständig zu vermeiden.

7 „Gefällt mir“