Aprovisionar claves habilitadas para el enclave

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

En este artículo se describe cómo aprovisionar claves habilitadas para el enclave que admiten cálculos dentro de los enclaves seguros del lado servidor que se usan en Always Encrypted con enclaves seguros.

Los procesos y las instrucciones generales para administrar claves de Always Encrypted son válidos también para aprovisionar claves habilitadas para el enclave. En este artículo se abordan detalles específicos de Always Encrypted con enclaves seguro.

Para aprovisionar una clave maestra de columna habilitada para el enclave con SQL Server Management Studio o PowerShell, asegúrese de que la nueva clave admite cálculos de enclave. Esto hará que la herramienta (SSMS o PowerShell) genere la instrucción CREATE COLUMN MASTER KEY, que establece ENCLAVE_COMPUTATIONS en los metadatos de la clave maestra de columnas en la base de datos. Para más información, vea CREATE COLUMN MASTER KEY (Transact-SQL).

La herramienta también firmará digitalmente las propiedades maestras de columna con la clave maestra de columna, y almacenará la firma en los metadatos de la base de datos. La firma evita la alteración malintencionada con la configuración ENCLAVE_COMPUTATIONS. Los controladores cliente SQL comprueban las firmas antes de permitir el uso de enclaves. Esto proporciona a los administradores de seguridad control sobre qué datos de la columna se pueden calcular en el enclave.

ENCLAVE_COMPUTATIONS es inmutable, lo que significa que no se puede cambiar una vez definida la clave maestra de columna en los metadatos. Para posibilitar los cálculos de enclave con una clave de cifrado de columna que cifra una clave maestra de columna determinada, hay que rotar la clave maestra de columna y reemplazarla por una clave maestra de columna habilitada para el enclave. Vea Rotación de claves habilitadas para el enclave.

Nota:

Actualmente, tanto SSMS como PowerShell admiten claves maestras de columna habilitadas para el enclave almacenadas en Azure Key Vault o en el almacén de certificados de Windows. No se admiten módulos de seguridad de hardware (mediante CNG o CAPI).

Para crear una clave de cifrado de columna habilitada para el enclave, debe asegurarse de que selecciona una clave maestra de columna habilitada para el enclave para cifrar la nueva clave.

En las siguientes secciones se proporcionan más detalles sobre cómo aprovisionar claves habilitadas para el enclave por medio de SSMS y PowerShell.

Aprovisionamiento de claves habilitadas para el enclave mediante SQL Server Management Studio

En SQL Server Management Studio puede aprovisionar lo siguiente:

  • Una clave maestra de columna habilitada para el enclave, mediante el cuadro de diálogo Nueva clave maestra de columna.
  • Una clave de cifrado de columna habilitada para el enclave, mediante el cuadro de diálogo Nueva clave de cifrado de columnas.

El Asistente para Always Encrypted también permite crear una clave maestra de columna habilitada para el enclave y una clave de cifrado de columna habilitada para el enclave.

Asegúrese de que ha instalado la versión más reciente de disponibilidad general (GA) de SQL Server Management Studio (SSMS).

Aprovisionamiento de claves maestras de columna habilitadas para el enclave con el cuadro de diálogo Nueva clave maestra de columna

Para aprovisionar una clave maestra de columna habilitada para el enclave, siga los pasos descritos en Aprovisionamiento de claves maestras de columna con el cuadro de diálogo Nueva clave maestra de columna. Asegúrese de seleccionar Permitir cálculos de enclave. Vea la siguiente captura de pantalla:

Allow enclave computations

Nota:

La casilla Permitir cálculos de enclave solo aparece si se ha configurado un enclave seguro para la base de datos. Si usa SQL Server, vea Configuración del enclave seguro en SQL Server. Si usa Azure SQL Database, vea Habilitación de Always Encrypted con enclaves seguros para Azure SQL Database.

Sugerencia

Para saber si una clave maestra de columna está habilitada para el enclave, haga clic con el botón derecho en ella en el Explorador de objetos y seleccione Propiedades. Si la clave está habilitada para el enclave, cálculos de enclave: permitidos aparece en la ventana que muestra las propiedades de la clave. También puede usar la vista sys.column_master_keys (Transact-SQL).

Aprovisionamiento de claves de cifrado de columna habilitadas para el enclave con el cuadro de diálogo Nueva clave de cifrado de columnas

Para aprovisionar una clave de cifrado de columna habilitada para el enclave, siga los pasos descritos en Aprovisionamiento de claves de cifrado de columna con el cuadro de diálogo Nueva clave de cifrado de columnas. Cuando seleccione una clave de cifrado de columna, asegúrese de que está habilitada para el enclave.

Sugerencia

Para saber si una clave de cifrado de columna está habilitada para el enclave, haga clic con el botón derecho en ella en el Explorador de objetos y seleccione Propiedades. Si la clave está habilitada para el enclave, cálculos de enclave: permitidos aparece en la ventana que muestra las propiedades de la clave.

Aprovisionamiento de claves habilitadas para el enclave mediante PowerShell

Si quiere aprovisionar claves habilitadas para el enclave mediante PowerShell, necesitará el módulo de PowerShell SqlServer versión 22 o posterior.

En general, los flujos de trabajo de aprovisionamiento de claves de PowerShell (con y sin separación de roles) para Always Encrypted (descritos en Aprovisionamiento de claves de Always Encrypted con PowerShell) son válidos también con las claves habilitadas para el enclave. En esta sección se describen detalles específicos de las claves habilitadas para el enclave.

El módulo de PowerShell SqlServer amplía los cmdlets New-SqlCertificateStoreColumnMasterKeySettings y New-SqlAzureKeyVaultColumnMasterKeySettings con el parámetro -AllowEnclaveComputations, que permite especificar una clave maestra de columna habilitada para el enclave durante el proceso de aprovisionamiento. Cualquiera de estos cmdlets crea un objeto local que contiene las propiedades de una clave maestra de columna (almacenada en Azure Key Vault o en el almacén de certificados de Windows). Si se especifica, la propiedad -AllowEnclaveComputations marca la clave como habilitada para el enclave en el objeto local. También hace que el cmdlet acceda a la clave maestra de columna referida (en Azure Key Vault o en el almacén de certificados de Windows) para firmar las propiedades de la clave digitalmente. Una vez creado el objeto de configuración de una nueva clave maestra de columna habilitada para el enclave, se puede usar en una invocación posterior del cmdlet New-SqlColumnMasterKey para crear un objeto de metadatos que describa la nueva clave en la base de datos.

El aprovisionamiento de claves de cifrado de columna habilitadas para el enclave es igual que el aprovisionamiento de claves de cifrado de columna no habilitadas para el enclave. solo hay que procurar que la clave maestra de columna usada para cifrar la nueva clave de cifrado de columna esté habilitada para el enclave.

Nota:

Actualmente, el módulo de PowerShell SqlServer no permite aprovisionar claves habilitadas para el enclave que estén almacenadas en módulos de seguridad de hardware (mediante CNG o CAPI).

Ejemplo: aprovisionar claves habilitadas para el enclave con el almacén de certificados de Windows

En el siguiente ejemplo completo se muestra cómo aprovisionar claves habilitadas para el enclave, almacenando la clave maestra de columna en el almacén de certificados de Windows. El script se basa en el ejemplo de Almacén de certificados de Windows sin separación de roles (ejemplo). Es importante tener en cuenta el uso del parámetro -AllowEnclaveComputations en el cmdlet New-SqlCertificateStoreColumnMasterKeySettings, que es la única diferencia entre los flujos de trabajo de los dos ejemplos.

# Create a column master key in Windows Certificate Store.
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation Cert:CurrentUser\My -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage DataEncipherment -KeySpec KeyExchange

# Import the SqlServer module.
Import-Module "SqlServer" -MinimumVersion 22.0.50

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your column master key
# using the -AllowEnclaveComputations parameter.
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint -AllowEnclaveComputations

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings

# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database. 
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName  -InputObject $database -ColumnMasterKey $cmkName

Ejemplo: aprovisionar claves habilitadas para el enclave mediante Azure Key Vault

En el siguiente ejemplo completo se muestra cómo aprovisionar claves habilitadas para el enclave mediante el almacenamiento de la clave maestra de columna en un almacén de claves en Azure Key Vault. El script se basa en el ejemplo de Azure Key Vault sin separación de roles (ejemplo). Es importante tener en cuenta dos diferencias entre el flujo de trabajo de las claves habilitadas para el enclave en comparación con las claves no habilitadas para el enclave.

  • En el siguiente script, New-SqlCertificateStoreColumnMasterKeySettings usa el parámetro -AllowEnclaveComputations para que la nueva clave maestra de columna esté habilitada para el enclave.
  • El siguiente script usa el cmdlet Get-AzAccessToken para obtener un token de acceso para almacenes de claves. Esto es necesario, ya que New-SqlAzureKeyVaultColumnMasterKeySettings debe tener acceso a Azure Key Vault para firmar las propiedades de la clave maestra de columna.
# Create a column master key in Azure Key Vault.
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
Connect-AzAccount
$SubscriptionId = "<Azure SubscriptionId>"
$resourceGroup = "<resource group name>"
$azureLocation = "<datacenter location>"
$akvName = "<key vault name>"
$akvKeyName = "<key name>"
$azureCtx = Set-AzConteXt -SubscriptionId $SubscriptionId # Sets the context for the below cmdlets to the specified subscription.
New-AzResourceGroup -Name $resourceGroup -Location $azureLocation # Creates a new resource group - skip, if your desired group already exists.
New-AzKeyVault -VaultName $akvName -ResourceGroupName $resourceGroup -Location $azureLocation # Creates a new key vault - skip if your vault already exists.
Set-AzKeyVaultAccessPolicy -VaultName $akvName -ResourceGroupName $resourceGroup -PermissionsToKeys get, create, delete, list, wrapKey,unwrapKey, sign, verify -UserPrincipalName $azureCtx.Account
$akvKey = Add-AzKeyVaultKey -VaultName $akvName -Name $akvKeyName -Destination "Software"

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token 

# Create a SqlColumnMasterKeySettings object for your column master key. 
$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyURL $akvKey.ID -AllowEnclaveComputations -KeyVaultAccessToken $keyVaultAccessToken

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings

# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database. 
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName -KeyVaultAccessToken $keyVaultAccessToken

Pasos siguientes

Consulte también