Перейти к содержанию

Безопасное хранение секретов конфигурации

В работе любого нетривиального приложения требуется использование неких конфиденциальных данных, например пароля или API-ключа. В отличие от прочих настроек их ни в коем случае нельзя хранить в системе контроля версий, следовательно, их нужно хранить где-то вовне папки проекта.
Самые часто используемые подходы здесь такие:

  • User Secrets Manager для локальных значений (например, в процессе разработки)
  • переменные окружения на серверах
  • Специальные платформы типа Azure Key Vault или Hashicorp Vault, хотя и тут придётся использовать один из двух предыдущих подходов для хранения информации о подключении к ним.

Рассмотрим первые два варианта подробнее.

Сохранение секретов в переменных окружения в промышленном окружении

Для добавления поставщика конфигурации переменных окружения используется метод AddEnvironmentVairables, как было показано здесь. Он добавляет все переменные окружения в виде пар “ключ-значение” в объекте конфигурации.
Для создания иерархических разделов можно использовать двоеточие (:) или двойное подчёркивание (__) для разграничения секций, например MapSettings:MaxNumberOfPoints или MapSettings__MaxNumberOfPoints. Для некоторых окружений, например, под Linux, двоеточие в переменных окружения не допускается. При импорте в объект IConfiguration двойное подчёркивание будет преобразовано в двоеточие, так что при получении значений в коде следует обязательно использовать двоеточие.

Хранение секретов с помощью менеджера пользовательских секретов в окружении разработки

Для того, чтобы использовать Менеджер пользовательских секретов (User Secrets Manager), его нужно настроить, добавить поставщика конфигурации User Secrets, если не используется метод Host.CreatedefaultBuilder(), и определить уникальный ключ для приложения.
Для этого: в VS щелкаем проект правой кнопкой мыши и выбираем Manage User Secrets, после чего откроется файл secrets.json, который нужно отредактировать. Также при этом создастся уникальный идентификатор в файле .csproj:

<PropertyGroup>
    <UserSecretsId>c81ee9bd-6924-46d9-ba81-e39eeaa0da91</UserSecretsId>
</PropertyGroup>

Также можно воспользоваться командной строкой (однако при этом идентификатор в файл .cspoj нужно добавить самостоятельно):
dotnet user-secrets set "MapSettings:GoogleMapsApiKey" F5RJT9GFHKR7

Теперь, чтобы воспользоваться этими секретами, нужно добавить поставщика:
if(env.IsDevelopment)
{
    configBuilder.AddUserSecrets<Startup>();
}

Как мы понимаем, правильно добавлять его только для окружения разработки.
У этого метода есть несколько перегрузок; идея в том, что поставщик должен получить значение UserSecretsId. Использованная перегрузка использует класс Startup для указания на сборку, содержащую это свойство.


Последнее обновление : 25 февраля 2023 г.
Дата создания : 30 сентября 2022 г.

Комментарии

Комментарии