Yandex.Cloud
  • Сервисы
  • Почему Yandex.Cloud
  • Сообщество
  • Решения
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Yandex Object Storage
  • Начало работы
  • Пошаговые инструкции
    • Все инструкции
    • Бакеты
      • Создание бакета
      • Удаление бакета
      • Ограничение максимального размера бакета
      • Открытие публичного доступа к бакету
      • Шифрование бакета
      • Управление жизненными циклами объектов
      • Управление конфигурацией CORS
      • Редактирование ACL бакета
      • Включение механизма логированния
    • Объекты
      • Загрузка объекта
      • Получение информации об объекте
      • Скачивание объекта
      • Получение публичной ссылки на объект
      • Удаление объекта
      • Удаление частично загруженного объекта
      • Редактирование ACL объекта
    • Хостинг статических сайтов
      • Настройка хостинга
      • Поддержка собственного домена
      • Поддержка нескольких доменных имен
      • Настройка HTTPS
  • Концепции
    • Обзор
    • Бакет
    • Объект
    • Версионирование бакета
    • Жизненные циклы объектов
    • CORS
    • Хостинг статических сайтов
    • Подписанные (pre-signed) URL
    • Составная (multipart) загрузка
    • Список управления доступом (ACL)
    • Политика доступа (Bucket Policy)
    • Загрузка файла через HTML форму
    • Класс хранилища
    • Механизм логирования действий с бакетом
    • Резервное копирование
    • Протокол TLS
    • Квоты и лимиты
  • Инструменты
    • Все инструменты
    • Консольные клиенты
      • AWS CLI
      • S3cmd
    • Файловые браузеры
      • CyberDuck
      • WinSCP
    • SDK
      • AWS SDK для Java
      • Python SDK (boto)
    • FUSE
      • s3fs
      • goofys
  • HTTP API, совместимый с Amazon S3
    • Как пользоваться API
    • Подписывание запросов
    • Справочник API
      • Все сервисы и методы
      • Bucket
        • Все методы
        • create
        • getBucketEncryption
        • getMeta
        • listObjects
        • listBuckets
        • deleteBucket
        • deleteBucketEncryption
        • putBucketEncryption
        • putBucketVersioning
        • getBucketVersioning
        • putBucketLogging
        • getBucketLogging
        • listObjectVersions
      • Object
        • Все методы
        • upload
        • get
        • copy
        • getObjectMeta
        • delete
        • deleteMultipleObjects
        • options
      • Multipart upload
        • Общий порядок составной загрузки
        • startUpload
        • uploadPart
        • copyPart
        • listParts
        • abortUpload
        • completeUpload
        • listUploads
      • Static Website Hosting
        • Все методы
        • upload
        • get
        • delete
        • Коды ответов статического сайта
      • CORS
        • Все методы
        • XML-структура конфигурации CORS
        • upload
        • get
        • delete
      • Lifecycles
        • Все методы
        • XML-структура конфигурации жизненных циклов
        • upload
        • get
        • delete
      • ACL
        • Все методы
        • XML-структура конфигурации ACL
        • objectGetAcl
        • objectPutAcl
        • bucketGetAcl
        • bucketPutAcl
      • Bucket Policy
        • Все методы
        • GetBucketPolicy
        • PutBucketPolicy
        • DeleteBucketPolicy
        • Схема данных
        • Действия
        • Условия
      • Общие заголовки запросов
      • Общие заголовки ответов
      • Ответы
  • Управление доступом
  • Правила тарификации
    • Действующие правила
    • Архив
      • До 1 января 2019 года
      • С 1 января до 1 марта 2019 года
  • Вопросы и ответы
  1. Концепции
  2. Подписанные (pre-signed) URL

Подписанные (pre-signed) URL

  • Общий вид подписанного URL
  • Составление подписанного URL
    • Строка для подписи
    • Канонический запрос
    • Подписанный URL
  • Примеры получения подписанной ссылки в инструментах Object Storage

С помощью подписанных URL произвольный пользователь интернета может выполнять в Object Storage различные операции, например:

  • Скачать объект
  • Загрузить объект
  • Создать бакет

Подписанный URL — это URL, содержащий данные для авторизации запроса в своих параметрах. Составить подписанный URL может пользователь, владеющий статическими ключами доступа.

Раздел содержит общие принципы построения подписанного URL с использованием AWS Signature V4.

Примечание

SDK для различных языков программирования и другие инструменты для работы с AWS S3 содержат готовые методы генерирования подписанного URL, которые можно использовать и для Object Storage.

Общий вид подписанного URL

https://storage.yandexcloud.net/<имя бакета>/<ключ объекта>?
     X-Amz-Algorithm=AWS4-HMAC-SHA256
    &X-Amz-Expires=<интервал времени в секундах>
    &X-Amz-SignedHeaders=<список заголовков разделенный символами ";">
    &X-Amz-Signature=<подпись>
    &X-Amz-Date=<время в формате ISO 8601>
    &X-Amz-Credential=<access-key-id>%2F<YYYYMMDD>%2Fru-central1%2Fs3%2Faws4_request

Параметры подписанного URL:

Параметр Описание
X-Amz-Algorithm Идентифицирует версию подписи и алгоритм ее вычисления. Значение — AWS4-HMAC-SHA256.
X-Amz-Expires Время в секундах в течение которого ссылка действительна. Начало отсчета — момент, указанный в X-Amz-Date. Максимальное значение — 604800 секунд (7 дней).
X-Amz-SignedHeaders Заголовки запроса, которые вы хотите подписать.

Обязательно подписывайте заголовок host и все заголовки x-amz-*, которые используются в запросе. Другие заголовки подписывать не обязательно, однако чем больше вы подпишете заголовков, тем безопаснее будет запрос.
X-Amz-Signature Подпись запроса.
X-Amz-Date Время в формате ISO8601, например, 20180719T000000Z. Указанная дата должна по значению (не по формату) совпадать с датой в параметре X-Amz-Credential.
X-Amz-Credential Идентификатор для подписи.

Строка формата <access-key-id>/<YYYYMMDD>/ru-central1/s3/aws4_request, где <YYYYMMDD> должна совпадать с датой, установленной в заголовке X-Amz-Date.

Составление подписанного URL

Чтобы получить подписанный URL необходимо:

  1. Вычислить подпись.
    1. Составьте строку для подписи.
    2. Вычислите подпись с помощью алгоритма подписи строк.
  2. Составить подписанный URL для своего запроса.

Для составления подписанного URL необходимо владеть статическими ключами доступа.

Строка для подписи

Строка для подписи:

"AWS4-HMAC-SHA256" + "\n" +
<timestamp> + "\n" +
<scope> + "\n" +
Hex(Hash-SHA256(<CanonicalRequest>))
  • AWS4-HMAC-SHA256 — алгоритм хэширования.
  • timestamp — текущее время в формате ISO 8601, например, 20190801T000000Z. Указанная дата должна по значению (не по формату) совпадать с датой в scope.
  • scope — <YYYYMMDD>/ru-central1/s3/aws4_request.
  • CanonicalRequest — канонический запрос. Чтобы включить запрос в строку, захэшируйте его по алгоритму SHA256 и преобразуйте в шестнадцатеричное представление.

Канонический запрос

Общий вид канонического запроса:

<HTTPVerb>\n
<CanonicalURL>\n
<CanonicalQueryString>\n
<CanonicalHeaders>\n
<SignedHeaders>\n
UNSIGNED-PAYLOAD

Строка UNSIGNED-PAYLOAD всегда должна завершать канонический запрос.

HTTPVerb

HTTP метод, которым будет отправлен запрос: GET, PUT, HEAD или DELETE.

CanonicalURL

URL-кодированный путь к ресурсу. Например, /<bucket-name>/<object-key>.

Примечание

Не нормализуйте путь. Например, объект может иметь ключ some//strange//key//example и нормализация пути /<bucket-name>/some/strange/key/example сделает ключ некорректным.

CanonicalQueryString

Каноническая строка запроса должна включать все query параметры конечного URL, кроме X-Amz-Signature. Параметры в строке должны быть URL-кодированы и отсортированы по алфавиту.

Пример:

X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=JK38EXAMPLEAKDID8%2F20190801%2Fru-central1%2Fs3%2Faws4_request&X-Amz-Date=20190801T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host

CanonicalHeaders

Список заголовков запроса со значениями.

Требования:

  • Каждый заголовок отделяется символом новой строки "\n".
  • Имена заголовков должны быть в нижнем регистре.
  • Заголовки должны быть отсортированы по алфавиту.
  • Не должно быть лишних пробелов.
  • Список должен содержать заголовок host и все заголовки x-amz-*, которые используются в запросе.

Дополнительно в список можно добавить любой из заголовков запроса. Чем больше вы подпишете заголовков, тем безопаснее будет запрос.

Пример:

host:storage.yandexcloud.net
x-amz-date:20190801T000000Z

SignedHeaders

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

Пример:

host;x-amz-date

Подписанный URL

Чтобы составить подписанный URL, к URL ресурса Object Storage добавьте параметры, необходимые для авторизации запроса, в том числе параметр X-Amz-Signature с вычисленной подписью.

Пример составления подписанного URL для скачивания объекта

Составим подписанный URL для скачивания объекта object-for-share.txt из бакета example-bucket в течение часа.

  • Статический ключ:

    access_key_id = 'JK38EXAMPLEAKDID8'
    secret_access_key = 'ExamP1eSecReTKeykdokKK38800'
    
  • Канонический запрос:

    GET
    /example-bucket/object-for-share.txt
    X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=JK38EXAMPLEAKDID8%2F20190801%2Fru-central1%2Fs3%2Faws4_request&X-Amz-Date=20190801T000000Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host
    host:storage.yandexcloud.net
    
    host
    UNSIGNED-PAYLOAD
    
  • Строка для подписи:

    AWS4-HMAC-SHA256
    20190801T000000Z
    20190801/ru-central1/s3/aws4_request
    2d2b4efefa9072d90a646afbc0fbaef4618c81396b216969ddfc2869db5aa356
    
  • Подписывающий ключ:

    sign(sign(sign(sign("AWS4" + "ExamP1eSecReTKeykdokKK38800","20190801"),"ru-central1"),"s3"),"aws4_request")
    
    

    Функция sign введена для обозначения способа вычисления ключа с помощью механизма HMAC с хэширующей функцией SHA256.

  • Подпись:

    56bdf53a1f10c078c2b4fb5a26cefa670b3ea796567d85489135cf33e77783f0
    
  • Подписанный URL:

    https://storage.yandexcloud.net/example-bucket/object-for-share.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=JK38EXAMPLEAKDID8%2F20190801%2Fru-central1%2Fs3%2Faws4_request&X-Amz-Date=20190801T000000Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=56bdf53a1f10c078c2b4fb5a26cefa670b3ea796567d85489135cf33e77783f0
    

Примеры получения подписанной ссылки в инструментах Object Storage

Консоль управления
AWS CLI
boto3
  1. В консоли управления выберите каталог.
  2. Выберите сервис Object Storage.
  3. Нажмите на имя необходимого бакета.
  4. Нажмите на имя объекта.
  5. Нажмите кнопку Получить ссылку.
  6. Если у вас бакет с ограниченным доступом:
    1. В открывшемся окне укажите Время жизни ссылки в часах или днях. Максимальное время жизни ссылки — 7 дней.
    2. Нажмите кнопку Получить ссылку.
  7. Скопируйте полученную ссылку.

Ссылку на скачивание объекта также можно сгенерировать с помощью AWS CLI. Для этого выполните команду вида:

aws s3 presign s3://<bucket-name>/<object-key> [--expires-in <value>]

Пример генерирует подписанный URL для скачивания объекта object-for-share из бакета bucket-with-objects. URL действителен в течение 100 секунд.

# coding=utf-8

import boto3
from botocore.client import Config


ENDPOINT = "https://storage.yandexcloud.net"

ACCESS_KEY = "JK38EXAMPLEAKDID8"
SECRET_KEY = "ExamP1eSecReTKeykdokKK38800"

session = boto3.Session(
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY,
    region_name="ru-central1",
)
s3 = session.client(
    "s3", endpoint_url=ENDPOINT, config=Config(signature_version="s3v4")
)

presigned_url = s3.generate_presigned_url(
    "get_object",
    Params={"Bucket": "bucket-with-objects", "Key": "object-for-share"},
    ExpiresIn=100,
)

print(presigned_url)
В этой статье:
  • Общий вид подписанного URL
  • Составление подписанного URL
  • Строка для подписи
  • Канонический запрос
  • Подписанный URL
  • Примеры получения подписанной ссылки в инструментах Object Storage
Language
Вакансии
Политика конфиденциальности
Условия использования
© 2021 ООО «Яндекс.Облако»