Роли, временные учётные данные и SigV4

Использование AWS Security для разработчиков

Rahul Singh

Technical Product Manager

Ключ, который переживает задачу

Чтобы ускорить работу, в скрипте создаётся ключ и сохраняется в конфигурационном файле.

В файле он:

  • Никогда не ротируется
  • Никогда не отзывается
  • Никогда не истекает

Один ключ доступа, распространяющийся в шесть мест хранения, с временной шкалой справа, показывающей, что он всё ещё действителен на восемнадцатом месяце

Использование AWS Security для разработчиков

Ключ, который переживает задачу

Чтобы ускорить работу, в скрипте создаётся ключ и сохраняется в конфигурационном файле.

В файле он:

  • Никогда не ротируется
  • Никогда не отзывается
  • Никогда не истекает

 

Спустя 18 месяцев он всё ещё действителен

Один ключ доступа, распространяющийся в шесть мест хранения, с временной шкалой справа, показывающей, что он всё ещё действителен на восемнадцатом месяце

Использование AWS Security для разработчиков

Учётные данные, которые истекают сами

Сделайте срок действия нормой с помощью AWS STS

  1. Запросите роль и получите учётные данные со встроенным таймером

  2. Security Token Service (STS): срок действия задан, по умолчанию один час

Приложение вызывает AssumeRole в AWS STS, и STS возвращает учётные данные со встроенным таймером.

Использование AWS Security для разработчиков

Учётные данные, которые истекают сами

Сделайте срок действия нормой с помощью AWS STS

  1. Запросите роль и получите учётные данные со встроенным таймером

  2. Временные учётные данные начинаются с ASIA и содержат токен сессии

  3. Security Token Service (STS): срок действия задан, по умолчанию один час

Приложение вызывает AssumeRole в AWS STS и получает учётные данные со встроенным таймером. Ниже — два вида учётных данных рядом: долгоживущий ключ, начинающийся с AKIA, без токена сессии и без срока действия, и временные учётные данные, начинающиеся с ASIA, с токеном сессии и сроком действия один час.

Использование AWS Security для разработчиков

Учётные данные, которые истекают сами

Сделайте срок действия нормой с помощью AWS STS

  1. Запросите роль и получите учётные данные со встроенным таймером

  2. Временные учётные данные начинаются с ASIA и содержат токен сессии

  3. Один и тот же вызов сначала принимается, а потом — нет

  4. Security Token Service (STS): срок действия задан, по умолчанию один час

Приложение вызывает AssumeRole в AWS STS и получает учётные данные со встроенным таймером. Ниже — долгоживущий ключ, начинающийся с AKIA, без срока действия, рядом с временными учётными данными, начинающимися с ASIA, с токеном сессии и сроком действия один час. Ещё ниже — один и тот же вызов GetObject: в десять часов возвращает 200 OK, а в одиннадцать часов пять минут — ExpiredToken.

Использование AWS Security для разработчиков

Как ваш код их находит

Проверка цепочки поставщиков учётных данных

  • Поиск выполняет AWS SDK — библиотека в вашем коде
  • Фиксированный список, проверяется по порядку
  • Останавливается на первом совпадении

Порядок поиска учётных данных: ключ, переданный в коде, зачёркнут над цепочкой, а поиск проходит по переменным окружения, конфигурационному файлу и учётным данным контейнера, останавливаясь на первом совпадении и не доходя до метаданных инстанса

Использование AWS Security для разработчиков

Как ваш код их находит

Проверка цепочки поставщиков учётных данных

  • Поиск выполняет AWS SDK — библиотека в вашем коде
  • Фиксированный список, проверяется по порядку
  • Останавливается на первом совпадении

 

Жёстко прописанные ключи проверяются первыми, поэтому их нужно удалить

Порядок поиска учётных данных: ключ, переданный в коде, зачёркнут над цепочкой, а поиск проходит по переменным окружения, конфигурационному файлу и учётным данным контейнера, останавливаясь на первом совпадении и не доходя до метаданных инстанса

Использование AWS Security для разработчиков

Цепочка, звено за звеном

1. explicit      a key passed in your code
2. environment   AWS_* variables, and on Lambda
                 that is the execution role
3. config file   ~/.aws/credentials
4. container     ECS or EKS task role
5. instance      EC2 instance profile, via IMDS
  • Побеждает первое совпадение
  • Удалите сохранённый ключ — поиск продолжится до роли
Использование AWS Security для разработчиков

Подтверждение личности вне AWS

Конвейеры кода часто выполняются вне AWS, поэтому цепочку учётных данных подключить нельзя

  • Запускается на GitHub или GitLab
  • Цепочке нечего найти

CI-раннер и его платформа изображены за пределами границы AWS, у раннера отмечено отсутствие роли для подключения, а платформа подписывает OIDC-токен, указывающий один репозиторий и один workflow

Использование AWS Security для разработчиков

Подтверждение личности вне AWS

Конвейеры кода часто выполняются вне AWS, поэтому цепочку учётных данных подключить нельзя

  • Запускается на GitHub или GitLab
  • Цепочке нечего найти

 

OIDC-токен (OpenID Connect)

  • Подписан и живёт недолго
  • Подтверждение личности, а не учётные данные

CI-раннер и его платформа изображены за пределами границы AWS, у раннера отмечено отсутствие роли для подключения, а платформа подписывает OIDC-токен, указывающий один репозиторий и один workflow

Использование AWS Security для разработчиков

Правило вместо хранимого ключа

OIDC-токен, указывающий репозиторий, обменивается через AssumeRoleWithWebIdentity на временные учётные данные со сроком действия один час, поскольку политика доверия роли уже содержит этого эмитента и этот репозиторий

Обмен токена на учётные данные

Использование AWS Security для разработчиков

Правило вместо хранимого ключа

OIDC-токен, указывающий репозиторий, обменивается через AssumeRoleWithWebIdentity на временные учётные данные со сроком действия один час, поскольку политика доверия роли уже содержит этого эмитента и этот репозиторий

Обмен токена на учётные данные

  • AssumeRoleWithWebIdentity: AssumeRole с внешним токеном в качестве подтверждения
  • Политика доверия: заранее прописана в роли, а не хранится в конвейере
  • Утверждение: один факт внутри токена
  • Эмитент общий для всех репозиториев платформы, поэтому закрепите и репозиторий

Секреты репозитория: теперь пусты

Использование AWS Security для разработчиков

Каждый запрос подписывается

Signature Version 4, или SigV4

  • Подтверждает, какие учётные данные сделали запрос
  • Подтверждает, что запрос не был изменён при передаче
  • Подписывается CLI и SDK при каждом вызове

Схема подписи: запрос и ваши учётные данные формируют подпись, отправляемую в заголовке Authorization, которую AWS пересчитывает и сравнивает, принимая запрос при совпадении и возвращая SignatureDoesNotMatch при несовпадении

Использование AWS Security для разработчиков

Подпись, которую можно передать

Временные учётные данные

  • Множество действий в рамках, заданных ролью
  • Хранятся в вашем коде

Ваш код обращается к четырём разным сервисам AWS — S3, DynamoDB, SQS и KMS — с временными учётными данными

Использование AWS Security для разработчиков

Подпись, которую можно передать

Временные учётные данные

  • Множество действий в рамках, заданных ролью
  • Хранятся в вашем коде

Предварительно подписанный URL

  • Один объект, одно действие — и доступ есть у любого, у кого есть ссылка
  • Срок действия выбираете вы, а потом — ничего
  • Несёт ваши права, а не права владельца ссылки

Ваш код обращается к четырём разным сервисам AWS — S3, DynamoDB, SQS и KMS — с временными учётными данными

Чужой браузер обращается ровно к одному объекту по единственному пути, а затем срабатывает таймер с установленным вами сроком действия

Использование AWS Security для разработчиков

Давайте потренируемся!

Использование AWS Security для разработчиков

Preparing Video For Download...