Esercitazione: Sviluppare un'applicazione .NET Framework usando Always Encrypted con enclavi sicure

Si applica a: SQL Server 2019 (15.x) e versioni successive - Solo Windows Database SQL di Azure

Questa esercitazione illustra come sviluppare un'applicazione che esegue query di database che usano un'enclave sicura sul lato server per Always Encrypted con enclave sicure.

Nota

.NET Framework non supporta l'uso di Always Encrypted con enclavi VBS senza attestazione. Questa esercitazione è applicabile solo se si usa l'attestazione con Attestazione di Azure di Microsoft (con enclavi Intel SGX nel Database SQL di Azure) o Servizio Sorveglianza host (con enclavi VBS in SQL Server).

Prerequisiti

Accertarsi di aver completato una delle esercitazioni dell’Introduzione all'uso di Always Encrypted con enclavi sicure prima di seguire i passaggi seguenti in questa esercitazione.

Sarà necessario anche Visual Studio (versione 2022 consigliata), che può essere scaricato da https://visualstudio.microsoft.com/. Il computer di sviluppo dell'applicazione deve eseguire.NET Framework 4.7.2 o versione successiva.

Passaggio 1: Configurare un progetto di Visual Studio

Per usare Always Encrypted con enclave sicuri in un'applicazione .NET Framework, è necessario assicurarsi che l'applicazione sia sviluppata con .NET Framework 4.7.2 e integrata con il pacchetto NuGet Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders. Inoltre, se si archivia la chiave master della colonna in Azure Key Vault, è necessario anche integrare l'applicazione con NuGet Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider NuGet, 2.4.0 o versioni successive.

  1. Aprire Visual Studio.

  2. Creare un nuovo progetto di app console C# (.NET Framework).

  3. Assicurarsi che il progetto sia destinato almeno a .NET Framework 4.7.2. Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni, scegliere Proprietà e impostare Framework di destinazione su.NET Framework 4.7.2.

  4. Installare il pacchetto NuGet seguente passando a Strumenti (menu principale) >Gestione pacchetti NuGet>Console di Gestione pacchetti. Eseguire il codice seguente nella Console di Gestione pacchetti.

    Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders -IncludePrerelease
    
  5. Se si usa Azure Key Vault pe l'archiviazione delle chiavi master della colonna, installare i pacchetti NuGet seguenti passando a Strumenti (menu principale) >Gestione pacchetti NuGet>Console di Gestione pacchetti. Eseguire il codice seguente nella Console di Gestione pacchetti.

    Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider -IncludePrerelease -Version 2.4.0
    Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
    
  6. Aprire il file App.config del progetto.

  7. Individuare la sezione <configuration> e aggiungere o aggiornare le sezioni <configSections>.

    1. Se la sezione <configuration> non contiene la sezione <configSections>, aggiungere il contenuto seguente immediatamente sotto <configuration>.

      <configSections>
        <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>
      
    2. Se la sezione <configuration> contiene già la sezione <configSections>, aggiungere la riga seguente all'interno della sezione <configSections>:

      <section name="SqlColumnEncryptionEnclaveProviders"  type="System.   Data.SqlClient.   SqlColumnEncryptionEnclaveProviderConfigurationSection, System.   Data,  Version=4.0.0.0, Culture=neutral,    PublicKeyToken=b77a5c561934e089" />
      
  8. Nella sezione <configuration>, sotto </configSections>, aggiungere una nuova sezione, che specifica un provider di enclave da usare per l'attestazione e l'interazione con l'enclave sicura lato server.

    1. Se si usa SQL Server e il Servizio Sorveglianza host (HGS) (si usa il database di Esercitazione: Introduzione all'uso di Always Encrypted con enclavi sicure in SQL Server), aggiungere la sezione seguente.

      <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>
      

      Di seguito è riportato un esempio completo di un file app.config per una semplice applicazione console.

      <?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>
      
    2. Se si usa il Database SQL di Azure con enclavi SGX e Attestazione di Azure di Microsoft (si usa il database di Esercitazione: Introduzione all’uso di Always Encrypted con enclavi Intel SGX sicure nel Database SQL di Azure), aggiungere la sezione seguente.

      <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>
      

      Di seguito è riportato un esempio completo di un file app.config per una semplice applicazione console.

      <?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>
      

Passaggio 2: Implementare la logica dell'applicazione

L'applicazione si collegherà al database ContosoHR creato in una delle esercitazioni, visualizzerà i Prerequisiti ed eseguirà una query contenente il predicato LIKE nella colonna SSN e un confronto tra intervalli nella colonna Salary.

  1. Sostituire il contenuto del file Program.cs (generato da Visual Studio) con il codice seguente. Aggiornare la stringa di connessione di database con il nome del server, le impostazioni di autenticazione del database e l'URL di attestazione dell'enclave per l'ambiente.

    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();
                }
            }
        }
    }
    
  2. Compilare ed eseguire l'applicazione.

Vedi anche