Subidas Seguras

Añadido en la versión 2.4 de Discourse en febrero está la función de Cargas Seguras, que proporciona un mayor grado de seguridad para TODAS las cargas (imágenes, video, audio, texto, PDFs, ZIPs y otros) dentro de una instancia de Discourse.

Requisitos previos

Debes tener las cargas en S3 habilitadas en tu sitio, lo cual requiere que se completen los siguientes ajustes:

  • ID de clave de acceso de S3
  • Clave de acceso secreta de S3
  • Región de S3
  • Bucket de carga de S3

También debes estar utilizando un bucket de S3 que no tenga una política de bucket pública, y debes asegurarte de que todas las cargas existentes tengan una ACL de S3 de lectura pública. Consulta la sección “Habilitar Cargas Seguras” más abajo.

Una vez satisfechos estos requisitos previos, puedes habilitar el ajuste de sitio “cargas seguras”.

Habilitar Cargas Seguras

:dragon: :warning: AQUÍ HAY DRAGONES :warning: :dragon:

Esta es una función avanzada y el soporte fuera de nuestro nivel Enterprise será limitado como máximo. Solo habilita las cargas seguras si eres un usuario experto.


Para habilitar las cargas seguras, debes seguir estos pasos:

  1. Asegúrate de tener las cargas en S3 configuradas.
  2. Anota si tu bucket de S3 tiene una política de bucket pública. Si es así, se requiere un paso adicional (paso 4).
  3. Ejecuta la tarea rake uploads:sync_s3_acls. Esto asegurará que todas tus cargas tengan la ACL correcta en S3. Esto es importante; si realizas el paso 4 antes de hacer esto, algunas cargas podrían volverse inaccesibles en tu foro.
  4. Elimina la política de bucket pública de tu bucket si estaba presente en el paso 1.
  5. Habilita el ajuste de sitio “cargas seguras”. Opcionalmente, habilita el ajuste de sitio “prevenir que los anónimos descarguen archivos” para detener a los usuarios anónimos de descargar adjuntos de publicaciones públicas. Todas las cargas a partir de este momento podrían marcarse como seguras dependiendo de las condiciones siguientes.
  6. Si deseas que todas las cargas se analicen retroactivamente y posiblemente se marquen como seguras, ejecuta la tarea rake uploads:secure_upload_analyse_and_update.

:exclamation: Nota sobre la política del bucket S3 :exclamation:

Debes asegurarte de que el bucket al que estás cargando no tenga una política de bucket pública. Una política de bucket pública tendrá algo como esto:

{
    "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 aquí es que estamos permitiendo que * cualquier persona * obtenga objetos, lo que significa que cualquiera puede descargar cualquier cosa en el bucket. Esta etiqueta también mostrará si la política es pública:

Los ajustes aquí no deben modificarse. La imagen muestra el estado ideal para la pestaña “Bloquear acceso público”:

Qué hace

Una vez que hayas habilitado las Cargas Seguras, cualquier archivo cargado a través del Composer se marcará como seguro o no seguro según los siguientes criterios:

  • Si tienes habilitado el ajuste de sitio “inicio de sesión requerido”, todas las cargas se marcarán como seguras, y los usuarios anónimos no podrán acceder a ellas.
  • Si estás cargando algo dentro de un Mensaje Personal, se marcará como seguro.
  • Si estás cargando algo dentro de un Tema que está dentro de una Categoría privada, se marcará como seguro.

La carga en S3 tendrá una ACL privada, por lo que los enlaces directos al archivo en S3 devolverán un error 403 de acceso denegado. Cualquier y todo acceso a las cargas seguras será a través de una URL firmada por S3. Sin embargo, esto estará oculto para tus usuarios; si una carga es segura, cualquier referencia a ella se realizará a través de la URL de Discourse /secure-uploads/.

Permisos y control de acceso

La URL /secure-uploads/ determinará si el usuario actual tiene permiso para acceder al medio y lo servirá si es así. Cuando se crea la carga, la publicación en la que aparece por primera vez se establecerá como su “publicación de control de acceso” y todos los permisos se basarán en esa publicación.

  • Si tienes habilitado el ajuste de sitio “inicio de sesión requerido”, los usuarios anónimos siempre recibirán un error 404 al acceder a la URL.
  • Si accedes a un medio cuya publicación de control de acceso es un Mensaje Personal, el usuario debe ser parte de ese tema de Mensaje Personal para acceder al medio; de lo contrario, el usuario recibirá un error 403.
  • Si accedes a un medio cuya publicación de control de acceso está dentro de un tema que está dentro de una Categoría privada, el usuario debe tener acceso a esa categoría para acceder al medio; de lo contrario, el usuario recibirá un error 403.

Copiar URLs de /secure-uploads/ entre Publicaciones y Temas no es aconsejable, ya que diferentes usuarios tendrán diferentes niveles de acceso dentro de tus foros de Discourse. Las nuevas cargas siempre deben crearse a través del Composer. Las Oneboxes y las imágenes con enlaces directos también respetarán las reglas de cargas seguras. Los ajustes de sitio, emojis y cargas de temas no se ven afectados por las cargas seguras, ya que deben ser públicos.

:warning: Si se elimina una publicación de control de acceso, la carga adjunta ya no será accesible. :warning:

Mover publicaciones con cargas seguras

Si mueves una “publicación de control de acceso” entre diferentes contextos de seguridad, la carga adjunta podría cambiar a segura o no segura. Estas son las situaciones que pueden cambiar la seguridad de una carga:

  • Cambiar la categoría de un tema. Recorrerá todas las publicaciones del tema y actualizará el estado de seguridad de las cargas en consecuencia.
  • Cambiar un tema entre ser un tema público y un mensaje personal. Hará lo mismo que arriba.
  • Mover publicaciones de un tema a otro tema nuevo o existente. Ejecutará lo mismo que arriba en el tema de destino.

Cargas seguras en correos electrónicos

La incrustación de imágenes seguras en correos electrónicos está habilitada de forma predeterminada. Puedes configurar estos ajustes de sitio para un control adicional:

  • secure_uploads_allow_embed_images_in_emails: Deshabilita esto para omitir las imágenes seguras en los correos electrónicos.
  • secure_uploads_max_email_embed_image_size_kb: El límite máximo para el tamaño de la imagen segura que incrustaremos, con un valor predeterminado de 1 MB, para que el correo electrónico no se vuelva demasiado grande. El máximo es 10 MB. Funciona junto con email_total_attachment_size_limit_kb.

Las imágenes seguras se agregarán como archivos adjuntos de correo electrónico y se incrustarán utilizando el formato de URL cid: porque el soporte de URL base64 en los clientes de correo electrónico aún es inestable.

Si no tienes habilitado secure_uploads_allow_embed_images_in_emails, o si las imágenes comienzan a exceder los límites de tamaño, esto es lo que verás en lugar de las imágenes seguras (también audio y video seguros que no se incrustan):

image

Clientes alojados

Por el momento, las cargas seguras están disponibles solo para nuestros clientes del plan Enterprise. Por favor, contáctanos para más detalles.

51 Me gusta
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 Me gusta

La seguridad nunca tuvo la intención de cubrir avatares; este no es un caso de uso que hayamos planificado.

13 Me gusta

Aviso: Configurar el bucket de S3 en “Bloquear todo el acceso público” no es correcto

@genachka @AntiMetaman @Hugh_Roberts @znedw @Thamer

Voy a modificar el mensaje original. Tras hablar con el miembro de nuestro equipo de infraestructura @schleifer, confirmé que fue un error aconsejar que se activara la configuración “Bloquear todo el acceso público”. Desactiva esta opción para tu bucket de S3 y luego ejecuta uploads:sync_s3_acls para asegurarte de que los ACL sean correctos; después, vuelve a intentarlo con los avatares personalizados.

Además, todos deben asegurarse de que el bucket al que están subiendo archivos no tenga una política de bucket pública. Una política de bucket pública tendrá algo como esto:

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

Lo importante aquí es que estamos permitiendo que * realice GetObject, lo que significa permitir que cualquiera descargue cualquier objeto del bucket. Esta etiqueta también aparecerá si la política es pública:

Mis disculpas por esto. @AntiMetaman, ni @schleifer ni yo pudimos reproducir este error:

Sería útil si pudieras proporcionar más información sobre tu configuración de S3/AWS.

7 Me gusta

@martin Gracias. Mi problema no fue ese error, sino que los anónimos no podían acceder a la página. Si configuro el bucket de subida como privado, ese error desaparece y puedo subir archivos. No tengo la opción “Requerir inicio de sesión” activada en mi sitio.

Nunca tuve habilitada la opción “Bloquear todo el acceso público” en la configuración de mi bucket desde el principio. Si me estás diciendo que los anónimos aún deberían poder acceder a un tema, leerlo y ver imágenes seguras, entonces puedo intentarlo de nuevo. Si añadir seguridad a los medios impide que los anónimos vean esas imágenes, entonces preferiría solo asegurar los archivos adjuntos.

Si te ayuda, estoy usando BackBlaze B2 con BunnyCDN. Mis configuraciones del bucket de subida actualmente son públicas:

4 Me gusta

Esa es la esencia, sí. Cualquier cosa que deba ser privada tendrá una ACL privada asignada y será inaccesible a menos que se utilice una URL firmada. Ten en cuenta que la política del bucket no es pública. Y sí, todas esas opciones de “Bloquear acceso público” deberían estar desmarcadas. Si te interesa saber cómo determinamos si una subida es segura, todas las reglas están aquí: discourse/lib/upload_security.rb at main · discourse/discourse · GitHub y aquí: discourse/app/models/post.rb at main · discourse/discourse · GitHub

No estoy familiarizado con BackBlaze, lo siento. No estoy seguro de cómo se traducirían las configuraciones mostradas a una política de bucket. Básicamente, no quieres que la política del bucket sea pública, y tampoco quieres activar “Bloquear todo el acceso público”. De esa manera, podemos asignar ACLs privadas y públicas de manera adecuada. Si no tienes la opción “requerir inicio de sesión” activada, cualquier subida realizada en un tema que no sea un mensaje privado ni esté en una categoría privada debería ser pública y accesible por anónimos. Las imágenes no deberían ser seguras en un tema accesible por anónimos.

5 Me gusta

La implementación de medios seguros no es compatible con Backblaze. ¿Ofrecen soporte para URLs con firma previa?

1 me gusta

@riking

Sí, las URLs con firma previa son compatibles: https://help.backblaze.com/hc/en-us/articles/360047815993-Does-the-B2-S3-Compatible-API-support-Pre-Signed-URLs-

@martin

Sí, cambiar el bucket de público a privado hace esto. Lo hice y me permitió subir archivos, pero como anónimo no pude ver los temas.

4 Me gusta

@martin gracias por la aclaración. Y puedo confirmar que, dejando la configuración en S3 como en mi captura de pantalla: Público y sin marcar ninguna casilla (como sugeriste), los avatares personalizados y las imágenes de perfil finalmente funcionan, mientras que las cargas protegidas en los temas siguen funcionando correctamente. ¡Gracias!

4 Me gusta

He fusionado esta PR esta semana y estoy agregando estos detalles al OP:


Si deseas permitir la incrustación de imágenes seguras en correos electrónicos, puedes configurar las siguientes opciones del sitio:

  • secure_media_allow_embed_images_in_emails: Si está habilitado, incrustaremos imágenes seguras en los correos electrónicos en lugar de censurarlas.
  • secure_media_max_email_embed_image_size_kb: Límite máximo para el tamaño de la imagen segura que se incrustará, con un valor predeterminado de 1 MB para evitar que el correo electrónico sea demasiado grande. El máximo es de 10 MB. Funciona junto con email_total_attachment_size_limit_kb.

Las imágenes seguras se agregarán como archivos adjuntos del correo electrónico y se incrustarán utilizando el formato de URL cid:, ya que el soporte de URLs en base64 en los clientes de correo aún es inestable.

Si no tienes habilitada la opción secure_media_allow_embed_images_in_emails o si las imágenes superan los límites de tamaño, esto es lo que verás en lugar de las imágenes seguras (también aplica para audio y video seguros que no se incrustan):

image

10 Me gusta

Añadido adicional a mi publicación anterior; desde este PR:

Ahora habilitamos por defecto la incrustación segura de imágenes multimedia.

5 Me gusta

Después de configurar las cargas de medios seguras (siguiendo la guía del OP), todo funciona bien (archivos adjuntos, imágenes, etc.), excepto las cargas que no son adjuntos de temas (como el logotipo del sitio o el avatar del perfil), las cuales muestran un mensaje emergente de “Acceso denegado” en Discourse.
¿He configurado algo incorrectamente?

Por favor, lee el tema; tu problema se aborda en unos pocos mensajes anteriores a este.

3 Me gusta

Lo he leído todo cuidadosamente. Por favor, indícame exactamente a qué te refieres con las pocas publicaciones anteriores. No veo este problema.
Edición:
Tratando de leer entre líneas, veo que este hilo solía ser más largo, pero se eliminaron algunas respuestas clave; veo referencias a respuestas que no existen y menciones de capturas de pantalla que no aparecen en el hilo.
Sin embargo, si entendí correctamente, la recomendación es configurar el bucket de S3 para que NO bloquee ningún acceso público. Solo quiero confirmar eso y preguntar si es seguro.

1 me gusta

Correcto.

La publicación original efectivamente ha desaparecido, pero el problema y la solución siguen ahí.

6 Me gusta

He notificado un error al usar medios seguros y https://meta.discourse.org/t/knowledge-base-plugin/115288. Los enlaces a archivos adjuntos en la base de conocimientos no se abren (redirigen a una página 404) a menos que se fuerce su apertura en una nueva ventana.

Lo más extraño es que el mismo archivo adjunto puede abrirse sin problemas desde el tema de Discourse asociado al elemento de la base de conocimientos.

Edición:
El mismo error ocurre cuando alguien copia un enlace a un archivo adjunto de una respuesta a otra. El enlace es exactamente el mismo, por supuesto, pero solo funciona desde la respuesta original, a menos que se fuerce su apertura en una nueva ventana.

1 me gusta

¿Qué pasa con los medios seguros si no se utiliza S3?
Actualmente parece que, si tienes el enlace directo al archivo subido, puedes descargar ese archivo sin iniciar sesión. Eso representa un problema de seguridad…

Los medios seguros requieren S3.
Esta función completa se desarrolló para hacer imposible compartir y acceder a enlaces directos.

11 Me gusta

Esta es una excelente función. Gracias por desarrollarla. Minio, un reemplazo gratuito y directo para S3, no tiene soporte para ACL y nunca lo tendrá. Su argumento, que es válido, es que las ACL no son una función útil y afectan negativamente el rendimiento porque requieren una segunda operación de escritura. Las cargas de medios seguros funcionarán con Discourse: la tarea uploads:secure_upload_analyse_and_update fallará en el paso final, pero parece que puedes ignorarlo. Dicho esto, ¿hay alguna razón para que Discourse realice llamadas a ACL en absoluto?

3 Me gusta

Sí, porque el bucket de S3 es privado según la configuración del OP, las cargas no seguras necesitan tener su ACL establecida como pública, y las cargas seguras tendrán una ACL privada para que la URL de S3 pueda accederse directamente. No creo que tengamos planes por el momento de modificar cómo funciona esto; creo que habría bastante trabajo involucrado para evitar el uso de ACL en absoluto para reemplazos de S3.

7 Me gusta