Share via


Tutorial: Introducción al uso de Always Encrypted con enclaves seguros en SQL Server con atestación mediante HGS

Se aplica a: SQL Server 2019 (15.x) y versiones posteriores: solo Windows

En este tutorial se explica cómo empezar a trabajar con Always Encrypted con enclaves seguros en SQL Server mediante el Servicio de protección de host (HGS) para la atestación de enclave. En él encontrará:

  • Cómo crear un entorno básico para probar y evaluar Always Encrypted con enclaves seguros con HGS configurado para la atestación de enclave.
  • Cómo cifrar datos en contexto y emitir consultas confidenciales enriquecidas en columnas cifradas mediante SQL Server Management Studio (SSMS).

Si desea obtener información sobre cómo configurar Always Encrypted con enclaves seguros sin atestación, consulte Tutorial: Introducción al uso de Always Encrypted con enclaves seguros en SQL Server.

Requisitos previos

Para empezar a trabajar con Always Encrypted con enclaves seguros, necesita al menos dos equipos (pueden ser máquinas virtuales):

  • El equipo con SQL Server para hospedar SQL Server y SSMS.
  • El equipo HGS para ejecutar el servicio de protección de host, que es necesario para la atestación del enclave.

Requisitos del equipo con SQL Server

  • SQL Server 2019 (15.x) o posterior.
  • Windows 10, versión 1809 o posterior: Enterprise Edition, Windows 11 o posterior: Enterprise Edition, Windows Server 2019 o posterior: Datacenter Edition. Otras ediciones de Windows 10/11 y Windows Server no admiten la atestación con HGS.
  • Compatibilidad de CPU con tecnologías de virtualización:
    • Intel VT-x con tablas de página extendida.
    • AMD-V con indexación de virtualización rápida.
    • Si se ejecuta SQL Server en una máquina virtual:
      • En Azure, use un tamaño de VM de generación 2 (recomendado) o un tamaño de VM de generación 1 con la virtualización anidada habilitada. Compruebe la documentación de tamaños de VM individuales para determinar qué tamaños de VM de generación 1 admiten la virtualización anidada.
      • En Hyper-V 2016 o versiones posteriores (fuera de Azure), asegúrese de que la máquina virtual es una máquina virtual de generación 2 (recomendada) o una máquina virtual de generación 1 con la virtualización anidada habilitada. Para obtener más información, consulte ¿Debería crear una máquina virtual de generación 1 o 2 en Hyper-V? y Configuración de la virtualización anidada.
      • En VMware vSphere 6.7 o posterior, habilite la compatibilidad con la seguridad basada en virtualización en la máquina virtual, como se describe en la documentación de VMware.
      • Es posible que otros hipervisores y nubes públicas admitan funciones de virtualización anidada que también permitan Always Encrypted con enclaves de VBS. Consulte la documentación de la solución de virtualización para obtener instrucciones relativas a la compatibilidad y configuración.
  • La versión más reciente de SQL Server Management Studio (SSMS). También puede instalar SSMS en otro equipo.

Advertencia

En entornos de producción, ejecutar SSMS u otras herramientas de administración de claves en el equipo de SQL Server puede reducir las ventajas de seguridad del uso de Always Encrypted. En general, se recomienda ejecutar estas herramientas en otro equipo. Para obtener más información, vea Security Considerations for Key Management (Consideraciones de seguridad para la administración de claves).

Requisitos del equipo de HGS

  • Windows Server 2019, edición Standard o Datacenter
  • 2 CPU
  • 8 GB DE RAM
  • 100 GB de almacenamiento

Nota:

El equipo HGS no puede formar parte de un dominio antes de empezar.

Paso 1: Configurar el equipo HGS

En este paso, configurará el equipo HGS para ejecutar la atestación de la clave de host que admite el servicio de protección de host.

  1. Inicie sesión en el equipo HGS como administrador (administrador local), abra una consola de Windows PowerShell con privilegios y agregue el rol del servicio de protección de host ejecutando el comando siguiente:

    Install-WindowsFeature -Name HostGuardianServiceRole -IncludeManagementTools -Restart
    
  2. Una vez reiniciado el equipo HGS, inicie sesión de nuevo con su cuenta de administrador, abra una consola de Windows PowerShell con privilegios y ejecute los comandos siguientes para instalar el servicio de protección de host y configurar su dominio. La contraseña que especifique aquí solo se aplicará a la contraseña del modo de reparación de servicios del directorio de Active Directory, pero no cambiará su contraseñas de inicio de sesión en la cuenta de administrador. Puede proporcionar el nombre de dominio que quiera para HgsDomainName.

    $adminPassword = ConvertTo-SecureString -AsPlainText '<password>' -Force
    Install-HgsServer -HgsDomainName 'bastion.local' -SafeModeAdministratorPassword $adminPassword -Restart
    
  3. Después de reiniciar el equipo de nuevo, inicie sesión con su cuenta de administrador (que ahora también es un administrador de dominio). Abra una consola de Windows PowerShell con privilegios elevados y configure la atestación de tecla del host para la instancia de HGS.

    Initialize-HgsAttestation -HgsServiceName 'hgs' -TrustHostKey  
    
  4. Ejecute el comando siguiente para obtener la dirección IP del equipo HGS. Guarde esta dirección IP para los pasos posteriores.

    Get-NetIPAddress  
    

Nota:

Como alternativa, si quiere hacer referencia a su equipo HGS con un nombre DNS, puede configurar un reenviador desde los servidores DNS corporativos para el nuevo controlador de dominio HGS.

Paso 2: Configurar el equipo con SQL Server como un host protegido

En este paso, deberá configurar el equipo con SQL Server como un host protegido registrado en HGS con una atestación de clave de host.

Advertencia

La atestación de clave de host se considera un modo de atestación más débil. Si es posible, debe usar la atestación de TPM para los entornos de producción. Para más información, consulte Modos de atestación.

  1. Inicie sesión en el equipo de SQL Server como administrador, abra una consola de Windows PowerShell con privilegios elevados y recupere el nombre de su equipo mediante el acceso a la variable computername.

    $env:computername 
    
  2. Instale la característica de host protegido, que también instala Hyper-V (si aún no está instalada).

    Enable-WindowsOptionalFeature -Online -FeatureName HostGuardian -All
    
  3. Reinicie el equipo con SQL Server cuando se le pida para completar la instalación de Hyper-V.

  4. Si el equipo con SQL Server es una máquina virtual, una máquina física que no admite el arranque seguro de UEFI o una máquina física que no está equipada con una unidad IOMMU, tendrá que quitar el requisito de VBS de las características de seguridad de plataforma.

    1. Para quitar el requisito de arranque seguro e IOMMU, ejecute el comando siguiente en el equipo con SQL Server en una consola de PowerShell con privilegios elevados:

      Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard -Name RequirePlatformSecurityFeatures -Value 0
      
    2. Vuelva a reiniciar el equipo con SQL Server para que VBS se ponga en línea con los requisitos reducidos.

      Restart-Computer
      
  5. Vuelva a iniciar sesión en el equipo con SQL Server como un administrador, abra una consola de Windows PowerShell con privilegios, genere una clave de host única y exporte la clave pública resultante a un archivo.

    Set-HgsClientHostKey 
    Get-HgsClientHostKey -Path $HOME\Desktop\hostkey.cer
    
  6. Copie manualmente el archivo de clave de host, generado en el paso anterior, en la máquina HGS. En las instrucciones siguientes se presupone que el nombre de archivo es hostkey.cer y que lo va a copiar en el escritorio de la máquina HGS.

  7. En el equipo HGS, abra una consola de Windows PowerShell con privilegios y registre la clave de host del equipo con SQL Server con HGS:

    Add-HgsAttestationHostKey -Name <your SQL Server computer name> -Path $HOME\Desktop\hostkey.cer
    
  8. En el equipo con SQL Server, ejecute el siguiente comando en una consola de Windows PowerShell con privilegios para indicar al equipo con SQL Server dónde debe hacer la atestación. Asegúrese de que especifica la dirección IP o el nombre de DNS del equipo HGS en ambas ubicaciones de dirección.

    # use http, and not https
    Set-HgsClientConfiguration -AttestationServerUrl http://<IP address or DNS name>/Attestation -KeyProtectionServerUrl http://<IP address or DNS name>/KeyProtection/  
    

El resultado del comando anterior debe mostrar que el estado de la atestación es correcto.

Si se produce un error HostUnreachable, significa que el equipo con SQL Server no puede comunicarse con HGS. Asegúrese de que se puede hacer ping al equipo HGS.

Un error UnauthorizedHost indica que la clave pública no se registró con el servidor HGS. Repita los pasos 5 y 6 para resolver el error.

Si se produce un error en todo lo demás, ejecute Remove-HgsClientHostKey y repita los pasos 4 a 7.

Paso 3: Configurar Always Encrypted con enclaves seguros en SQL Server

En este paso, deberá habilitar la funcionalidad de Always Encrypted usando enclaves en su instancia de SQL Server.

  1. Con SSMS, conéctese a la instancia de SQL Server como sysadmin sin Always Encrypted habilitado para la conexión de base de datos.

    1. Inicie SSMS.

    2. En el cuadro de diálogo Conectar a servidor, especifique el nombre del servidor, seleccione un método de autenticación e indique sus credenciales.

    3. Seleccione Opciones >> y seleccione la pestaña Always Encrypted.

    4. Asegúrese de que la casilla Habilitar Always Encrypted (cifrado de columna)no esté activada.

      Screenshot of the SSMS connection option for Always Encrypted disabled.

    5. Seleccione Conectar.

  2. Abra una nueva ventana de consulta y ejecute la siguiente instrucción para establecer el tipo de enclave seguro en la seguridad basada en la virtualización (VBS).

    EXEC sys.sp_configure 'column encryption enclave type', 1;
    RECONFIGURE;
    
  3. Reinicie su instancia de SQL Server para que se aplique el cambio anterior. Puede reiniciar la instancia en SSMS haciendo clic con el botón derecho en ella en el Explorador de objetos y seleccionando Reiniciar. Cuando se reinicie la instancia, vuelva a conectarse a ella.

  4. Confirme que el enclave seguro se ha cargado ejecutando la siguiente consulta:

    SELECT [name], [value], [value_in_use] FROM sys.configurations
    WHERE [name] = 'column encryption enclave type';
    

    La consulta debe devolver el resultado siguiente:

    name value value_in_use
    tipo de enclave de cifrado de columnas 1 1

Paso 4: Crear una base de datos de ejemplo

En este paso, creará una base de datos con algunos datos de ejemplo, que cifrará más adelante.

  1. Con la instancia de SSMS del paso anterior, ejecute la siguiente instrucción en una ventana de consulta para crear una base de datos denominada ContosoHR.

    CREATE DATABASE [ContosoHR];
    
  2. Cree una tabla denominada Empleados.

    USE [ContosoHR];
    GO
    
    CREATE SCHEMA [HR];
    GO
    
    CREATE TABLE [HR].[Employees]
    (
        [EmployeeID] [int] IDENTITY(1,1) NOT NULL,
        [SSN] [char](11) NOT NULL,
        [FirstName] [nvarchar](50) NOT NULL,
        [LastName] [nvarchar](50) NOT NULL,
        [Salary] [money] NOT NULL
    ) ON [PRIMARY];
    
  3. Agregue a esta tabla algunos registros de empleados.

    USE [ContosoHR];
    GO
    
    INSERT INTO [HR].[Employees]
            ([SSN]
            ,[FirstName]
            ,[LastName]
            ,[Salary])
        VALUES
            ('795-73-9838'
            , N'Catherine'
            , N'Abel'
            , $31692);
    
    INSERT INTO [HR].[Employees]
            ([SSN]
            ,[FirstName]
            ,[LastName]
            ,[Salary])
        VALUES
            ('990-00-6818'
            , N'Kim'
            , N'Abercrombie'
            , $55415);
    

Paso 5: Aprovisionar claves habilitadas para el enclave

En este paso, creará una clave de columna maestra y una clave de cifrado de columna que admiten los cálculos de enclave.

  1. Con la instancia de SSMS del paso anterior, en el Explorador de objetos, expanda la base de datos y vaya a Seguridad>Claves de Always Encrypted.

  2. Aprovisione una nueva clave maestra de columna habilitada para el enclave:

    1. Haga clic con el botón derecho en Claves de Always Encrypted y seleccione Nueva clave maestra de columna… .

    2. Seleccione su nombre de clave maestra de columna: CMK1.

    3. Seleccione Almacén de certificados de Windows (usuario actual o equipo local) o Azure Key Vault.

    4. Seleccione Permitir cálculos de enclave.

    5. Si ha seleccionado Azure Key Vault, inicie sesión en Azure y seleccione su almacén de claves. Para obtener más información sobre cómo crear un almacén de claves para Always Encrypted, consulte Administrar sus almacenes de claves desde Azure Portal.

    6. Seleccione su certificado o su clave de Azure Key Vault si ya existe, o bien seleccione el botón Generar certificado para crear uno.

    7. Seleccione Aceptar.

      Screenshot of the allow enclave computations selection in SSMS when creating a new column master key.

  3. Cree una nueva clave de cifrado de columnas habilitada para el enclave:

    1. Haga clic con el botón derecho en Claves de Always Encrypted y seleccione Nueva clave maestra de columna.
    2. Escriba un nombre para la nueva clave de cifrado de columnas: CEK1.
    3. En la lista desplegable Clave maestra de columna, seleccione la clave maestra de columna que creó en los pasos anteriores.
    4. Seleccione Aceptar.

Paso 6: Cifrar algunas columnas en su lugar

En este paso, va a cifrar los datos almacenados en las columnas SSN y Salario dentro del enclave del lado servidor y después podrá probar una consulta SELECT de los datos.

  1. Abra una nueva instancia de SSMS y conéctese a la instancia de SQL Server con Always Encrypted habilitado para la conexión de base de datos.

    1. Inicie una nueva instancia de SSMS.

    2. En el cuadro de diálogo Conectar a servidor, especifique el nombre del servidor, seleccione un método de autenticación e indique sus credenciales.

    3. Seleccione Opciones >> y seleccione la pestaña Always Encrypted.

    4. Active la casilla Habilitar Always Encrypted (cifrado de columna).

    5. Seleccione Habilitar enclaves seguros. (Este paso se aplica a SSMS 19 o posterior).

    6. Establezca Protocolo en Servicio de protección de host. (Este paso se aplica a SSMS 19 o posterior).

    7. Especifique la dirección URL de atestación del enclave (por ejemplo, http://hgs.bastion.local/Attestation).

      Screenshot of the connect to server Always Encrypted tab with attestation using SSMS.

    8. Seleccione Conectar.

    9. Si se le pide que habilite la parametrización para las consultas Always Encrypted, haga clic en Habilitar.

  2. Con la misma instancia de SSMS (con Always Encrypted habilitado), abra una nueva ventana de consulta y cifre las columnas SSN y Salario mediante la ejecución de las consultas siguientes.

    USE [ContosoHR];
    GO
    
    ALTER TABLE [HR].[Employees]
    ALTER COLUMN [SSN] [char] (11) COLLATE Latin1_General_BIN2
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
    WITH
    (ONLINE = ON);
    
    ALTER TABLE [HR].[Employees]
    ALTER COLUMN [Salary] [money]
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
    WITH
    (ONLINE = ON);
    
    ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
    

    Nota:

    Observe la instrucción ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE para borrar la memoria caché del plan de consulta para la base de datos en el script anterior. Después de modificar la tabla, deberá borrar los planes de todos los lotes y procedimientos almacenados que tengan acceso a la tabla con el fin de actualizar la información de cifrado de los parámetros.

  3. Para comprobar que las columnas SSN y Salario ahora están cifradas, abra una nueva ventana de consulta en la instancia de SSMS sin Always Encrypted habilitado para la conexión de base de datos y ejecute la siguiente instrucción. La ventana de consulta debe devolver valores cifrados de las columnas SSN y Salario. Si ejecuta la misma consulta mediante la instancia SSMS con Always Encrypted habilitado, verá los datos descifrados.

    SELECT * FROM [HR].[Employees];
    

Paso 7: Ejecutar consultas completas sobre columnas cifradas

Ahora puede ejecutar consultas completas sobre columnas cifradas. Se realizará algún procesamiento de consulta dentro del enclave del lado del servidor.

  1. En la instancia de SSMS con Always Encrypted habilitado, asegúrese de que también está habilitada la parametrización para Always Encrypted.

    1. Seleccione Herramientas en el menú principal de SSMS.
    2. Seleccione Opciones... .
    3. Vaya a Ejecución de consulta>SQL Server>Avanzadas.
    4. Asegúrese de que la opción Habilitar parametrización para Always Encrypted esté activada.
    5. Seleccione Aceptar.
  2. Abra una nueva ventana de consulta y pegue y ejecute la siguiente consulta. La consulta debe devolver los valores de texto no cifrado y las filas que cumplan los criterios de búsqueda especificados.

    DECLARE @SSNPattern [char](11) = '%6818';
    DECLARE @MinSalary [money] = $1000;
    SELECT * FROM [HR].[Employees]
    WHERE SSN LIKE @SSNPattern AND [Salary] >= @MinSalary;
    
  3. Pruebe de nuevo la misma consulta en la instancia de SSMS que no tiene habilitado Always Encrypted y observe el error que se produce.

Pasos siguientes

Después de completar este tutorial, puede ir a uno de los siguientes tutoriales:

Vea también