Безопасное использование секретов Yandex Lockbox в бессерверных средах

Рассказываем, как надёжно и безопасно использовать секреты при работе с Cloud Functions, Serverless Containers, Terraform и при чём здесь Yandex Lockbox.

Для создания современных продуктов с использованием различных форматов бессерверных вычислений необходимо передавать пароли и другую чувствительную информацию для доступа к базам данных, внешним или облачным API, а также другим сервисам платформы. В Yandex Cloud такую информацию называют секретами. Сегодня вы узнаете, как защищать и хранить конфиденциальные данные, а также контролировать доступ к ним при использовании бессерверных вычислений. Мы немного затронем и Terraform, поскольку функции можно создавать как с его помощью, так и из консоли управления Yandex Cloud.

Можно назвать три основных способа хранения и получения секретов в вашем проекте:

  1. Переменные окружения.

  2. Сервис метаданных либо контекст обработчика внутри функции для получения IAM‑токена. Подходит только для токена доступа к облачному API. Подробнее см. в документации.

  3. Секреты Yandex Lockbox.

Разберём особенности каждого способа. Но прежде посмотрим, что может понадобиться для работы с секретами:

  • Сервисный аккаунт, от имени которого программы могут управлять ресурсами в Yandex Cloud.

  • Модули Terraform, если вы будете создавать функции с помощью Terraform.

  • Ключ шифрования. Вы можете создать его в Yandex Key Management Service — сервисе для управления криптографическими ключами, которые защищают секреты, личные данные и другую конфиденциальную информацию.

Способ № 1. Переменные окружения

Создадим функцию для теста.

В консоли управления Yandex Cloud

Укажем переменную окружения с паролем:

Запустим тест, который вызовет наш секрет из переменной окружения:

Пароль получен из переменной $PASS.

Посмотрим, какая информация о функции доступна под учётной записью с ролью viewer:

Обратите внимание: пароль отображается в открытом виде. Это из‑за того, что переменные окружения не предназначены для хранения паролей.

С помощью Terraform

Создадим функцию через Terraform с помощью yandex_function. Если указать переменные окружения «ключ-значение» для облачной функции в блоке environment, то секрет будет храниться в открытом виде в вашем файле с расширением .tfstate. А всё потому, что это поле не предназначено для хранения чувствительной информации

Получается, что данный способ хранения и получения секретов небезопасен. У него нет плюсов, зато есть минусы:

  • пользователям с ролью viewer и выше доступен ваш секрет в открытом виде;

  • при создании функции через Terraform секрет будет отображаться в .tfstate в открытом виде.

Способ № 2. Сервис метаданных либо контекст обработчика внутри функции для получения IAM‑токена

В консоли управления Yandex Cloud

Назначим сервисный аккаунт на функцию:

В редакторе кода укажем строку с получением токена сервисного аккаунта через сервис метаданных.

curl -H Metadata-Flavor:Google 169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token

Протестируем функцию и увидим, что в ответ нам выдаётся IAM‑токен.

Как вы можете видеть, это более безопасный способ получить токен сервисного аккаунта. Но подходит он, как мы уже сказали, только для хранения токена для доступа к облачному API.

Способ № 3. Секреты Yandex Lockbox

В Yandex Cloud есть собственный сервис управления секретами — Yandex Lockbox. С его помощью можно нативно использовать секрет прямо из вашей функции, обращаясь к значению ключа как переменной окружения. При этом секрет защищён и находится в Yandex Lockbox.

Для более надёжной защиты советуем использовать ключ KMS. Вы сможете шифровать секрет с помощью этого ключа.

В консоли управления Yandex Cloud

Создадим секрет Yandex Lockbox (не забудьте указать ключ KMS):

Теперь используем этот секрет в нашей версии функции. Чтобы функция получила доступ к секрету, в параметрах укажите сервисный аккаунт, у которого есть роль lockbox.payloadViewer.

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

Поскольку мы используем шифрование KMS, то необходимо предоставить права доступа и на KMS‑ключ. Например, через yc cli:

yc kms symmetric-key add-access-binding --id <id вашего ключа KMS> --service-account-name test --role kms.keys.encrypterDecrypter --folder-id <ваш id каталога>

Укажем в новой версии функции, что мы хотим использовать секрет Yandex Lockbox:

Обращаться к ней будем как к переменной окружения: echo $LOCKPASS. Пробуем запустить функцию:

Всё получилось! Если необходимо, изучите инструкцию о том, как назначить права доступа на ключ шифрования.

С помощью Terraform

В Terraform нужно аналогичным образом создать функцию и ссылаться на созданный ранее секрет Yandex Lockbox. Содержимое секрета не будет передаваться в явном виде, ваш секрет не окажется в открытом виде в .tfstate.

Таким образом, это безопасный способ получить любой секрет из защищённого хранилища.

Подведем итоги

Итак, мы описали три варианта хранения и получения секретов. Давайте ещё раз посмотрим на особенности каждого способа хранения и передачи секретов.

Способ

Плюсы

Особенности

1

Переменные окружения

Нет

  • Пользователям с ролью viewer и выше доступен ваш секрет в открытом виде
  • При создании функции через Terraform секрет будет отображаться в .tfstate в открытом виде

2

Сервис метаданных либо контекст обработчика внутри функции для получения IAM‑токена

Безопасный способ получить токен сервисного аккаунта

Способ подходит только для хранения токена для доступа к API облака

3

Секреты Yandex Lockbox

Безопасный способ получить любой секрет из защищённого хранилища

Yandex Lockbox может хранить любые секреты, а не только IAM‑токены

Для этих задач пригодятся и технологии контейнеризации. Вы можете передать секрет в Yandex Serverless Containers, используя новую serverless‑функцию Указать облачную сеть. Она позволяет вам выполнять соединение из функций напрямую в ваши приватные адреса в VPC. Подробнее об этом можно узнать из документации.

Надеемся, что статья помогла вам разобраться в тонкостях работы с секретами при serverless‑разработке. Используя описанные сценарии, вы сможете повысить безопасность приложения и решить вопрос защиты, хранения конфиденциальных данных и контроля доступа к ним.

Вакансии

Все актуальные вакансии Yandex Cloud

Мероприятия

Календарь событий Yandex Cloud

Обучение

Освойте инструменты Yandex Cloud
Безопасное использование секретов Yandex Lockbox в бессерверных средах
Войдите, чтобы сохранить пост