Compartir a través de


Set-SqlColumnEncryption

Cifra, descifra o vuelve a cifrar las columnas especificadas en la base de datos.

Sintaxis

Set-SqlColumnEncryption
   -ColumnEncryptionSettings <SqlColumnEncryptionSettings[]>
   [-UseOnlineApproach]
   [-KeepCheckForeignKeyConstraints]
   [-MaxDowntimeInSeconds <Int32>]
   [-KeyVaultAccessToken <String>]
   [-ManagedHsmAccessToken <String>]
   [-LockTimeoutInSeconds <Int32>]
   [-MaxIterationDurationInDays <Int32>]
   [-MaxDivergingIterations <Int32>]
   [-MaxIterations <Int32>]
   [-EnclaveAttestationProtocol <SqlConnectionAttestationProtocol>]
   [-EnclaveAttestationURL <String>]
   [-LogFileDirectory <String>]
   [-AllowVerboseLogging]
   [-InputObject] <Database>
   [-Script]
   [-AccessToken <PSObject>]
   [-TrustServerCertificate]
   [-HostNameInCertificate <String>]
   [-Encrypt <String>]
   [-ProgressAction <ActionPreference>]
   [<CommonParameters>]
Set-SqlColumnEncryption
   -ColumnEncryptionSettings <SqlColumnEncryptionSettings[]>
   [-UseOnlineApproach]
   [-KeepCheckForeignKeyConstraints]
   [-MaxDowntimeInSeconds <Int32>]
   [-KeyVaultAccessToken <String>]
   [-ManagedHsmAccessToken <String>]
   [-LockTimeoutInSeconds <Int32>]
   [-MaxIterationDurationInDays <Int32>]
   [-MaxDivergingIterations <Int32>]
   [-MaxIterations <Int32>]
   [-EnclaveAttestationProtocol <SqlConnectionAttestationProtocol>]
   [-EnclaveAttestationURL <String>]
   [-LogFileDirectory <String>]
   [-AllowVerboseLogging]
   [[-Path] <String>]
   [-Script]
   [-AccessToken <PSObject>]
   [-TrustServerCertificate]
   [-HostNameInCertificate <String>]
   [-Encrypt <String>]
   [-ProgressAction <ActionPreference>]
   [<CommonParameters>]

Description

El cmdlet Set-SqlColumnEncryption cifra, descifra o vuelve a cifrar columnas de base de datos especificadas mediante la característica Always Encrypted.

El cmdlet acepta una matriz de objetos SqlColumnEncryptionSettings, cada uno de los cuales especifica la configuración de cifrado de destino para una columna de la base de datos.

El cmdlet cifrará, descifrará o volverá a cifrar cada columna especificada, según la configuración de cifrado actual de la columna y la configuración de cifrado de destino especificada.

El cmdlet se comunica con almacenes de claves que contienen claves maestras de columnas. Si cualquier clave maestra de columna que proteja las columnas que se van a cifrar, descifrar o volver a cifrar, se almacena en Azure, debe especificar un token de autenticación válido para un almacén de claves o un HSM administrado que contenga la clave. Como alternativa, puede autenticarse en Azure con Add-SqlAzureAuthenticationContext antes de llamar a este cmdlet.

Module requirements: version 21+ on PowerShell 5.1; version 22+ on PowerShell 7.x.

Ejemplos

Ejemplo 1: Aplicar la configuración de cifrado de destino especificada a tres columnas de base de datos.

En este ejemplo, la columna dbo.Student.Id se cifra mediante cifrado determinista y la clave de cifrado de columna, denominada MyCEK.

La columna dbo.Student.LastName se cifra mediante cifrado aleatorio y la clave de cifrado de columna, denominada MyCEK.

La columna dbo.StudentFirstName no se cifra (si la columna se cifra inicialmente, se descifra).

En el ejemplo se usa el enfoque sin conexión, lo que significa que la tabla Student seguirá sin estar disponible para las actualizaciones a lo largo de la operación. Supongamos que la clave maestra de columna, que protege MyCEK, no se almacena en Azure Key Vault.

$ces1 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.Id'        -EncryptionType 'Deterministic' -EncryptionKey 'MyCek'
$ces2 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.LastName'  -EncryptionType 'Randomized'    -EncryptionKey 'MyCek'
$ces3 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.FirstName' -EncryptionType 'Plaintext'
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces1,$ces2,$ces3 -LogFileDirectory .

Ejemplo 2: Aplicación de la configuración de cifrado de destino especificada a las tres columnas de base de datos (la clave maestra de columna se almacena en Azure Key Vault).

Este ejemplo es similar al anterior; solo la diferencia es que la clave maestra de columna que protege MyCEK se almacena en Azure Key Vault.

# Connect to Azure account.
Import-Module Az.Accounts -MinimumVersion 2.2.0
Connect-AzAccount

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

$ces1 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.Id'        -EncryptionType 'Deterministic' -EncryptionKey 'MyCek'
$ces2 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.LastName'  -EncryptionType 'Randomized'    -EncryptionKey 'MyCek' 
$ces3 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.FirstName' -EncryptionType 'Plaintext'

# Pass the token to the cmdlet. It will use the token to communicate with Azure Key Vault to obtain the plaintext value of the column encryption key.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces1,$ces2,$ces3 -LogFileDirectory . -KeyVaultAccessToken $keyVaultAccessToken

Ejemplo 3: Aplique la configuración de cifrado de destino especificada a tres columnas de base de datos mediante el enfoque en línea.

En este ejemplo Student tabla no estará disponible para lecturas y escrituras durante un máximo de 30 segundos (el valor especificado con el parámetro MaxDowntimeInSeconds). Supongamos que la clave maestra de columna, que protege MyCEK, se almacena fuera de Azure (no se requiere pasar un token de Azure).

$ces1 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.Id'        -EncryptionType 'Deterministic' -EncryptionKey 'MyCek'
$ces2 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.LastName'  -EncryptionType 'Randomized'    -EncryptionKey 'MyCek'
$ces3 = New-SqlColumnEncryptionSettings -ColumnName 'dbo.Student.FirstName' -EncryptionType 'Plaintext'
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces1,$ces2,$ces3 -UseOnlineApproach -MaxDowntimeInSeconds 30 -LogFileDirectory .

Ejemplo 4: Aplicar la configuración de cifrado de destino a varias columnas mediante el cifrado en contexto.

$ces1 = New-SqlColumnEncryptionSettings -ColumnName dbo.Student.Id        -EncryptionType 'Randomized' -EncryptionKey 'CEK1' 
$ces2 = New-SqlColumnEncryptionSettings -ColumnName dbo.Student.LastName  -EncryptionType 'Randomized' -EncryptionKey 'CEK1' 
$ces3 = New-SqlColumnEncryptionSettings -ColumnName dbo.Student.FirstName -EncryptionType 'Randomized' -EncryptionKey 'CEK1'
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces1,$ces2,$ces3 -LogFileDirectory . -EnclaveAttestationProtocol 'AAS' -EnclaveAttestationURL 'https://enclavedemoattest.weu.attest.azure.net'

En este ejemplo se aplica la configuración de cifrado de destino a las columnas de base de datos mediante cifrado local, siempre que se cumplan todos los requisitos previos para el cifrado local, es decir, la base de datos tiene habilitado un enclave y las claves usadas en las operaciones criptográficas, que desencadena el cmdlet, están habilitadas para el enclave.

Parámetros

-AccessToken

El token de acceso que se usa para autenticarse en SQL Server, como alternativa a la autenticación de usuario o contraseña de Windows.

Esto se puede usar, por ejemplo, para conectarse a SQL Azure DB y SQL Azure Managed Instance mediante un Service Principal o un Managed Identity.

El parámetro que se va a usar puede ser una cadena que representa el token o un objeto PSAccessToken tal como se devuelve mediante la ejecución de Get-AzAccessToken -ResourceUrl https://database.windows.net.

Este parámetro es nuevo en la versión 22 del módulo.

Tipo:PSObject
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-AllowVerboseLogging

Si se establece, el cmdlet agregará mensajes detallados al archivo de registro (si se establece el parámetro "LogFileDirectory") y conservará los archivos dacpac usados por las bibliotecas subyacentes para realizar la operación.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-ColumnEncryptionSettings

Especifica una matriz de objetos SqlColumnEncryptionSettings, cada uno de los cuales especifica la configuración de cifrado de destino para una columna de la base de datos.

Tipo:SqlColumnEncryptionSettings[]
Posición:Named
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-EnclaveAttestationProtocol

Especifica el protocolo de atestación de un enclave para Always Encrypted con enclaves seguros. Este parámetro es necesario para que el cmdlet realice operaciones criptográficas en contexto , dentro de un enclave seguro del lado servidor, para anular el gasto de descarga y carga de los datos. Tenga en cuenta que el cifrado local tiene otros requisitos previos: la base de datos debe tener un enclave configurado y debe usar claves criptográficas habilitadas para el enclave.

Tipo:SqlConnectionAttestationProtocol
Alias:AttestationProtocol
Valores aceptados:NotSpecified, AAS, None, HGS
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-EnclaveAttestationURL

Especifica una dirección URL de atestación de enclave para el cifrado en contexto al usar Always Encrypted con enclaves seguros. Obligatorio si enclaveAttestationProtocol está establecido en AAS o HGS.

Tipo:String
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Encrypt

Tipo de cifrado que se va a usar al conectarse a SQL Server.

Este valor se asigna a la propiedad EncryptSqlConnectionEncryptOption en el objeto SqlConnection del controlador Microsoft.Data.SqlClient.

En la versión 22 del módulo, el valor predeterminado es Optional (por compatibilidad con v21). En la versión 23+ del módulo, el valor predeterminado será "Obligatorio", que puede crear un cambio importante para los scripts existentes.

Este parámetro es nuevo en la versión 22 del módulo.

Tipo:String
Valores aceptados:Mandatory, Optional, Strict
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-HostNameInCertificate

Nombre de host que se va a usar para validar el certificado TLS/SSL de SQL Server. Debe pasar este parámetro si la instancia de SQL Server está habilitada para Forzar cifrado y desea conectarse a una instancia mediante el nombre de host o el nombre corto. Si se omite este parámetro, es necesario pasar el nombre de dominio completo (FQDN) a -ServerInstance es necesario para conectarse a una instancia de SQL Server habilitada para Forzar cifrado.

Este parámetro es nuevo en la versión 22 del módulo.

Tipo:String
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-InputObject

Especifica el objeto de base de datos SQL para el que este cmdlet ejecuta la operación.

Tipo:Database
Posición:1
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:True
Aceptar caracteres comodín:False

-KeepCheckForeignKeyConstraints

Si se establece, se conservan la semántica de comprobación (CHECK o NOCHECK) de restricciones de clave externa.

De lo contrario, si no se establece y si no se establece useOnlineApproach, las restricciones de clave externa siempre se vuelven a crear con la opción NOCHECK para minimizar el impacto en las aplicaciones.

KeepCheckForeignKeyConstraints solo es válido cuando se establece UseOnlineApproach.

Con el enfoque sin conexión, la semántica de las restricciones de clave externa siempre se conserva.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:False
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-KeyVaultAccessToken

Especifica un token de acceso para almacenes de claves en Azure Key Vault. Use este parámetro si cualquiera de las claves maestras de columna que protegen las columnas que se van a cifrar, descifrar o volver a cifrar, se almacenan en almacenes de claves en Azure Key Vault.

Tipo:String
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-LockTimeoutInSeconds

Especifica el tiempo máximo (en segundos) que el cmdlet esperará a los bloqueos de base de datos necesarios para comenzar la última iteración de puesta al día. Un valor de -1 (valor predeterminado) indica ningún período de tiempo de espera (es decir, esperar para siempre). Un valor de 0 significa no esperar en absoluto. Cuando una espera de un bloqueo supera el valor de tiempo de espera, se devuelve un error. Válido solo si se establece UseOnlineApproach.

Tipo:Int32
Posición:Named
Valor predeterminado:-1
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-LogFileDirectory

Si se establece, el cmdlet creará un archivo de registro en el directorio especificado.

Tipo:String
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-ManagedHsmAccessToken

Especifica un token de acceso para los HSM administrados en Azure Key Vault. Use este parámetro si cualquiera de las claves maestras de columna que protegen las columnas que se van a cifrar, descifrar o volver a cifrar, se almacenan en HSM administrados en Azure Key Vault.

Tipo:String
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-MaxDivergingIterations

Especifica el número máximo de iteraciones de puesta al día consecutivas, donde aumenta el número de filas procesadas. Cuando se alcanza este límite, el cmdlet supone que no podrá ponerse al día con los cambios realizados en la tabla de origen y anula la operación y vuelve a crear el estado original de la base de datos. Válido solo si se establece UseOnlineApproach. Debe ser menor que el valor de MaxIterations.

Tipo:Int32
Posición:Named
Valor predeterminado:5
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-MaxDowntimeInSeconds

Especifica el tiempo máximo (en segundos), durante el cual la tabla de origen no estará disponible para lecturas y escrituras. Válido solo si se establece UseOnlineApproach.

Tipo:Int32
Posición:Named
Valor predeterminado:1800
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-MaxIterationDurationInDays

Especifica el tiempo máximo (en días) de propagación o una única iteración de puesta al día. Si la propagación o cualquier iteración de puesta al día toma más del valor especificado, el cmdlet anula la operación y vuelve a crear el estado original de la base de datos. Válido solo si se establece UseOnlineApproach.

Tipo:Int32
Posición:Named
Valor predeterminado:3
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-MaxIterations

Especifica el número máximo de iteraciones en la fase de puesta al día. Cuando se alcanza este límite, el cmdlet anula la operación y vuelve a crear el estado original de la base de datos. Válido solo si se establece UseOnlineApproach.

Tipo:Int32
Posición:Named
Valor predeterminado:100
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Path

Especifica la ruta de acceso de la base de datos SQL, para la que este cmdlet ejecuta la operación. Si no especifica un valor para este parámetro, el cmdlet usa la ubicación de trabajo actual.

Tipo:String
Posición:1
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-ProgressAction

Determina cómo Responde PowerShell a las actualizaciones de progreso generadas por un script, cmdlet o proveedor, como las barras de progreso generadas por el cmdlet Write-Progress. El cmdlet Write-Progress crea barras de progreso que muestran el estado de un comando.

Tipo:ActionPreference
Alias:proga
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Script

Indica que este cmdlet devuelve un script de Transact-SQL que realiza la tarea que realiza este cmdlet.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-TrustServerCertificate

Indica si el canal se cifrará mientras se pasa la cadena de certificados para validar la confianza.

En la versión 22 del módulo, el valor predeterminado es $true (por compatibilidad con v21). En la versión 23+ del módulo, el valor predeterminado será "$false", que puede crear un cambio importante para los scripts existentes.

Este parámetro es nuevo en la versión 22 del módulo.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-UseOnlineApproach

Si se establece, el cmdlet usará el enfoque en línea para asegurarse de que la base de datos está disponible para otras aplicaciones para lecturas y escrituras durante la mayor parte de la duración de la operación.

De lo contrario, el cmdlet bloqueará las tablas afectadas, lo que hace que no estén disponibles para las actualizaciones de toda la operación. Las tablas estarán disponibles para lecturas.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:False
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

Entradas

Microsoft.SqlServer.Management.Smo.Database

Salidas

String