Перейти к содержимому

Подписанные ссылки для доступа к объектам

По умолчанию доступ к объектам в Object Storage имеет только владелец. Владелец может назначать права доступа другим пользователям.

Однако при работе с Object Storage могут возникнуть ситуации, когда доступ к объектам нужно предоставить другим пользователям, например:

  • необходимость открыть один или несколько объектов для публичного скачивания;
  • организация резервного копирования и миграции данных;
  • интеграция Object Storage со сторонними сервисами и приложениями.

Организовать ограниченный доступ к объектам можно с помощью подписанных ссылок (presigned URL), которые включают подпись, подтверждающую авторизацию. Получить доступ по подписанной ссылке может любой пользователь, которому она передана, если запрос соответствует условиям доступа к объекту.

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

Подписанную ссылку может сгенерировать любой пользователь, у которого есть HMAC-ключ.

Генерация подписанных ссылок доступна как для приватного эндпоинта PrivateLink, так и для публичного. Если вы сгенерировали ссылку для приватного эндпоинта, ее нельзя будет использовать с публичным, и наоборот. Если изменить имя хоста в уже готовой ссылке вручную, подпись станет невалидной.

Если ссылка сгенерирована для приватного эндпоинта storage.pl.mwsapis.ru, получить доступ по ней сможет только тот клиент, который находится внутри VPC. Из публичного интернета такая ссылка работать не будет.

Даже при наличии валидной подписанной ссылки запрос будет проверен на соответствие политикам бакета.

Пример подписанной ссылки:

https://storage.mwsapis.ru/bucket/file1.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=t9XS183JYMrbWlieuXRz%2F20241205%2Fru-central1%2Fs3%2Faws4_request&X-Amz-Date=20241205T075426Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=ecb7b343c27b4582124cc7e8271a53db20006b9d86dff33719db1edcebeb9998

В ее состав входит подпись, а также некоторые дополнительные параметры:

ПараметрОписание
X-Amz-AlgorithmАлгоритм для генерации подписи
X-Amz-ExpiresВремя в секундах, в течение которого ссылка будет действительна. Может иметь значение от 60 (1 минута) до 604800 (7 дней) секунд
X-Amz-DateВремя и дата подписания запроса в формате YYYYMMDDThhmmss. Должна совпадать с датой в параметре X-Amz-Credential
X-Amz-SignedHeadersЗаголовки, которые были использованы при создании подписи (через запятую)
X-Amz-SignatureКриптографическая подпись, которая создается с помощью секретного ключа и подтверждает, что запрос был авторизован
X-Amz-CredentialУчетные данные, которые включают идентификатор ключа доступа и дату. Имеют формат вида <идентификатор ключа доступа>/<дата в формате YYYY-MM-DD>/<ru-central1>/<aws4-request>

Сгенерировать подписанную ссылку на скачивание объекта

Заголовок раздела «Сгенерировать подписанную ссылку на скачивание объекта»
  • AWS CLI
  • Python
  • Go
bash
aws s3 presign s3://<имя бакета>/<ключ объекта> --expires-in <срок действия ссылки в секундах>

Чтобы скачать объект, вставьте подписанную ссылку в адресную строку браузера. Скачивание начнется автоматически.

Также для скачивания можно использовать консольные утилиты — например, cURL:

bash
curl -o <имя, под которым будет сохранен объект> "<подписанная ссылка>"

Сгенерировать ссылку на загрузку объекта

Заголовок раздела «Сгенерировать ссылку на загрузку объекта»

Сгенерировать ссылку на загрузку объекта в Object Storage можно только с помощью SDK. В утилите AWS CLI генерация ссылок для загрузки не поддерживается.

  • Python
  • Go

Приведенный код на Python:

  1. Импортирует библиотеку boto3 — официальный AWS SDK для Python.
  2. Создает клиент и сессию для подключения к Object Storage.
  3. Определяет имя бакета, в который нужно загрузить объект, и имя, под которым объект будет загружен.
  4. Устанавливает для подписанной ссылки срок действия 10 минут (600 секунд).
  5. Генерирует и выводит подписанную ссылку на загрузку объекта.
python
import boto3
session = boto3.session.Session(profile_name='default')
s3 = session.client(
service_name='s3',
endpoint_url='https://storage.mwsapis.ru/'
)
presigned_url = s3.generate_presigned_url(
"put_object",
Params={"Bucket": "bucket", "Key": "file.txt"},
ExpiresIn=600,
)
print(presigned_url)

Загрузить объект по подписанной ссылке можно с помощью утилиты cURL:

bash
curl -X PUT -T <путь к файлу в локальной системе> "<подписанная ссылка>"