Ділитися файлами з Amazon S3 можна, ніколи не роблячи бакет публічним. Залиште його приватним, не вимикайте Block Public Access і натомість давайте людям підписаний доступ до конкретних об’єктів: presigned URL для разового файлу, підписані URL CloudFront, якщо перед бакетом уже працює CDN, або посилання для спільного доступу, яке додає пароль, дату закінчення терміну дії та ліміт завантажень. Усі три способи однаково працюють і з S3-сумісними провайдерами, як-от Cloudflare R2, DigitalOcean Spaces, Wasabi і Backblaze B2 (CloudFront є лише в AWS).
Способи безпечного обміну файлами S3 коротко
| Спосіб | Для чого найкраще | Пароль | Ліміт завантажень | Відкликати одне посилання | Цілі папки | Потрібен код |
|---|---|---|---|---|---|---|
| Публічний об’єкт чи бакет | Справді публічні ресурси (вебсайт) | Ні | Ні | Ні | Так | Ні |
| Presigned URL | Один файл, один раз, з CLI чи вашого застосунку | Ні | Ні | Ні | Ні | CLI або SDK |
| Підписаний URL CloudFront | Застосунки, які вже автентифікують користувачів | Ні | Ні | Ні | З підписаними cookie | Так |
| Посилання Nubbo | Регулярний обмін із людьми ззовні | Так | Так | Так | Так, із ZIP | Ні |
Чому б просто не зробити файл публічним
Найшвидший спосіб поділитися файлом з S3 це зробити його публічним і надіслати URL об’єкта. Але це й найризикованіше: усе публічне може отримати будь-хто, хто знайде чи вгадає адресу, без пароля, без терміну дії й без жодного запису про те, хто його забрав. Забуті публічні бакети це класичне джерело витоків даних, і вони розкривають не лише вміст, а й назви файлів.
AWS зазначає, що нові бакети, точки доступу й об’єкти за замовчуванням не дозволяють публічного доступу. Крім того, S3 Block Public Access має чотири налаштування (BlockPublicAcls, IgnorePublicAcls, BlockPublicPolicy і RestrictPublicBuckets), які мають пріоритет над будь-якою політикою чи ACL, що могли б відкрити бакет пізніше. Їх можна встановити для бакета, для облікового запису або для всієї 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 перестане працювати, коли ці облікові дані спливуть.
Що ви отримуєте:
- Жодних змін у бакеті чи його політиках.
- Точний контроль: один об’єкт, один метод, один термін дії.
- Працює з будь-яким провайдером, що підтримує presigned-підпис SigV4.
Чого ви не отримуєте:
- Пароля. Будь-хто з URL може ним користуватися скільки завгодно разів, доки не мине термін дії.
- Ліміту завантажень і відкликання окремого посилання. Достроково вимкнути URL можна, лише відкликавши ключі, якими його підписано.
- Папок. Ви підписуєте кожен об’єкт окремо, тож поділитися папкою з 300 файлів означає 300 URL.
- Приватності назв. URL показує назву вашого бакета, ключ об’єкта та ваш ID ключа доступу.
Докладно про механіку, зокрема завантаження, кожен параметр X-Amz-* і код SDK, читайте в статті presigned URL в S3: пояснення.
Спосіб 2: підписані URL і cookie CloudFront
Якщо ви вже віддаєте бакет через Amazon CloudFront, можна вимагати підписані URL або підписані cookie для поведінки кешу. Бакет залишається приватним за origin access control (OAC), який AWS радить замість старішого origin access identity: політика бакета дозволяє читати об’єкти лише вашому дистрибутиву. Ви реєструєте публічні ключі в довіреній групі ключів (trusted key group) і підписуєте відповідним приватним ключем.
- Підписані URL підходять для окремих файлів. З власною політикою можна також задати час початку й діапазон IP і використовувати одну політику для багатьох файлів через шаблони. Вони можуть бути короткоживучими або діяти роками.
- Підписані cookie підходять для багатьох файлів одночасно, як-от усіх сегментів відео, без зміни ваших URL.
Це правильний інструмент, коли у вас є застосунок, який уже автентифікує користувачів і віддає вміст у великих масштабах. Щоб передати кілька файлів людям поза вашою командою, доведеться налаштувати дистрибутив, керувати ключами й написати код, що підписує кожен запит.
Обмеження політики бакета фіксованим діапазоном IP це ще один вбудований варіант, але він допомагає лише тоді, коли ви знаєте мережі отримувачів, а з людьми поза вашою організацією так буває рідко.
Спосіб 3: посилання для спільного доступу в Nubbo
Nubbo підключається до вашого бакета й дає посилання для спільного доступу з тими засобами контролю, яких бракує presigned URL, без написання коду. Усередині воно все одно використовує presigned URL: Nubbo спершу перевіряє правила посилання й лише потім видає URL із коротким терміном дії, тож окремі файли йдуть просто з вашого бакета в браузер отримувача.
Крок 1: підключіть свій бакет
Зареєструйтеся безкоштовно, підтвердьте електронну пошту, потім відкрийте «Бакети» й натисніть «Підключити бакет». Майстер запитає вашого провайдера (Amazon S3, Cloudflare R2, DigitalOcean Spaces, Wasabi, Backblaze B2 або власний S3-сумісний endpoint), спосіб підключення (автоматичне налаштування з ключем повного доступу або ключ, обмежений одним бакетом), ваш ключ і ваш бакет. Він перевіряє ключ і бакет, а наприкінці тестує CORS справжнім завантаженням із вашого браузера. Бакет залишається приватним, а ваші ключі зберігаються зашифрованими за допомогою AES-256-GCM. Безкоштовний тариф включає 2 підключення.
Крок 2: виберіть файл або папку
Знайдіть елемент у провіднику і натисніть «Поділитися». Також можна перейти на сторінку «Спільний доступ», натиснути «Нове посилання» й вибрати там бакет і файл чи папку.
Крок 3: налаштуйте захист
Усі три засоби контролю необов’язкові й доступні в кожному тарифі:
| Засіб контролю | Як працює |
|---|---|
| Пароль | Від 4 до 50 символів. Після 10 невдалих спроб посилання блокується на 15 хвилин. |
| Дата закінчення терміну дії | За замовчуванням вимкнено: посилання активне, поки файл чи папка є у вашому сховищі. |
| Максимум завантажень | Порожнє поле означає без обмежень. Коли ліміт досягнуто, посилання перестає віддавати файл. |
Крок 4: створіть і надішліть посилання
Натисніть «Створити посилання», скопіюйте його й надішліть електронною поштою, у чаті чи як вам зручно. Отримувач відкриває охайну сторінку завантаження, і обліковий запис йому не потрібен. Посилання на папку дає змогу переглядати папку, завантажувати окремі файли або забрати все як ZIP, який їхній браузер збирає, скачуючи кожен файл просто з вашого бакета.
Крок 5: надішліть пароль окремо
Надсилати пароль у тому самому повідомленні, що й посилання, не має сенсу. Якщо посилання має пароль, «Надіслати пароль електронною поштою» передає його як одноразове посилання для перегляду: пароль показується один раз, термін дії посилання для перегляду спливає через 24 години, 3 дні або 7 днів, і можна додати коротку примітку. Ви отримаєте сповіщення, коли його відкриють.
Крок 6: відстежуйте й відкликайте
Сторінка «Спільний доступ» показує кожне посилання з його статусом і кількістю завантажень. Можна змінити пароль, термін дії чи ліміт, деактивувати посилання (воно одразу перестає видавати нові URL для завантаження) і пізніше знову відкрити його з тією самою адресою.
Ділитися з конкретними людьми замість посилання
Посилання працює для будь-кого, хто його має. Коли ви хочете, щоб доступ отримали лише конкретні люди, функція «Поділитися з людьми» в Nubbo (у тарифах Personal і Pro) надсилає файл чи папку на конкретні адреси електронної пошти з дозволом на перегляд або завантаження, необов’язковим терміном дії та лімітом завантажень і записує кожен доступ. Отримувачам потрібен обліковий запис Nubbo, а елемент вони знайдуть у розділі «Надано мені у доступ». Personal дозволяє 10 людей на елемент і 50 активних спільних доступів; Pro дозволяє 50 і 500.
Платні тарифи також пропонують зашифровані посилання: браузер створює запечатану копію файлу, а ключ передається лише в самому посиланні, тож Nubbo не може її прочитати.
Який спосіб вибрати?
- Один файл, один раз, і у вас налаштований AWS CLI: presigned URL це найшвидший шлях.
- Застосунок, який уже виконує вхід користувачів і віддає багато вмісту: підписані URL або cookie CloudFront.
- Регулярний обмін із людьми поза вашою командою, цілі папки чи будь-що, що потребує пароля або ліміту: посилання для спільного доступу заощаджує час і вберігає від помилок.
Більше, ніж одне посилання
Дві пов’язані функції охоплюють інші поширені випадки. Запити на файли дають публічне посилання для завантаження, щоб люди могли надсилати файли у ваш бакет, не бачачи в ньому нічого іншого. Галереї перетворюють папку з фото чи відео на сторінку для перегляду з макетами, водяним знаком і власним паролем. На Безкоштовному тарифі ви отримуєте по 3 кожного й необмежені посилання для спільного доступу; Personal і Pro знімають ці обмеження. Одна чесна примітка: мініатюри створюються на сервері Nubbo й зберігаються у вашому власному бакеті в .nubbo-thumbs/.
Поширені запитання
Як поділитися файлом з S3, не роблячи його публічним?
Залиште бакет приватним і натомість видавайте підписаний доступ: presigned URL для одного об’єкта (з AWS CLI або SDK), підписаний URL чи cookie CloudFront, якщо ви вже віддаєте бакет через CloudFront, або посилання для спільного доступу з інструмента на кшталт Nubbo, який додає пароль, термін дії та ліміт завантажень поверх presigned URL.
Чи безпечний Amazon S3 для обміну файлами?
Так, поки бакет залишається приватним. Нові бакети за замовчуванням не дозволяють публічного доступу, а S3 Block Public Access не дає нікому відкрити їх пізніше. Ризик виникає, коли об’єкти роблять публічними або коли витікають підписані посилання, які працюють для будь-кого, хто їх має, доки не мине термін дії.
Чи нові бакети S3 приватні за замовчуванням?
Так. AWS зазначає, що нові бакети, точки доступу й об’єкти за замовчуванням не дозволяють публічного доступу, а чотири налаштування Block Public Access мають пріоритет над будь-якою політикою чи ACL, які могли б відкрити їх пізніше.
Чи потрібен отримувачу обліковий запис AWS або Nubbo?
Ні. Presigned URL, підписаний URL CloudFront і посилання Nubbo працюють у будь-якому браузері без облікового запису. Лише «Поділитися з людьми», що надсилає елемент конкретним людям, вимагає від них облікового запису Nubbo.
Скільки може діяти посилання на файл з S3?
Presigned URL діє щонайбільше 7 днів, якщо підписаний ключами користувача IAM, і менше з тимчасовими обліковими даними. Підписані URL CloudFront діють стільки, скільки вказано у вашій політиці. Посилання Nubbo не має терміну дії, якщо ви його не встановите, бо під час кожного завантаження видає новий URL із коротким терміном дії.
Чи проходять файли через Nubbo, коли хтось завантажує їх за посиланням?
Ні: браузер завантажує окремі файли просто з вашого бакета через presigned URL. Багатофайлові ZIP-завантаження збираються в браузері, який скачує кожен файл просто з вашого бакета: Nubbo ніколи не бачить вмісту.
Джерела
Ціни та ліміти взято з офіційних сторінок нижче. Провайдери їх змінюють, тож перевірте, перш ніж ухвалювати рішення.
- Amazon S3: блокування публічного доступу до сховища
- Amazon S3: скачування й завантаження об’єктів через presigned URL
- Довідник AWS CLI: s3 presign
- Amazon CloudFront: обмеження доступу до джерела Amazon S3 (OAC)
- Amazon CloudFront: використання підписаних URL
- Amazon CloudFront: вибір між підписаними URL і підписаними cookie