Безопасное использование секретов Yandex Lockbox в бессерверных средах
Рассказываем, как надёжно и безопасно использовать секреты при работе с Cloud Functions, Serverless Containers, Terraform и при чём здесь Yandex Lockbox.
16 июня 2023 г.
20 минут чтения
Для создания современных продуктов с использованием различных форматов бессерверных вычислений необходимо передавать пароли и другую чувствительную информацию для доступа к базам данных, внешним или облачным API, а также другим сервисам платформы. В Yandex Cloud такую информацию называют секретами. Сегодня вы узнаете, как защищать и хранить конфиденциальные данные, а также контролировать доступ к ним при использовании бессерверных вычислений. Мы немного затронем и Terraform, поскольку функции можно создавать как с его помощью, так и из консоли управления Yandex Cloud.
Можно назвать три основных способа хранения и получения секретов в вашем проекте:
Разберём особенности каждого способа. Но прежде посмотрим, что может понадобиться для работы с секретами:
Сервисный аккаунт, от имени которого программы могут управлять ресурсами в Yandex Cloud.
Модули Terraform, если вы будете создавать функции с помощью Terraform.
Ключ шифрования. Вы можете создать его в Yandex Key Management Service — сервисе для управления криптографическими ключами, которые защищают секреты, личные данные и другую конфиденциальную информацию.
Создадим функцию через Terraform с помощью yandex_function. Если указать переменные окружения «ключ-значение» для облачной функции в блоке environment, то секрет будет храниться в открытом виде в вашем файле с расширением .tfstate. А всё потому, что это поле не предназначено для хранения чувствительной информации
Получается, что данный способ хранения и получения секретов небезопасен. У него нет плюсов, зато есть минусы:
пользователям с ролью viewer и выше доступен ваш секрет в открытом виде;
при создании функции через Terraform секрет будет отображаться в .tfstate в открытом виде.
Протестируем функцию и увидим, что в ответ нам выдаётся IAM‑токен.
Как вы можете видеть, это более безопасный способ получить токен сервисного аккаунта. Но подходит он, как мы уже сказали, только для хранения токена для доступа к облачному API.
В Yandex Cloud есть собственный сервис управления секретами — Yandex Lockbox. С его помощью можно нативно использовать секрет прямо из вашей функции, обращаясь к значению ключа как переменной окружения. При этом секрет защищён и находится в Yandex Lockbox.
Для более надёжной защиты советуем использовать ключ KMS. Вы сможете шифровать секрет с помощью этого ключа.
Создадим секрет 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 нужно аналогичным образом создать функцию и ссылаться на созданный ранее секрет Yandex Lockbox. Содержимое секрета не будет передаваться в явном виде, ваш секрет не окажется в открытом виде в .tfstate.
Таким образом, это безопасный способ получить любой секрет из защищённого хранилища.
Итак, мы описали три варианта хранения и получения секретов. Давайте ещё раз посмотрим на особенности каждого способа хранения и передачи секретов.
Способ
Плюсы
Особенности
1
Переменные окружения
Нет
Пользователям с ролью viewer и выше доступен ваш секрет в открытом виде
При создании функции через Terraform секрет будет отображаться в .tfstate в открытом виде
2
Сервис метаданных либо контекст обработчика внутри функции для получения IAM‑токена
Безопасный способ получить токен сервисного аккаунта
Способ подходит только для хранения токена для доступа к API облака
3
Секреты Yandex Lockbox
Безопасный способ получить любой секрет из защищённого хранилища
Yandex Lockbox может хранить любые секреты, а не только IAM‑токены
Для этих задач пригодятся и технологии контейнеризации. Вы можете передать секрет в Yandex Serverless Containers, используя новую serverless‑функцию Указать облачную сеть. Она позволяет вам выполнять соединение из функций напрямую в ваши приватные адреса в VPC. Подробнее об этом можно узнать из документации.
Надеемся, что статья помогла вам разобраться в тонкостях работы с секретами при serverless‑разработке. Используя описанные сценарии, вы сможете повысить безопасность приложения и решить вопрос защиты, хранения конфиденциальных данных и контроля доступа к ним.