STS-токены
Назначение
STS-токены позволяют приложениям и автоматизированным системам получать временные учётные данные для работы с S3 API. Вместо постоянной передачи долгоживущих ключей пользователя система выдаёт ограниченный по времени набор credentials:
AccessKeyId;SecretAccessKey;SessionToken;- время окончания действия
Expiration.
Такой механизм подходит для интеграций, фоновых заданий и других автоматизированных сценариев, которым доступ к объектам нужен только на ограниченный срок, а также упрощает подключение готовых решений, рассчитанных на стандартный сценарий AWS STS.
Функция не требует отдельного включения: в релизе, где она доступна, API работает по умолчанию на S3-интерфейсе рабочей области.
Как работает STS
- Пользователь или приложение с постоянными S3-credentials вызывает метод
AssumeRoleна STS endpoint рабочей области. - ЗАКРОМА.Хранение проверяет подпись запроса и наличие у субъекта права
sts:AssumeRoleв применимой политике доступа. - Сервис возвращает временные
AccessKeyId(с префиксомASIA),SecretAccessKeyиSessionToken, а также срок их действия. - Клиент использует все три значения при выполнении обычных S3-операций: запрос подписывается по AWS Signature Version 4 (
SigV4), аSessionTokenпередаётся вместе с запросом (заголовокX-Amz-Security-Tokenили query-параметр). - При каждом запросе система проверяет подпись, подлинность и срок действия токена, состояние родительского пользователя и его ключа, а также применимые политики доступа.
Временные credentials не создают отдельную постоянную учётную запись и не хранятся на стороне сервиса как самостоятельные ключи доступа — необходимые для проверки сведения содержатся в защищённом токене (JWT).
Параметр RoleArnПараметры AWS вроде
RoleArnпринимаются для совместимости с AWS CLI и SDK, но в текущей реализации не влияют на выбор identity: временная сессия наследует пользователя — владельца родительского статического ключа.
Поддерживаемые методы
| Метод | Назначение |
|---|---|
AssumeRole | Выдаёт временные credentials для сессии от имени родительского пользователя |
GetCallerIdentity | Возвращает идентификатор и ARN субъекта, от имени которого выполняется запрос |
RoleSessionName, переданный при вызове AssumeRole, идентифицирует конкретную временную сессию (в токене, ARN сессии и параметрах аудита выдачи). Рекомендуется задавать осмысленное и уникальное имя. Если имя не передано, используется значение по умолчанию session.
Кто может получать STS-токены
Вызов AssumeRole доступен не всем пользователям автоматически — право на эту операцию (sts:AssumeRole) назначается через политики доступа ЗАКРОМА.Хранение. Временные credentials может получить любой тип пользователя, для которого явно разрешён AssumeRole, включая локального пользователя рабочей области. Само по себе наличие постоянных S3-ключей не означает, что их владелец может выпускать STS-токены.
Права временной сессии
STS-токен не может расширить права пользователя, от имени которого он выпущен.
Если при вызове AssumeRole не передана дополнительная session policy, временная сессия наследует S3-операции, разрешённые родительскому пользователю политиками доступа. Если session policy передана, она может только сузить доступ. Эффективные права временной сессии — это пересечение операций, разрешённых родительскому пользователю политиками доступа, и операций, разрешённых session policy.
Например, если политика пользователя разрешает загрузку и удаление объектов, а session policy разрешает только загрузку, временная сессия сможет загружать объекты, но не сможет их удалять.
Права, назначенные через ACL, не наследуютсяПрава, предоставленные родительскому пользователю только через ACL, не наследуются его временной STS-сессией. Для запросов с временными credentials ACL-fallback не применяется. Чтобы STS-сессия получила доступ к объекту, требуемая операция должна быть явно разрешена политикой доступа.
Срок действия и отзыв токена
По умолчанию временные credentials выдаются на один час (3600 секунд; значение задаётся конфигурацией gateway). Другой срок можно запросить параметром DurationSeconds в пределах минимума и максимума конфигурации (по умолчанию от 15 минут до 1 года).
После наступления Expiration токен перестаёт действовать, и приложение должно получить новый набор credentials.
Индивидуальный отзыв не поддерживаетсяОтозвать уже выданный STS-токен по отдельности в текущей реализации нельзя — токен действует до истечения заданного срока. Рекомендуется выдавать токен на минимально необходимое время, ограничивать session policy только нужными операциями и ресурсами, не передавать credentials между независимыми приложениями и не записывать
SecretAccessKey/SessionTokenв журналы. При подозрении на компрометацию используйте отзыв или ротацию родительского access key (см. Управление ключами доступа).
Использование через AWS CLI
Для получения временных credentials нужны: endpoint рабочей области (тот же, что используется для S3), постоянные credentials пользователя, которому разрешён AssumeRole, --role-arn (обязателен для AWS CLI, на логику выдачи не влияет) и --role-session-name.
1ENDPOINT='https://<workspace-gateway-host>' 2 3aws sts assume-role \ 4 --endpoint-url "$ENDPOINT" \ 5 --region us-east-1 \ 6 --role-arn 'arn:aws:iam::<workspace>:role/unused' \ 7 --role-session-name '<session-name>' \ 8 --duration-seconds 3600
Опционально можно передать session policy через --policy file://session-policy.json.
В ответе возвращается блок Credentials:
1{ 2 "Credentials": { 3 "AccessKeyId": "<temporary-access-key-id>", 4 "SecretAccessKey": "<temporary-secret-access-key>", 5 "SessionToken": "<session-token>", 6 "Expiration": "<expiration-timestamp>" 7 } 8}
Для выполнения S3-операций необходимо передать клиенту все три значения:
1export AWS_ACCESS_KEY_ID='<temporary-access-key-id>' 2export AWS_SECRET_ACCESS_KEY='<temporary-secret-access-key>' 3export AWS_SESSION_TOKEN='<session-token>' 4 5aws s3api list-objects-v2 \ 6 --endpoint-url "$ENDPOINT" \ 7 --region us-east-1 \ 8 --bucket '<bucket-name>'
SessionToken обязателенЕсли указать только
AccessKeyIdиSecretAccessKey, запрос с временными credentials не будет аутентифицирован — для STS-сессии обязателенSessionToken.
Проверить identity можно с помощью GetCallerIdentity на том же endpoint:
1aws sts get-caller-identity --endpoint-url "$ENDPOINT" --region us-east-1
Использование через SDK и сторонние S3-клиенты
Подходит любой клиент, который одновременно подписывает запросы по SigV4, поддерживает временные credentials, передаёт SessionToken вместе с AccessKeyId/SecretAccessKey и позволяет указать пользовательский endpoint рабочей области. Клиент, принимающий только пару AccessKeyId/SecretAccessKey, для работы с STS-токеном не подходит.
Использование через zcli
zcli может вызвать AssumeRole командой zcli sts assume-role (алиас sts ar) — запрос идёт на S3 STS endpoint рабочей области с помощью JWT-аутентификации. Полученные временные credentials выводятся в JSON.
zcli не использует полученный токен
zcliне подставляетSessionTokenв последующие команды работы с объектами — session token из ответа предназначен для внешних клиентов (AWS CLI, SDK и т. п.). Для S3-операций с временными credentials используйте AWS CLI, совместимый SDK или другой клиент с поддержкой session token.
Endpoint и аудит
Для внешних клиентов (AWS CLI, SDK и т. п.) STS API размещается на S3-интерфейсе рабочей области (POST /?Action=<AssumeRole|GetCallerIdentity>&Version=2011-06-15) — тот же базовый URL, что и для обычных S3-операций. zcli обращается к AssumeRole через собственный служебный канал (JWT-аутентификация), а не через этот S3-интерфейс — подробнее см. CLI.
Выпуск временных credentials (AssumeRole) регистрируется в аудите от имени родительского пользователя. Последующие S3-операции с временными credentials в поле пользователя аудита также отражаются как операции родительского пользователя — имя сессии и временный access key в этом поле не подставляются автоматически.
Возможные причины отказа в доступе
| Ситуация | Что проверить |
|---|---|
Не удаётся вызвать AssumeRole | Есть ли у родительского пользователя явное разрешение sts:AssumeRole; верны ли endpoint и SigV4 |
| Токен получен, но S3-операция запрещена | Разрешена ли операция родительскому пользователю политикой доступа и не исключена ли она session policy |
| Доступ родителя основан на ACL, но STS-сессия получает отказ | ACL родителя для STS не действует — нужна явная политика доступа |
| Клиент отклоняет временные credentials | Поддерживает ли клиент SessionToken и передаются ли все три значения |
| Ранее работавшие credentials перестали действовать | Не истёк ли срок Expiration и не изменилось ли состояние родительского пользователя или ключа |
Ограничения
- Индивидуальный отзыв выпущенного STS-токена не поддерживается.
- Права, полученные родительским пользователем только через ACL, не переходят к временной сессии.
RoleArnи ряд других AWS-параметров принимаются для совместимости с клиентами, но не задают отдельную IAM-роль.zcliможет получить временные credentials, но не использует их для S3-операций.- Клиент обязан поддерживать
SigV4и передачуSessionToken.