Безопасное хранение секретов приложения во время разработки

Совет

Это содержимое представляет собой отрывок из электронной книги, архитектуры микрослужб .NET для контейнерных приложений .NET, доступных в документации .NET или в виде бесплатного скачиваемого PDF-файла, который можно прочитать в автономном режиме.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Для подключения к защищенным ресурсам и другим службам приложения ASP.NET Core обычно используют строки подключения, пароли или другие учетные данные, содержащие конфиденциальные сведения. Эти конфиденциальные сведения называются секреты. Мы рекомендуем не включать секреты в исходный код и ни в коем случае не хранить секреты в системе управления версиями. Лучше использовать модель конфигурации ASP.NET Core для чтения секретов из более безопасных мест.

Следует отличать секреты для доступа к ресурсам в среде разработки и промежуточной среде от секретов для доступа к ресурсам в рабочей среде. Это разные наборы секретов, которые используют разные пользователи. Секреты, используемые на стадии разработки, как правило, хранятся в переменных среды или в менеджере секретов ASP.NET Core. Для большей безопасности в рабочих средах микрослужбы могут хранить секреты в хранилище Azure Key Vault.

Хранение секретов в переменных среды

Чтобы хранить секреты отдельно от исходного кода, разработчики могут установить строки секретов в качестве переменных среды на компьютерах, использующихся для разработки. При использовании переменных среды для хранения секретов с иерархическими именами, например, вложенными в разделы конфигурации, необходимо создать имя для переменных среды, чтобы включить полную иерархию разделов, разделенных двоеточием (:).

Например, если установить для переменной среды Logging:LogLevel:Default значение Debug, это будет соответствовать конфигурации из следующего файла JSON:

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug"
        }
    }
}

Чтобы получить доступ к этим значениям из переменных среды, приложению просто необходимо вызвать AddEnvironmentVariables его ConfigurationBuilder при создании IConfigurationRoot объекта.

Примечание

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

Хранение секретов с помощью диспетчера секретов ASP.NET Core

Менеджер секретов ASP.NET Core — это еще один инструмент для хранения секретов отдельно от исходного кода при разработке. Для работы с диспетчером секретов установите пакет Microsoft.Extensions.Configuration.SecretManager в файле проекта. Установив и восстановив эту зависимость, можно указать значение секретов в командной строке с помощью команды dotnet user-secrets. Секреты будут храниться в файле JSON в каталоге профилей пользователей (в зависимости от ОС), отдельно от исходного кода.

Секреты, заданные диспетчером секретов, упорядочиваются свойством UserSecretsId в проекте, использующем эти секреты. Поэтому обязательно задайте свойство UserSecretsId в файле проекта, как показано в следующем фрагменте кода. Значением по умолчанию является GUID, назначенный Visual Studio, но фактическая строка не важна, если она уникальна на вашем компьютере.

<PropertyGroup>
    <UserSecretsId>UniqueIdentifyingString</UserSecretsId>
</PropertyGroup>

Использование секретов, хранящихся в диспетчере секретов в приложении, выполняется путем вызова AddUserSecrets<T> экземпляра ConfigurationBuilder для включения секретов для приложения в конфигурацию. Универсальный параметр T должен быть типом из сборки, к которым был применен UserSecretId. Как правило, использование AddUserSecrets<Startup> в порядке.

AddUserSecrets<Startup>() относится к параметрам по умолчанию для среды разработки, если в Program.cs используется метод CreateDefaultBuilder.