Руководство по разработке приложения .NET Framework с помощью Always Encrypted с безопасными анклавами
Область применения: SQL Server 2019 (15.x) и более поздних версий — Windows только База данных SQL Azure
В этом руководстве содержатся сведения о разработке приложения, которое выполняет запросы к базе данных, использующие безопасный анклав на стороне сервера для Always Encrypted с защищенными анклавами.
Примечание.
платформа .NET Framework не поддерживает использование Always Encrypted с анклавами VBS без аттестации. Это руководство применимо только в том случае, если вы используете аттестацию с microsoft Аттестация Azure (с анклавами Intel SGX в База данных SQL Azure) или службой защиты узлов (с анклавами VBS в SQL Server).
Необходимые компоненты
Убедитесь, что вы выполнили одно из руководств по началу работы с Always Encrypted с безопасными анклавами , прежде чем выполнить приведенные ниже действия, описанные в этом руководстве.
Вам также потребуется Visual Studio (версия 2022 рекомендуется) — скачать его из https://visualstudio.microsoft.com/. На компьютере для разработки приложений должна быть установлена платформа .NET Framework 4.7.2 или более поздней версии.
Шаг 1. Настройка проекта Visual Studio
Чтобы использовать функцию Always Encrypted с безопасными анклавами в приложении .NET Framework, вам нужно убедиться в том, что приложение создано на основе .NET Framework 4.7.2 и интегрировано с пакетом NuGet Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders. Кроме того, при хранении главного ключа столбца в Azure Key Vault также необходимо интегрировать приложение с Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider NuGet версии 2.4.0 или более поздней.
Откройте Visual Studio.
Создайте проект консольного приложения C# (.NET Framework).
Убедитесь, что в проекте настроена по крайней мере платформа .NET Framework 4.7.2. Щелкните правой кнопкой мыши проект в Обозревателе решений, выберите Свойства и установите для параметра Целевая платформа значение ".NET Framework 4.7.2".
Установите следующий пакет NuGet. Щелкните Инструменты (главное меню) >Диспетчер пакетов NuGet>Консоль диспетчера пакетов. Выполните следующий код в консоли диспетчера пакетов.
Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders -IncludePrerelease
Если вы используете Azure Key Vault для хранения главных ключей столбцов, установите следующие пакеты NuGet, щелкнув Инструменты (главное меню) >Диспетчер пакетов NuGet>Консоль диспетчера пакетов. Выполните следующий код в консоли диспетчера пакетов.
Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider -IncludePrerelease -Version 2.4.0 Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
Откройте файл App.config для проекта.
Откройте раздел
<configuration>
и добавьте или обновите разделы<configSections>
.Если в разделе
<configuration>
нет раздела<configSections>
, добавьте приведенное ниже содержимое сразу после раздела<configuration>
.<configSections> <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections>
Если в разделе
<configuration>
уже содержится раздел<configSections>
, добавьте следующую строку в раздел<configSections>
:<section name="SqlColumnEncryptionEnclaveProviders" type="System. Data.SqlClient. SqlColumnEncryptionEnclaveProviderConfigurationSection, System. Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
В разделе
<configuration>
ниже</configSections>
добавьте новый раздел, в котором указан поставщик анклава, который будет использоваться для подтверждения анклавов на стороне сервера и взаимодействия с ними.Если вы используете службу защиты SQL Server и узла (HGS) (вы используете базу данных из руководства. Начало работы с Always Encrypted с безопасными анклавами в SQL Server), добавьте следующий раздел.
<SqlColumnEncryptionEnclaveProviders> <providers> <add name="VBS" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> </providers> </SqlColumnEncryptionEnclaveProviders>
Ниже приведен полный пример файла app.config для простого консольного приложения.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections> <SqlColumnEncryptionEnclaveProviders> <providers> <add name="VBS" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> </providers> </SqlColumnEncryptionEnclaveProviders> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> </configuration>
Если вы используете База данных SQL Azure с анклавами SGX и Microsoft Аттестация Azure (вы используете базу данных из руководства. Начало работы с Always Encrypted с безопасными анклавами Intel SGX в База данных SQL Azure), добавьте следующий раздел.
<SqlColumnEncryptionEnclaveProviders> <providers> <add name="SGX" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /> </providers> </SqlColumnEncryptionEnclaveProviders>
Ниже приведен полный пример файла app.config для простого консольного приложения.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections> <SqlColumnEncryptionEnclaveProviders> <providers> <add name="SGX" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /> </providers> </SqlColumnEncryptionEnclaveProviders> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> </configuration>
Шаг 2. Реализация логики приложения
Приложение будет подключаться к базе данных ContosoHR , созданной в одном из учебников, см . предварительные требования и будет выполнять запрос, содержащий LIKE
предикат в столбце SSN , и сравнение диапазона по столбцу "Зарплата ".
Замените содержимое файла Program.cs (созданного в Visual Studio) на приведенный ниже код. Обновите строку подключения к базе данных, указав имя сервера, параметры проверки подлинности и URL-адрес аттестации анклава для своей среды.
using System; using System.Data.SqlClient; using System.Data; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string connectionString = "Data Source = myserver; Initial Catalog = ContosoHR; Column Encryption Setting = Enabled;Enclave Attestation Url = http://hgs.bastion.local/Attestation; Integrated Security = true"; //string connectionString = "Data Source = myserver.database.windows.net; Initial Catalog = ContosoHR; Column Encryption Setting = Enabled;Enclave Attestation Url = https://myattestationprovider.uks.attest.azure.net/attest/SgxEnclave; User ID=user; Password=password"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlCommand cmd = connection.CreateCommand(); cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [Salary] FROM [HR].[Employees] WHERE [SSN] LIKE @SSNPattern AND [Salary] > @MinSalary;"; SqlParameter paramSSNPattern = cmd.CreateParameter(); paramSSNPattern.ParameterName = @"@SSNPattern"; paramSSNPattern.DbType = DbType.AnsiStringFixedLength; paramSSNPattern.Direction = ParameterDirection.Input; paramSSNPattern.Value = "%9838"; paramSSNPattern.Size = 11; cmd.Parameters.Add(paramSSNPattern); SqlParameter MinSalary = cmd.CreateParameter(); MinSalary.ParameterName = @"@MinSalary"; MinSalary.DbType = DbType.Currency; MinSalary.Direction = ParameterDirection.Input; MinSalary.Value = 20000; cmd.Parameters.Add(MinSalary); cmd.ExecuteNonQuery(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Console.WriteLine(reader[0] + ", " + reader[1] + ", " + reader[2] + ", " + reader[3]); } Console.ReadKey(); } } } }
Выполните сборку приложения и запустите его.