Безопасное хранение секретов приложения во время развертывания в ASP.NET Core

Безопасное хранение секретов приложения во время развертывания в ASP.NET Core

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

Переменные среды

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

рассмотрим ASP.NET Core веб-приложение, в котором включена безопасность отдельных учетных записей пользователей . Строка подключения к базе данных по умолчанию включается в файл проекта appsettings.json с ключом DefaultConnection . строка подключения по умолчанию предназначена для LocalDB, которая выполняется в пользовательском режиме и не требует пароля. Во время развертывания DefaultConnection приложения значение ключа может быть переопределено значением переменной среды. Переменная среды может хранить полную строку подключения с конфиденциальными учетными данными.

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

Разделитель : не работает с иерархическими ключами переменных среды на всех платформах. __ (двойной символ подчеркивания):

  • Поддерживается всеми платформами. Например, разделитель : не поддерживается Bash, а __ — поддерживается.
  • Автоматически заменяется на :

Диспетчер секретов

средство диспетчера секретов сохраняет конфиденциальные данные во время разработки проекта ASP.NET Core. В этом контексте фрагмент конфиденциальных данных является секретом приложения. Секреты приложения хранятся в отдельном месте из дерева проекта. Секреты приложения связаны с конкретным проектом или совместно используются в нескольких проектах. Секреты приложения не возвращаются в систему управления версиями.

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

Как работает средство диспетчера секретов

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

  • Windows
  • Linux и macOS

Путь к файловой системе:

Путь к файловой системе:

В приведенных выше путях файлов замените <user_secrets_id> UserSecretsId на значение, указанное в файле проекта.

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

Включить хранилище секретов

Диспетчер секретов работает с параметрами конфигурации конкретного проекта, хранящимися в профиле пользователя.

Средство диспетчера секретов включает init команду. Чтобы использовать секреты пользователя, выполните следующую команду в каталоге проекта:

Предыдущая команда добавляет UserSecretsId элемент в PropertyGroup файл проекта. По умолчанию внутренний текст UserSecretsId является идентификатором GUID. Внутренний текст является произвольным, но уникален для проекта.

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

Задать секрет

Определите секрет приложения, состоящий из ключа и его значения. Секрет связан со значением проекта UserSecretsId . Например, выполните следующую команду из каталога, в котором существует файл проекта:

В предыдущем примере двоеточие обозначает, что Movies является объектным литералом со ServiceApiKey свойством.

Диспетчер секретов можно использовать и в других каталогах. --project Используйте параметр, чтобы указать путь файловой системы, в котором существует файл проекта. Например:

Сведение структуры JSON в Visual Studio

жест управления пользовательскими секретами Visual Studio открывает secrets.json файл в текстовом редакторе. Замените содержимое secrets.json хранимыми парами "ключ-значение". Например:

Структура JSON преобразуется в плоскую структуру после изменений с помощью dotnet user-secrets remove или dotnet user-secrets set . Например, запуск dotnet user-secrets remove "Movies:ConnectionString" сворачивает Movies объектный литерал. Измененный файл напоминает следующий код JSON:

Задание нескольких секретов

Пакет секретов можно задать с помощью конвейера set командной строки. В следующем примере input.json содержимое файла передается set команде.

  • Windows
  • Linux и macOS

Откройте командную оболочку и выполните следующую команду:

Откройте командную оболочку и выполните следующую команду:

Доступ к секрету

Чтобы получить доступ к секрету, выполните следующие действия.

Регистрация источника конфигурации секретов пользователя

Поставщик конфигурации секретов пользователя регистрирует соответствующий источник конфигурации с помощью API конфигурации.NET.

Веб-приложения ASP.NET Core, созданные с помощью dotnet new или Visual Studio, создают следующий код:

WebApplication.CreateBuilder инициализирует новый экземпляр класса WebApplicationBuilder с предварительно настроенными значениями по умолчанию. Инициализированная WebApplicationBuilder ( builder ) предоставляет конфигурацию по умолчанию и вызывает AddUserSecrets , когда EnvironmentName имеет Development значение:

Чтение секрета с помощью API конфигурации

Рассмотрим следующие примеры чтения Movies:ServiceApiKey ключа:

Файл Program. cs:

Razor Модель страницы страниц:

Дополнительные сведения см. в разделе Конфигурация в ASP.NET Core.

Преобразование секретов в POCO

Сопоставление целого литерала объекта с POCO (простой класс .NET со свойствами) полезен для статистической обработки связанных свойств.

Предположим, файл приложения secrets.json содержит следующие два секрета:

Чтобы связать предыдущие секреты с POCO, используйте функцию привязки графа объектов API настройки .NET. Следующий код привязывается к пользовательской MovieSettings POCO и обращается ServiceApiKey к значению свойства:

Movies:ConnectionString Секреты и Movies:ServiceApiKey сопоставлены с соответствующими свойствами в MovieSettings :

Замена строк секретами

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

Более безопасный подход заключается в хранении пароля в качестве секрета. Например:

Password Удалите пару "ключ-значение" из строки подключения в appsettings.json . Например:

Значение секрета может быть задано для SqlConnectionStringBuilder свойства объекта Password , чтобы завершить строку подключения:

Вывод списка секретов

Предположим, файл приложения secrets.json содержит следующие два секрета:

Выполните следующую команду из каталога, в котором существует файл проекта:

Отображаются следующие результаты:

В предыдущем примере двоеточие в именах ключей обозначает иерархию объектов в secrets.json .

Удаление одного секрета

Предположим, файл приложения secrets.json содержит следующие два секрета:

Выполните следующую команду из каталога, в котором существует файл проекта:

Файл приложения secrets.json был изменен для удаления пары "ключ-значение", связанной с MoviesConnectionString ключом:

dotnet user-secrets list отображает следующее сообщение:

Удалить все секреты

Предположим, файл приложения secrets.json содержит следующие два секрета:

Выполните следующую команду из каталога, в котором существует файл проекта:

Все секреты пользователя для приложения удалены из secrets.json файла:

При выполнении dotnet user-secrets list отображается следующее сообщение:

Управление секретами пользователей с помощью Visual Studio

чтобы управлять секретами пользователей в Visual Studio, щелкните правой кнопкой мыши проект в обозревателе решений и выберите пункт управление секретами пользователя:

Дополнительные ресурсы

  • Сведения о доступе к пользовательским секретам из IIS см. в этой статье .

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

Переменные среды

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

рассмотрим ASP.NET Core веб-приложение, в котором включена безопасность отдельных учетных записей пользователей . Строка подключения к базе данных по умолчанию включается в файл проекта appsettings.json с ключом DefaultConnection . строка подключения по умолчанию предназначена для LocalDB, которая выполняется в пользовательском режиме и не требует пароля. Во время развертывания DefaultConnection приложения значение ключа может быть переопределено значением переменной среды. Переменная среды может хранить полную строку подключения с конфиденциальными учетными данными.

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

Разделитель : не работает с иерархическими ключами переменных среды на всех платформах. __ (двойной символ подчеркивания):

  • Поддерживается всеми платформами. Например, разделитель : не поддерживается Bash, а __ — поддерживается.
  • Автоматически заменяется на :

Диспетчер секретов

средство диспетчера секретов сохраняет конфиденциальные данные во время разработки проекта ASP.NET Core. В этом контексте фрагмент конфиденциальных данных является секретом приложения. Секреты приложения хранятся в отдельном месте из дерева проекта. Секреты приложения связаны с конкретным проектом или совместно используются в нескольких проектах. Секреты приложения не возвращаются в систему управления версиями.

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

Как работает средство диспетчера секретов

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

  • Windows
  • Linux и macOS

Путь к файловой системе:

Путь к файловой системе:

В приведенных выше путях файлов замените <user_secrets_id> UserSecretsId на значение, указанное в файле проекта.

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

Включить хранилище секретов

Диспетчер секретов работает с параметрами конфигурации конкретного проекта, хранящимися в профиле пользователя.

Средство диспетчера секретов включает init команду в пакет SDK для .NET Core 3.0.100 или более поздней версии. Чтобы использовать секреты пользователя, выполните следующую команду в каталоге проекта:

Предыдущая команда добавляет UserSecretsId элемент в PropertyGroup файл проекта. По умолчанию внутренний текст UserSecretsId является идентификатором GUID. Внутренний текст является произвольным, но уникален для проекта.

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

Задать секрет

Определите секрет приложения, состоящий из ключа и его значения. Секрет связан со значением проекта UserSecretsId . Например, выполните следующую команду из каталога, в котором существует файл проекта:

В предыдущем примере двоеточие обозначает, что Movies является объектным литералом со ServiceApiKey свойством.

Диспетчер секретов можно использовать и в других каталогах. --project Используйте параметр, чтобы указать путь файловой системы, в котором существует файл проекта. Например:

Сведение структуры JSON в Visual Studio

жест управления пользовательскими секретами Visual Studio открывает secrets.json файл в текстовом редакторе. Замените содержимое secrets.json хранимыми парами "ключ-значение". Например:

Структура JSON преобразуется в плоскую структуру после изменений с помощью dotnet user-secrets remove или dotnet user-secrets set . Например, запуск dotnet user-secrets remove "Movies:ConnectionString" сворачивает Movies объектный литерал. Измененный файл напоминает следующий код JSON:

Задание нескольких секретов

Пакет секретов можно задать с помощью конвейера set командной строки. В следующем примере input.json содержимое файла передается set команде.

  • Windows
  • Linux и macOS

Откройте командную оболочку и выполните следующую команду:

Откройте командную оболочку и выполните следующую команду:

Доступ к секрету

Чтобы получить доступ к секрету, выполните следующие действия.

Регистрация источника конфигурации секретов пользователя

Поставщик конфигурации секретов пользователя регистрирует соответствующий источник конфигурации с помощью API конфигурации.NET.

Источник конфигурации секреты пользователя автоматически добавляется в режим разработки при вызове CreateDefaultBuilder проекта. CreateDefaultBuilder вызывает AddUserSecrets , EnvironmentName Если имеет Development значение:

Если CreateDefaultBuilder метод не вызывается, добавьте источник конфигурации секреты пользователя явным образом, вызвав AddUserSecrets в ConfigureAppConfiguration . Вызывайте AddUserSecrets только при запуске приложения в среде разработки, как показано в следующем примере:

Чтение секрета с помощью API конфигурации

Если зарегистрирован источник конфигурации секреты пользователя, API конфигурации .NET может считывать секреты. Внедрение конструктора можно использовать для получения доступа к API конфигурации .NET. Рассмотрим следующие примеры чтения Movies:ServiceApiKey ключа:

Класс запуска:

Razor Модель страницы страниц:

Преобразование секретов в POCO

Сопоставление целого литерала объекта с POCO (простой класс .NET со свойствами) полезен для статистической обработки связанных свойств.

Предположим, файл приложения secrets.json содержит следующие два секрета:

Чтобы связать предыдущие секреты с POCO, используйте функцию привязки графа объектов API настройки .NET. Следующий код привязывается к пользовательской MovieSettings POCO и обращается ServiceApiKey к значению свойства:

Movies:ConnectionString Секреты и Movies:ServiceApiKey сопоставлены с соответствующими свойствами в MovieSettings :

Замена строк секретами

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

Более безопасный подход заключается в хранении пароля в качестве секрета. Например:

Password Удалите пару "ключ-значение" из строки подключения в appsettings.json . Например:

Значение секрета может быть задано для SqlConnectionStringBuilder свойства объекта Password , чтобы завершить строку подключения:

Вывод списка секретов

Предположим, файл приложения secrets.json содержит следующие два секрета:

Выполните следующую команду из каталога, в котором существует файл проекта:

Отображаются следующие результаты:

В предыдущем примере двоеточие в именах ключей обозначает иерархию объектов в secrets.json .

Удаление одного секрета

Предположим, файл приложения secrets.json содержит следующие два секрета:

Выполните следующую команду из каталога, в котором существует файл проекта:

Файл приложения secrets.json был изменен для удаления пары "ключ-значение", связанной с MoviesConnectionString ключом:

dotnet user-secrets list отображает следующее сообщение:

Удалить все секреты

Предположим, файл приложения secrets.json содержит следующие два секрета:

Выполните следующую команду из каталога, в котором существует файл проекта:

Все секреты пользователя для приложения удалены из secrets.json файла:

При выполнении dotnet user-secrets list отображается следующее сообщение:

Управление секретами пользователей с помощью Visual Studio

чтобы управлять секретами пользователей в Visual Studio, щелкните правой кнопкой мыши проект в обозревателе решений и выберите пункт управление секретами пользователя:

📎📎📎📎📎📎📎📎📎📎