Проблема безопасности (дамп памяти) при подключении к базе данных через ConnectionString .NET

У меня возникли некоторые проблемы с безопасностью при использовании строк подключения в поставщиках баз данных оракула .net, которые содержат пароли. Проблема в том, что эти поставщики (System.Data.OracleClient или ODAC) получают connectionString в параметре типа String.

Это означает, что когда у нас есть настольное приложение, подключающееся непосредственно к базе данных (без какой-либо службы среднего уровня), и мы делаем дамп памяти для этого приложения, скорее всего, мы получим пользователя и пароль в виде обычного текста из строки соединения, переданной в библиотеку поставщика базы данных. .

Насколько я знаю, нет способа передать connectionString в параметре типа SecureString (Google говорит, что это разрешено только поставщиком MS SqlServer).

Есть ли другой способ защитить пароли базы данных в этом случае (кроме изменения архитектуры системы и создания службы среднего уровня для подключения к базе данных вместо прямого подключения из приложений)?


person Ewelina Kaganiec    schedule 03.03.2015    source источник


Ответы (1)


Microsoft SqlConnection по умолчанию удаляет пароль из .ConnectionString для вас после подключения:

connection.ConnectionString = "Data Source=screwdriver;User ID=MrSnrub;Password=smithers;";
connection.Open();

>connection.ConnectionString
"Data Source=screwdriver;User ID=MrSnrub;Password=smithers;"

Вы можете изменить это поведение, указав Persist Security Info = true;:

String cs = "Data Source=screwdriver;User ID=MrSnrub;Password=smithers;Persist Security Info=true";
conn.ConnectionString = cs;
conn.Open();

>conn.ConnectionString   
"Data Source=screwdriver;User ID=MrSnrub;Password=smithers;Persist Security Info=true"

Используйте SecureString

Альтернативой является использование метода .NET 4.5 для передачи пароля к SqlConnection как SecureString через объект SqlCredential:

SecureString pwd = AzureKeyVault.GetSettingSecure("DbPassword");
SqlCredential cred = new SqlCredential("MrSnrub", pwd);

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=screwdriver;";
conn.Credential = cred;
person Ian Boyd    schedule 18.04.2018