Прочтите зашифрованную строку подключения в Machine.config из Powershell

Можно ли прочитать зашифрованную строку подключения в Machine.config из сценария Powershell?

По соображениям безопасности мы пытаемся переместить жестко запрограммированную строку подключения из сценария PowerShell в Machine.config.

Обновление: сценарий Powershell должен читать строку подключения из Machine.config (зашифрованную через aspnet_regiis) и подключаться к БД.


person Sharmi    schedule 08.07.2018    source источник


Ответы (1)


Я не уверен, где PowerShell фигурирует в вашем вопросе. Если вы используете встроенную команду, например aspnet_regiis.exe, для шифрования раздела конфигурации, то ваш сайт IIS не знает, что этот раздел зашифрован.

Я не уверен, как размещение чего-либо в machine.config сделает приложение более безопасным, поскольку все, что его читает прозрачно, будет работать для любого приложения на этой машине.

Конфигурация .net работает так: у вас есть файл some.exe и файл some.exe.config. При развертывании some.exe вы можете (нужно?) Включить шаг для шифрования конфиденциальных разделов. Приложение по-прежнему просто считывает данные, не зная, что они зашифрованы.

Но опять же, это приложение, а не PowerShell, которое считывает зашифрованное значение.

Вот часть сценария, который я использую, который шифрует / дешифрует разделы. Используйте осторожно, поскольку зашифрованные данные можно расшифровать только на одном компьютере (и, вероятно, в той же ОС). YMMV

$appConfig = "your.exe"
$sectionName = "appSettings"
$dataProtectionProvider = "DataProtectionConfigurationProvider"

if (-not (Test-Path $path) ) { throw "Unable to find $($appConfig) $($path)" }

$configuration = [System.Configuration.ConfigurationManager]::OpenExeConfiguration($path)
$section = $configuration.GetSection($sectionName)
if (-not $section.SectionInformation.IsProtected) {
    $section.SectionInformation.ProtectSection($dataProtectionProvider)
    $section.SectionInformation.ForceSave = $true
    $configuration.Save([System.Configuration.ConfigurationSaveMode]::Full)
    Write-Information -Message "$($sectionName) in $($appConfig) has been protected from casual users"
}
else {
    Write-Information -Message "$($sectionName) in $($appConfig) is already protected"
    $section.SectionInformation.UnprotectSection()
    $section.SectionInformation.ForceSave = $true
    $configuration.Save([System.Configuration.ConfigurationSaveMode]::Full)
    Write-Information -Message "$($sectionName) in $($appConfig) protection removed"
}

Это фрагмент полного скрипта для шифрования / дешифрования разделов конфигурации.

person No Refunds No Returns    schedule 09.07.2018
comment
Поскольку строка подключения хранится в виде обычного текста, мы перемещаем ее в machine.config и шифруем с помощью утилиты aspnet_regiis.exe. Мы хотим, чтобы сценарий Powershell считывал зашифрованную строку подключения из Machine.config и подключался к серверу базы данных SQL для выполнения бизнес-логики. Я не уверен, нужно ли нам явно расшифровывать соединение или Powershell обрабатывает его по умолчанию, как приложение .net, где нам не нужно указывать логику, если оно зашифровано с помощью aspnet_regiis.exe. Спасибо - person Sharmi; 09.07.2018
comment
Пока вы используете методы .net ConfigurationManager для доступа к разделам конфигурации, зашифрованные настройки прозрачны для вызывающего. Существует множество других способов выйти из строя с зашифрованными настройками, поэтому обязательно сохраняйте фактические значения в безопасных местах за пределами файла .config. Если у вас есть Azure, то Azure Keyvault - отличное средство для безопасного хранения секретов. (Пожалуйста, проголосуйте, если этот ответ полезен) - person No Refunds No Returns; 09.07.2018