Использование секрета Yandex Lockbox для хранения статического ключа доступа
Если вы часто используете сервисы с AWS-совместимым API, например Yandex Object Storage, Yandex Data Streams или Yandex Message Queue, вам приходится самостоятельно заботиться о безопасном хранении статических ключей доступа.
В данном руководстве рассматривается сценарий, при котором в качестве хранилища для статического ключа доступа используется секрет Yandex Lockbox. При этом значение ключа доступа не только не хранится локально на компьютере пользователя, но и не выводится на экран.
При обращении к ресурсу AWS-совместимого сервиса (Object Storage) статический ключ доступа и его идентификатор будут извлекаться из секрета Yandex Lockbox в специальные переменные окружения, которые будут использоваться для аутентификации запроса.
Такой подход позволит обеспечить безопасность хранения ключа и его использования при обращении к сервисам.
Чтобы использовать статический ключ доступа, сохраненный в секрете Yandex Lockbox:
- Подготовьте окружение.
- Сохраните статический ключ доступа в секрет Yandex Lockbox.
- Используйте ключ из секрета Yandex Lockbox для работы с сервисом.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
Будет взиматься плата за хранение одной версии секрета Yandex Lockbox (см. тарифы Yandex Lockbox).
Плата за бакет Object Storage не будет взиматься, если в бакете не будут храниться данные (см. тарифы Object Storage).
Подготовьте окружение
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Установите
утилиту командной строки AWS CLI.Настраивать утилиту не обязательно — все необходимые параметры будут передаваться в команде и переменных окружения.
Сохраните статический ключ доступа в секрет Yandex Lockbox
-
Создайте сервисный аккаунт, например
storage-bucket-sa
, от имени которого будут выполняться операции в Object Storage:yc iam service-account create storage-bucket-sa
Результат:
done (1s) id: ajeplujf759j******** folder_id: b1gt6g8ht345******** created_at: "2024-05-07T19:18:37.244159066Z" name: storage-bucket-sa
Сохраните идентификатор (
id
) созданного сервисного аккаунта, он понадобится при назначении сервисному аккаунту ролей.Подробнее о команде
yc iam service-account create
читайте в справочнике CLI. -
Назначьте созданному сервисному аккаунту роль
storage.editor
на каталог:yc resource-manager folder add-access-binding <имя_или_идентификатор_каталога> \ --role storage.editor \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
Где:
<имя_или_идентификатор_каталога>
— имя или идентификатор каталога, в котором создан сервисный аккаунт.<идентификатор_сервисного_аккаунта>
— идентификатор сервисного аккаунта, сохраненный ранее.
Результат:
done (2s) effective_deltas: - action: ADD access_binding: role_id: storage.editor subject: id: ajeplujf759j******** type: serviceAccount
Подробнее о команде
yc resource-manager folder add-access-binding
читайте в справочнике CLI. -
Аналогичным способом назначьте сервисному аккаунту роль
lockbox.payloadViewer
на каталог:yc resource-manager folder add-access-binding <имя_или_идентификатор_каталога> \ --role lockbox.payloadViewer \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
-
Создайте для сервисного аккаунта статический ключ доступа. Для того чтобы не выводить на экран значение ключа, он будет сохранен в переменную
STATIC_KEY
:STATIC_KEY=$(yc iam access-key create --service-account-name storage-bucket-sa)
Подробнее о команде
yc iam access-key create
читайте в справочнике CLI. -
Сохраните значения идентификатора ключа и секретного ключа в отдельные переменные
KEY_ID
иKEY_VALUE
:KEY_ID=$(echo | awk '{if (match($0, "key_id: ")) {print substr($0, RSTART + 8, 25)}}' <<< "$STATIC_KEY") \ && KEY_VALUE=$(echo | awk '{if (match($0, "secret: ")) {print substr($0, RSTART + 8, 40)}}' <<< "$STATIC_KEY")
-
Создайте секрет Yandex Lockbox
static-key
, содержащий созданный статический ключ доступа:yc lockbox secret create \ --name static-key \ --payload "[{'key': $KEY_ID, 'text_value': $KEY_VALUE}]" \ --cloud-id <идентификатор_облака> \ --folder-id <идентификатор_каталога> \ --deletion-protection
Где:
--cloud-id
— идентификатор облака, в котором был создан сервисный аккаунт.--folder-id
— идентификатор каталога, в котором был создан сервисный аккаунт.--deletion-protection
— защита от удаления секрета. Пока опция включена, удалить секрет невозможно. Необязательный параметр.
Результат:
done (1s) id: e6qk0c62b4ep******** folder_id: b1gt6g8ht345******** created_at: "2024-05-07T20:05:51.569Z" name: static-key status: ACTIVE current_version: id: e6qrsj2hi8ug******** secret_id: e6qk0c62b4ep******** created_at: "2024-05-07T20:05:51.569Z" status: ACTIVE payload_entry_keys: - YCAJEO4w80Zf5DERM******** deletion_protection: true
Подробнее о команде
yc lockbox secret create
читайте в справочнике CLI.
Теперь статический ключ доступа сервисного аккаунта сохранен внутри секрета Yandex Lockbox.
Используйте ключ из секрета Yandex Lockbox для работы с сервисом
-
Получите статический ключ доступа, сохраненный в секрете
static-key
. Для того чтобы не выводить на экран значение ключа, он будет сохранен в переменнуюSECRET
:Yandex Cloud CLISECRET=$(yc lockbox payload get static-key)
Подробнее о команде
yc lockbox payload get
читайте в справочнике CLI. -
Сохраните идентификатор ключа, секретный ключ и значение региона размещения в переменные окружения AWS CLI:
export AWS_ACCESS_KEY_ID=$(echo | awk '{if (match($0, "key: ")) {print substr($0, RSTART + 5, 25)}}' <<< "$SECRET") \ && export AWS_SECRET_ACCESS_KEY=$(echo | awk '{if (match($0, "text_value: ")) {print substr($0, RSTART + 12, 40)}}' <<< "$SECRET") \ && export AWS_DEFAULT_REGION="ru-central1"
AWS CLI будет использовать созданные переменные окружения для аутентификации при выполнении операций с ресурсами сервиса.
-
Создайте бакет в Object Storage, указав в команде уникальное имя бакета:
AWS CLIaws --endpoint-url=https://storage.yandexcloud.net \ s3 mb s3://<имя_бакета>
Результат:
make_bucket: my-first-bucket
В сервисе Yandex Object Storage был создан новый бакет. Для аутентификации при выполнении этой операции был использован статический ключ доступа, полученный из секрета Yandex Lockbox и сохраненный в переменные окружения.
Вы также можете не создавать переменные окружения, а передавать значения идентификатора ключа, секретного ключа и региона размещения непосредственно в каждой команде AWS CLI:
AWS CLIAWS_ACCESS_KEY_ID=$(echo | awk '{if (match($0, "key: ")) {print substr($0, RSTART + 5, 25)}}' <<< "$SECRET") \ AWS_SECRET_ACCESS_KEY=$(echo | awk '{if (match($0, "text_value: ")) {print substr($0, RSTART + 12, 40)}}' <<< "$SECRET") \ AWS_DEFAULT_REGION="ru-central1" \ aws --endpoint-url=https://storage.yandexcloud.net \ s3 mb s3://<имя_бакета>
Результат:
make_bucket: my-first-bucket
Как удалить созданные ресурсы
Чтобы перестать использовать созданные ресурсы: