Безопасная загрузка

Функция защищённых загрузок (Secure Uploads), добавленная в выпуске Discourse 2.4 в феврале, обеспечивает повышенный уровень безопасности для ВСЕХ загрузок (изображения, видео, аудио, текст, PDF, ZIP-архивы и другие) в рамках экземпляра Discourse.

Требования

На вашем сайте должны быть включены загрузки через S3, для чего необходимо заполнить следующие настройки:

  • Идентификатор ключа доступа S3 (S3 access key id)
  • Секретный ключ доступа S3 (S3 secret access key)
  • Регион S3
  • Ведро для загрузок S3 (S3 upload bucket)

Также вы должны использовать ведро S3, у которого отсутствует публичная политика доступа (Public bucket policy), и убедиться, что все существующие загрузки имеют ACL с правом публичного чтения (public-read S3 ACL). См. раздел «Включение защищённых загрузок» ниже.

После выполнения этих требований вы можете включить настройку сайта «secure uploads».

Включение защищённых загрузок

:dragon: :warning: ОСТОРОЖНО: ЗДЕСЬ ОБИТАЮТ ДРАКОНЫ :warning: :dragon:

Это расширенная функция, и поддержка за пределами нашего тарифа Enterprise будет крайне ограничена. Включайте защищённые загрузки только если вы опытный пользователь.


Для включения защищённых загрузок выполните следующие шаги:

  1. Убедитесь, что у вас настроены загрузки через S3.
  2. Проверьте, есть ли у вашего ведра S3 публичная политика доступа. Если есть, потребуется дополнительный шаг (шаг 4).
  3. Запустите задачу Rake uploads:sync_s3_acls. Это гарантирует, что все ваши загрузки имеют правильные ACL в S3. Это важно: если выполнить шаг 4 до этого, некоторые загрузки могут стать недоступными на вашем форуме.
  4. Удалите публичную политику доступа из вашего ведра, если она присутствовала на шаге 1.
  5. Включите настройку сайта «secure uploads». При желании включите настройку «предотвращать анонимных пользователей от загрузки файлов», чтобы запретить анонимным пользователям скачивать вложения из публичных тем. Все загрузки, сделанные с этого момента, могут быть помечены как защищённые в зависимости от условий ниже.
  6. Если вы хотите, чтобы все существующие загрузки были проанализированы и, возможно, помечены как защищённые, запустите задачу Rake uploads:secure_upload_analyse_and_update.

:exclamation: Примечание о политике доступа к ведру S3 :exclamation:

Убедитесь, что ведро, в которое вы загружаете файлы, не имеет публичной политики доступа. Публичная политика доступа будет выглядеть примерно так:

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

Ключевой момент здесь — разрешение * на выполнение действия GetObject, что означает возможность любому пользователю скачивать любые файлы из ведра. Этот статус также отображается в интерфейсе, если политика является публичной:

Эти настройки не следует изменять. На изображении показан идеальный вариант для вкладки «Блокировать публичный доступ»:

Что это делает

После включения функции защищённых загрузок любой файл, загруженный через композер, будет помечен как защищённый или незащищённый в зависимости от следующих критериев:

  • Если у вас включена настройка сайта «требуется вход», все загрузки будут помечены как защищённые, и анонимные пользователи не смогут получить к ним доступ.
  • Если вы загружаете что-либо в рамках личного сообщения, оно будет помечено как защищённое.
  • Если вы загружаете что-либо в теме, находящейся в приватной категории, оно будет помечено как защищённое.

Загрузка в S3 будет иметь приватный ACL, поэтому прямые ссылки на файл в S3 будут возвращать ошибку 403 «доступ запрещён». Любой доступ к защищённым загрузкам будет осуществляться через подписанную URL-адрес S3. Однако для ваших пользователей это будет скрыто: если загрузка защищена, любая ссылка на неё будет осуществляться через URL-адрес Discourse /secure-uploads/meta/.

Разрешения и контроль доступа

URL-адрес /secure-uploads/meta/ определяет, имеет ли текущий пользователь право доступа к медиафайлу, и обслуживает его, если право есть. При создании загрузки пост, в котором она впервые появилась, будет назначен её «постом контроля доступа», и все разрешения будут основываться на этом посте.

  • Если у вас включена настройка сайта «требуется вход», анонимные пользователи всегда будут получать ошибку 404 при попытке доступа к URL.
  • При доступе к медиафайлу, пост контроля доступа которого является личным сообщением, пользователь должен быть участником этой темы личного сообщения, иначе он получит ошибку 403.
  • При доступе к медиафайлу, пост контроля доступа которого находится в теме внутри приватной категории, пользователь должен иметь доступ к этой категории, иначе он получит ошибку 403.

Копирование URL-адресов /secure-uploads/meta/ между постами и темами не рекомендуется, так как у разных пользователей могут быть разные уровни доступа в вашем форуме Discourse. Новые загрузки всегда должны создаваться через композер. Oneboxes и изображения с прямой ссылкой также будут соблюдать правила защищённых загрузок. Настройки сайта, эмодзи и загрузки тем не затрагиваются защищёнными загрузками, так как они должны быть публичными.

:warning: Если пост контроля доступа будет удалён, прикреплённая к нему загрузка станет недоступной. :warning:

Перемещение постов с защищёнными загрузками

Если вы переместите «пост контроля доступа» между разными контекстами безопасности, то прикрепленная к нему загрузка может быть изменена на защищённую или незащищённую. Это ситуации, которые могут изменить уровень безопасности загрузки:

  • Изменение категории темы. Будет выполнена проверка всех постов в теме и обновлён статус безопасности загрузок.
  • Изменение статуса темы с публичной на личное сообщение (и наоборот). Будет выполнено то же самое.
  • Перемещение постов из одной темы в новую или существующую другую тему. Будет выполнено то же самое для целевой темы.

Защищённые загрузки в письмах

Встраивание защищённых изображений в письма включено по умолчанию. Вы можете настроить следующие параметры сайта для дополнительного контроля:

  • secure_uploads_allow_embed_images_in_emails: Отключите это, чтобы скрыть защищённые изображения в письмах.
  • secure_uploads_max_email_embed_image_size_kb: Максимальный размер защищённого изображения, которое будет встроено, по умолчанию 1 МБ, чтобы письмо не стало слишком большим. Максимум — 10 МБ. Работает в связке с email_total_attachment_size_limit_kb.

Защищённые изображения будут добавляться как вложения к письму и встраиваться с использованием формата URL cid:, так как поддержка base64 URL в почтовых клиентах всё ещё нестабильна.

Если у вас не включена настройка secure_uploads_allow_embed_images_in_emails или если изображения превышают ограничения по размеру, вместо защищённых изображений (а также защищённых аудио и видео, которые не встраиваются) вы увидите следующее:

image

Клиенты с хостингом

На данный момент функция защищённых загрузок доступна только клиентам нашего тарифа Enterprise. Пожалуйста, свяжитесь с нами для получения дополнительной информации.

51 лайк