Tutorial: Desarrollo de una aplicación de .NET Framework mediante Always Encrypted con enclaves seguros
Se aplica a: SQL Server 2019 (15.x) y versiones posteriores: solo Windows Azure SQL Database
En este tutorial aprenderá a desarrollar una aplicación que emite consultas de base de datos que usan un enclave seguro del lado servidor para Always Encrypted con enclaves seguros.
Nota:
.NET Framework no admite el uso de Always Encrypted con enclaves de VBS sin atestación. Este tutorial solo es aplicable si usa la atestación con Microsoft Azure Attestation (con enclaves Intel SGX en Azure SQL Database) o el servicio de protección de host (con enclaves de SBV en SQL Server).
Requisitos previos
Asegúrese de que ha completado uno de los tutoriales Introducción a Always Encrypted con enclaves seguros en Azure SQL Database antes de seguir los pasos de este tutorial que se indican a continuación.
También necesitará Visual Studio (se recomienda la versión 2022); descárguelo desde https://visualstudio.microsoft.com/. El equipo de desarrollo de la aplicación debe ejecutar .NET Framework 4.7.2 o posterior.
Paso 1: Configuración de su proyecto de Visual Studio
Para usar Always Encrypted con enclaves seguros en una aplicación de .NET Framework, debe asegurarse de que su aplicación se compila en .NET Framework 4.7.2 y se integra con el NuGet Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders. Además, si almacena su clave maestra de columna en Azure Key Vault, también debe integrar su aplicación con el Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider NuGet, versión 2.4.0 o posterior.
Abra Visual Studio.
Cree un proyecto de aplicación de consola de C# (.NET Framework).
Asegúrese de que su proyecto tenga como destino al menos .NET Framework 4.7.2. Haga clic con el botón derecho en el proyecto en el Explorador de soluciones, seleccione Propiedades y establezca Marco de destino en .NET Framework 4.7.2.
Instale el siguiente paquete NuGet yendo a Herramientas (menú principal)>Administrador de paquetes NuGet>Consola del administrador de paquetes. Ejecute el siguiente código en la Consola del Administrador de paquetes.
Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders -IncludePrerelease
Si usa Azure Key Vault para almacenar sus claves maestras de columna, instale los siguientes paquetes NuGet yendo a Herramientas (menú principal) > >Administrador de paquetes NuGet>Consola del administrador de paquetes. Ejecute el siguiente código en la Consola del Administrador de paquetes.
Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider -IncludePrerelease -Version 2.4.0 Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
Abra el archivo App.config del proyecto.
Busque la sección
<configuration>
y agregue o actualice las secciones<configSections>
.Si la sección
<configuration>
no contiene la sección<configSections>
, agregue el contenido siguiente justo después de<configuration>
.<configSections> <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections>
Si la sección
<configuration>
ya contiene la sección<configSections>
, agregue la siguiente línea desde la sección<configSections>
:<section name="SqlColumnEncryptionEnclaveProviders" type="System. Data.SqlClient. SqlColumnEncryptionEnclaveProviderConfigurationSection, System. Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
En la sección
<configuration>
, debajo de</configSections>
, agregue una sección nueva, que especifica un proveedor de enclave que se va a usar para la atestación de los enclaves seguros del lado servidor e interactuar con ellos.Si usa SQL Server y el Servicio de protección de host (HGS) (utiliza la base de datos de Tutorial: Introducción a Always Encrypted con enclaves seguros en SQL Server), agregue la sección siguiente.
<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>
Este es un ejemplo completo de un archivo app.config para una aplicación de consola simple.
<?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>
Si usa Azure SQL Database con enclaves SGX y Microsoft Azure Attestation (utiliza la base de datos de Tutorial: Introducción a Always Encrypted con enclaves seguros Intel SGX en Azure SQL Database), agregue la sección siguiente.
<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>
Este es un ejemplo completo de un archivo app.config para una aplicación de consola simple.
<?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>
Paso 2: Implementar la lógica de la aplicación
La aplicación se conectará a la base de datos ContosoHR que se creó en uno de los tutoriales (consulte Requisitos previos) y ejecutará una consulta que contiene el predicado LIKE
en la columna SSN y una comparación de rangos en la columna Salary.
Reemplace el contenido del archivo Program.cs (generado por Visual Studio) por el siguiente código. Actualice la cadena de conexión de base de datos con el nombre del servidor, la configuración de autenticación de la base de datos y la dirección URL de atestación del enclave del entorno.
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(); } } } }
Compile y ejecute la aplicación.