Статья

Как делиться файлами S3, не делая bucket публичным

Безопасный обмен файлами S3 из приватного bucket: presigned URL, подписанные URL CloudFront или ссылки с паролем, сроком и лимитом скачиваний.

Делиться файлами из Amazon S3 можно, вообще не делая bucket публичным. Оставьте его приватным, не выключайте Block Public Access и выдавайте людям подписанный доступ к конкретным объектам: presigned URL для разового файла, подписанные URL CloudFront, если перед bucket у вас уже стоит CDN, или ссылку для доступа с паролем, датой истечения и лимитом скачиваний. Все три способа так же работают у S3-совместимых провайдеров, таких как Cloudflare R2, DigitalOcean Spaces, Wasabi и Backblaze B2 (CloudFront есть только в AWS).

Способы безопасного обмена файлами S3 вкратце

СпособДля чего лучше всегоПарольЛимит скачиванийОтзыв одной ссылкиЦелые папкиНужен код
Публичный объект или bucketДействительно публичные ресурсы (сайт)НетНетНетДаНет
Presigned URLОдин файл, один раз, из CLI или приложенияНетНетНетНетCLI или SDK
Подписанный URL CloudFrontПриложения, которые уже аутентифицируют пользователейНетНетНетС подписанными cookieДа
Ссылка для доступа NubboРегулярный обмен с людьми извнеДаДаДаДа, с ZIPНет

Почему бы просто не сделать файл публичным

Самый быстрый способ поделиться файлом из S3 это сделать его публичным и отправить URL объекта. Он же и самый рискованный: всё публичное может получить любой, кто найдёт или угадает адрес, без пароля, без срока действия и без записи о том, кто забрал файл. Забытые публичные bucket это классический источник утечек данных, и они раскрывают не только содержимое, но и имена файлов.

AWS заявляет, что новые bucket, точки доступа и объекты по умолчанию не разрешают публичный доступ. Кроме того, у S3 Block Public Access есть четыре настройки (BlockPublicAcls, IgnorePublicAcls, BlockPublicPolicy и RestrictPublicBuckets), которые перекрывают любую политику или ACL, способные открыть bucket позже. Их можно задать для bucket, для аккаунта или для всей AWS Organization, и S3 применяет самое строгое сочетание. AWS рекомендует включить все четыре на уровне аккаунта, если только вы действительно не размещаете публичный контент, например статический сайт.

Не выключайте этот переключатель. Всё, что описано ниже, работает с ним.

Вариант 1: presigned URL

Presigned URL это URL объекта с подписью в строке запроса. Он разрешает одну операцию (обычно скачивание) над одним объектом до истечения срока, и S3 проверяет подпись при каждом запросе.

aws s3 presign s3://my-bucket/reports/q3.pdf --expires-in 86400

Этот URL действует 24 часа. По умолчанию CLI ставит один час, а максимум составляет 604 800 секунд (7 дней) при подписи ключами пользователя IAM. Если подписывать временными учётными данными, например принятой ролью, URL перестаёт работать, когда истекают эти учётные данные.

Что вы получаете:

  • Никаких изменений в bucket или его политиках.
  • Точный контроль: один объект, один метод, один срок.
  • Работу у любого провайдера, который поддерживает подпись SigV4.

Чего вы не получаете:

  • Пароля. Любой, у кого есть URL, может пользоваться им сколько угодно раз, пока не истечёт срок.
  • Лимита скачиваний и отзыва отдельной ссылки. Досрочно отключить URL можно, только отозвав ключи, которыми он подписан.
  • Папок. Вы подписываете объект за объектом, поэтому поделиться папкой из 300 файлов значит выдать 300 URL.
  • Приватности имён. URL показывает имя bucket, ключ объекта и ID вашего ключа доступа.

Подробности о механизме, включая загрузки, каждый параметр X-Amz-* и код SDK, в статье Presigned URL в S3.

Если вы уже отдаёте bucket через Amazon CloudFront, можно требовать подписанные URL или подписанные cookie для поведения кеша (cache behavior). Bucket остаётся приватным за origin access control (OAC), который AWS рекомендует вместо более старого origin access identity: политика bucket разрешает читать объекты только вашему дистрибутиву. Вы регистрируете публичные ключи в доверенной группе ключей и подписываете соответствующим закрытым ключом.

  • Подписанные URL подходят для отдельных файлов. С собственной политикой можно также задать время начала и диапазон IP и использовать одну политику для многих файлов с подстановочными знаками. Они могут быть короткоживущими или действовать годами.
  • Подписанные cookie подходят для множества файлов сразу, например всех сегментов видео, без изменения ваших URL.

Это правильный инструмент, если у вас есть приложение, которое уже аутентифицирует пользователей и отдаёт контент в больших объёмах. Чтобы передать несколько файлов людям вне вашей команды, это означает настройку дистрибутива, управление ключами и код, который подписывает каждый запрос.

Ограничить политику bucket фиксированным диапазоном IP это ещё один встроенный вариант, но он помогает, только если вы знаете сети получателей, что с людьми вне вашей организации бывает редко.

Вариант 3: ссылки для доступа в Nubbo

Nubbo подключается к вашему bucket и даёт ссылки для доступа с теми механизмами контроля, которых нет у presigned URL, без написания кода. Внутри он по-прежнему использует presigned URL: Nubbo сначала проверяет правила ссылки и только потом выдаёт короткоживущий URL, поэтому отдельные файлы идут прямо из вашего bucket в браузер получателя.

Шаг 1: подключите bucket

Зарегистрируйтесь бесплатно, подтвердите электронную почту, затем откройте раздел «Buckets» и нажмите «Подключить bucket». Мастер спросит провайдера (Amazon S3, Cloudflare R2, DigitalOcean Spaces, Wasabi, Backblaze B2 или собственный S3-совместимый endpoint), способ подключения (автоматическая настройка с ключом с полным доступом или ключ, ограниченный одним bucket), ваш ключ и ваш bucket. Он проверит ключ и bucket, а в конце протестирует CORS настоящей загрузкой из вашего браузера. Bucket остаётся приватным, а ваши ключи хранятся в зашифрованном виде (AES-256-GCM). Тариф «Бесплатно» включает 2 подключения.

Шаг 2: выберите файл или папку

Найдите элемент в проводнике и нажмите «Поделиться». Можно также перейти на страницу «Общий доступ», нажать «Новая ссылка» и выбрать там bucket и файл или папку.

Шаг 3: настройте защиту

Все три механизма необязательны и доступны на любом тарифе:

МеханизмКак работает
ПарольОт 4 до 50 символов. После 10 неверных попыток ссылка блокируется на 15 минут.
Дата истеченияПо умолчанию выключена: ссылка активна, пока файл или папка есть в вашем хранилище.
Макс. загрузокПустое поле означает без ограничений. Когда лимит достигнут, ссылка перестаёт отдавать файл.

Шаг 4: создайте и отправьте ссылку

Нажмите «Создать ссылку», скопируйте её и отправьте по почте, в чате или чем вы обычно пользуетесь. Получатель откроет аккуратную страницу скачивания, и аккаунт ему не понадобится. Ссылка на папку позволяет просматривать её, скачивать отдельные файлы или забрать всё в ZIP, который браузер получателя собирает, скачивая каждый файл прямо из вашего bucket.

Шаг 5: отправьте пароль отдельно

Отправлять пароль в том же сообщении, что и ссылку, бессмысленно. Если у ссылки есть пароль, «Отправить пароль по электронной почте» передаст его одноразовой ссылкой для просмотра: пароль показывается один раз, ссылка для просмотра истекает через 24 часа, 3 дня или 7 дней, и можно добавить короткую заметку. Вы получите уведомление, когда её откроют.

Шаг 6: отслеживайте и отзывайте

На странице «Общий доступ» перечислены все ссылки с их статусом и числом скачиваний. Можно изменить пароль, срок или лимит, отключить ссылку (она сразу перестаёт выдавать новые URL для скачивания) и позже снова открыть её с тем же адресом.

Доступ для конкретных людей вместо ссылки

Ссылка работает для любого, у кого она есть. Если нужно, чтобы доступ получили только определённые люди, функция Nubbo «Поделиться с людьми» (в тарифах Personal и Pro) отправляет файл или папку на конкретные адреса электронной почты с правом просмотра или скачивания, сроком действия и лимитом скачиваний по желанию и записывает каждый доступ. Получателям нужен аккаунт Nubbo, а элемент они найдут в разделе «Доступно мне». Personal позволяет 10 человек на элемент и 50 активных доступов; Pro позволяет 50 и 500.

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

Какой вариант выбрать?

  • Один файл, один раз, и у вас настроен AWS CLI: presigned URL это самый быстрый путь.
  • Приложение, которое уже авторизует пользователей и отдаёт много контента: подписанные URL или cookie CloudFront.
  • Регулярный обмен с людьми вне вашей команды, целые папки или всё, что требует пароля или лимита: ссылка для доступа экономит время и избавляет от ошибок.

Больше, чем одна ссылка

Две связанные функции покрывают другие частые случаи. Запросы файлов дают публичную ссылку для загрузки, чтобы люди могли присылать файлы в ваш bucket, не видя ничего другого в нём. Галереи превращают папку с фото или видео в страницу для просмотра с макетами, водяным знаком и собственным паролем. На тарифе «Бесплатно» доступно по 3 каждого вида и неограниченное число ссылок для доступа; Personal и Pro снимают эти ограничения. Одно честное уточнение: миниатюры создаются на сервере Nubbo и хранятся в вашем собственном bucket в .nubbo-thumbs/.

Частые вопросы

Как поделиться файлом из S3, не делая его публичным?

Оставьте bucket приватным и выдавайте вместо этого подписанный доступ: presigned URL на один объект (из AWS CLI или SDK), подписанный URL или cookie CloudFront, если вы уже отдаёте bucket через CloudFront, или ссылку для доступа из инструмента вроде Nubbo, который добавляет поверх presigned URL пароль, срок действия и лимит скачиваний.

Безопасен ли Amazon S3 для обмена файлами?

Да, пока bucket остаётся приватным. Новые bucket по умолчанию не разрешают публичный доступ, а S3 Block Public Access не даёт никому открыть их позже. Риск возникает, если сделать объекты публичными или допустить утечку подписанных ссылок, которые работают для любого, у кого они есть, пока не истечёт срок.

Новые bucket S3 по умолчанию приватные?

Да. AWS заявляет, что новые bucket, точки доступа и объекты по умолчанию не разрешают публичный доступ, а четыре настройки Block Public Access перекрывают любую политику или ACL, которые могли бы открыть их позже.

Нужен ли получателю аккаунт AWS или Nubbo?

Нет. Presigned URL, подписанный URL CloudFront и ссылка для доступа Nubbo работают в любом браузере без аккаунта. Только «Поделиться с людьми», когда элемент отправляется конкретным людям, требует, чтобы у них был аккаунт Nubbo.

Сколько может действовать ссылка на файл в S3?

Presigned URL действует максимум 7 дней при подписи ключами пользователя IAM и меньше с временными учётными данными. Подписанные URL CloudFront действуют столько, сколько указано в вашей политике. У ссылки для доступа Nubbo нет срока действия, пока вы его не зададите, потому что при каждом скачивании она выдаёт новый короткоживущий URL.

Проходят ли файлы через Nubbo, когда кто-то скачивает по ссылке?

Нет: браузер скачивает отдельные файлы прямо из вашего bucket по presigned URL. ZIP-архивы с несколькими файлами собираются в браузере, который скачивает каждый файл прямо из вашего bucket: Nubbo никогда не видит их содержимого.

Источники

Цены и лимиты взяты с официальных страниц ниже. Провайдеры их меняют, поэтому проверьте перед тем, как принимать решение.