Безопасное хранение секретов приложения во время развертывания в 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, щелкните правой кнопкой мыши проект в обозревателе решений и выберите пункт управление секретами пользователя: