Доступ в бакет с помощью Security Token Service
С помощью Security Token Service вы можете получить временные ключи для ограниченного доступа в бакеты Yandex Object Storage.
Временные ключи доступа в качестве способа аутентификации поддерживаются только в сервисе Object Storage.
У вас должны быть следующие минимальные роли:
- для создания сервисного аккаунта и получения на него ключей доступа — iam.serviceAccounts.admin на каталог. Если вы хотите использовать существующий сервисный аккаунт, достаточно роли
iam.serviceAccounts.admin
на этот сервисный аккаунт. - для назначения сервисному аккаунту нужной роли — storage.admin на бакет или каталог. Альтернативно можно использовать разрешение
FULL_CONTROL
в ACL бакета.
Если у вас примитивная роль admin на каталог, назначать дополнительно роли не требуется.
Чтобы получить временный ключ доступа:
-
Создайте сервисный аккаунт. Вы также можете использовать существующий сервисный аккаунт.
-
Назначьте сервисному аккаунту нужную роль, например storage.viewer на бакет, к которому вы хотите получить доступ с помощью временного ключа, или каталог.
Примечание
Назначайте роль на каталог, если хотите с помощью сервисного аккаунта иметь доступ ко всем бакетам в каталоге.
Выбранная роль должна включать в себя все разрешения, которые вы хотите предоставлять с помощью временных ключей.
В качестве альтернативы можно использовать разрешения ACL для бакета.
-
Создайте статический ключ доступа для сервисного аккаунта.
-
Установите и сконфигурируйте AWS Command Line Interface (AWS CLI).
-
Опишите конфигурацию политики доступа в виде схемы данных формата JSON.
Временные ключи Security Token Service наследуют права доступа сервисного аккаунта, но ограничиваются политикой доступа. Если задать в политике доступа для временного ключа разрешения на выполнение операций, которые не разрешены для сервисного аккаунта, операции не будут выполнены.
Пример политики
Эта политика позволяет пользователю с временным ключом получать объекты из указанного префикса бакета.
{ "Version": "2012-10-17", "Statement": { "Sid": "all", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/<префикс>" } }
Где:
-
Version
— (опционально) версия описания политик доступа, например2012-10-17
. -
Statement
— правила политики доступа:Sid
— (опционально) пользовательский идентификатор правила, например:all
,Statement Allow
,Statement Deny
.Effect
— запрет или разрешение запрошенного действия, возможные значения:Allow
,Deny
.Principal
— возможное значение:*
. Параметр нужен для совместимости с AWS S3 API.Action
— действие, которое выполнится при срабатывании политики, например:s3:GetObject
,s3:PutObject
,*
.Resource
— ресурс, с которым будет произведено действие, возможные значения:-
arn:aws:s3:::<имя_бакета>
— бакет. -
arn:aws:s3:::<имя_бакета>/<ключ_объекта>
— объект в бакете. -
arn:aws:s3:::<имя_бакета>/<префикс>*
— все объекты в бакете, ключи которых начинаются с префикса, напримерarn:aws:s3:::samplebucket/some/path/*
. Префикс может быть пустым:arn:aws:s3:::samplebucket/*
— тогда правило будет относиться ко всем объектам в бакете.Ресурс бакета не включает в себя ресурсы всех его объектов. Чтобы правило в политике доступа относилось к бакету и всем объектам, их нужно указать как отдельные ресурсы, например
arn:aws:s3:::samplebucket
иarn:aws:s3:::samplebucket/*
.
-
Если при создании временных ключей доступа применить политику доступа без правил, то доступ по временному ключу будет запрещен.
Сохраните готовую конфигурацию в файле
policy.json
.Важно
Проверка доступа по ACL объекта происходит после проверки политики Security Token Service. Поэтому если для сервисного аккаунта, через который вы получаете временные ключи доступа, настроены разрешения ACL на объекты в бакете, эти объекты станут доступны для запросов с временным ключом доступа, независимо от указанной политики. Подробнее см. на схеме взаимодействия механизмов управления доступом в Object Storage.
-
-
Получите временный ключ доступа:
AWS CLIВыполните команду:
aws --endpoint https://sts.yandexcloud.net/ sts assume-role \ --role-arn <произвольное_описание> \ --role-session-name <имя_ключа> \ --duration-seconds <время_жизни_ключа> \ --policy file://policy.json
Где:
--endpoint
— эндпоинт Security Token Service.--role-arn
— произвольное описание длиной не менее 20 символов. Поддерживаются буквы латинского алфавита, цифры, символы_
и-
.--role-session-name
— уникальное имя ключа. Поддерживаются буквы латинского алфавита, цифры, символы_
и-
.--duration-seconds
— время жизни ключа в секундах, не более43200
.--policy file://
— путь к файлу с политикой доступа.
Подробнее о команде
aws sts assume-role
см. в документации AWS .Результат:
{ "Credentials": { "AccessKeyId": "YCAJEkNuezZyt4b**********", "SecretAccessKey": "YCMUWwxFAnZ**********...", "SessionToken": "s1.9euelZqPjcj**********...", "Expiration": "2024-02-29T23:30:53+00:00" }, "AssumedRoleUser": { "Arn": "a1234567891234567890/test-2" }, "PackedPolicySize": 0, "SourceIdentity": "" }
Где:
AccessKeyId
— идентификатор ключа (совпадает с идентификатором статического ключа).SecretAccessKey
— секретный ключ.SessionToken
— токен сессии.
Сохраните эти параметры.
-
Добавьте полученные параметры временного ключа доступа в переменные окружения для пользователя, которому вы хотите выдать права доступа к бакету:
export AWS_ACCESS_KEY_ID=<идентификатор_ключа> export AWS_SECRET_ACCESS_KEY=<секретный_ключ> export AWS_SESSION_TOKEN=<токен_сессии>
-
Чтобы протестировать доступ к бакету, сохраните на клиентское устройство объект из префикса бакета, к которому был открыт доступ:
AWS CLIaws --endpoint https://storage.yandexcloud.net s3 cp \ s3://<имя_бакета>/<префикс><имя_объекта> ./
Результат:
download: s3://<имя_бакета>/<префикс><имя_объекта> to ./<имя_объекта>