Compartilhar via


Set-SqlColumnEncryption

Criptografa, descriptografa ou criptografa novamente colunas especificadas no banco de dados.

Sintaxe

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

O cmdlet Set-SqlColumnEncryption criptografa, descriptografa ou criptografa novamente colunas de banco de dados especificadas usando o recurso Always Encrypted.

O cmdlet aceita uma matriz de sqlColumnEncryptionSettings objetos, cada um dos quais especifica a configuração de criptografia de destino para uma coluna no banco de dados.

O cmdlet criptografará, descriptografará ou criptografará novamente cada coluna especificada, dependendo da configuração de criptografia atual da coluna e das configurações de criptografia de destino especificadas.

O cmdlet se comunica com repositórios de chaves que contêm chaves mestras de colunas. Se qualquer chave mestra de coluna que protege as colunas a serem criptografadas, descriptografadas ou criptografadas novamente, for armazenada no Azure, você precisará especificar um token de autenticação válido para um cofre de chaves ou um HSM gerenciado que contém a chave. Como alternativa, você pode autenticar no Azure com Add-SqlAzureAuthenticationContext antes de chamar esse cmdlet.

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

Exemplos

Exemplo 1: aplique as configurações de criptografia de destino especificadas a três colunas de banco de dados.

Neste exemplo, a coluna dbo.Student.Id é criptografada usando criptografia determinística e a chave de criptografia de coluna, chamada MyCEK.

A coluna dbo.Student.LastName é criptografada usando criptografia aleatória e a chave de criptografia de coluna, chamada MyCEK.

A coluna dbo.StudentFirstName não é criptografada (se a coluna for inicialmente criptografada, ela será descriptografada).

O exemplo usa a abordagem offline, o que significa que a tabela Student permanecerá indisponível para atualizações durante toda a operação. Suponha que a chave mestra de coluna, protegendo MyCEK, não seja armazenada no 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 .

Exemplo 2: aplicar as configurações de criptografia de destino especificadas às três colunas de banco de dados (a chave mestra de coluna é armazenada no Azure Key Vault).)

Este exemplo é semelhante ao acima; a única diferença é que a chave mestra de coluna que protege MyCEK é armazenada no 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

Exemplo 3: aplique as configurações de criptografia de destino especificadas a três colunas de banco de dados usando a abordagem online.

Neste exemplo, Student tabela ficará indisponível para leituras e gravações por até 30 segundos (o valor especificado usando o parâmetro MaxDowntimeInSeconds.) Suponha que a chave mestra de coluna, protegendo MyCEK, seja armazenada fora do Azure (não é necessário passar um token do 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 .

Exemplo 4: aplicar configurações de criptografia de destino a várias colunas usando criptografia in-loco.

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

Este exemplo aplica as configurações de criptografia de destino às colunas de banco de dados usando criptografia in-loco, desde que todos os pré-requisitos para criptografia in-loco sejam atendidos, ou seja, o banco de dados tem um enclave habilitado e as chaves usadas em operações criptográficas, que o cmdlet dispara, são habilitadas para enclave.

Parâmetros

-AccessToken

O token de acesso usado para autenticar no SQL Server, como uma alternativa ao usuário/senha ou à Autenticação do Windows.

Isso pode ser usado, por exemplo, para se conectar a SQL Azure DB e SQL Azure Managed Instance usando um Service Principal ou um Managed Identity.

O parâmetro a ser usado pode ser uma cadeia de caracteres que representa o token ou um objeto PSAccessToken conforme retornado executando Get-AzAccessToken -ResourceUrl https://database.windows.net.

Esse parâmetro é novo na v22 do módulo.

Tipo:PSObject
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-AllowVerboseLogging

Se definido, o cmdlet adicionará mensagens detalhadas ao arquivo de log (se o parâmetro 'LogFileDirectory' estiver definido) e manterá os arquivos dacpac usados pelas bibliotecas subjacentes para executar a operação.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-ColumnEncryptionSettings

Especifica uma matriz de objetos SqlColumnEncryptionSettings, cada um dos quais especifica a configuração de criptografia de destino para uma coluna no banco de dados.

Tipo:SqlColumnEncryptionSettings[]
Cargo:Named
Valor padrão:None
Obrigatório:True
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-EnclaveAttestationProtocol

Especifica o protocolo de atestado de um enclave para Always Encrypted com enclaves seguros. Esse parâmetro é necessário para que o cmdlet execute operações criptográficas in-loco - dentro de um enclave seguro do lado do servidor - para anular a despesa de baixar e carregar os dados. Observe que a criptografia in-loco tem outros pré-requisitos: seu banco de dados deve ter um enclave configurado e você precisa usar chaves criptográficas habilitadas para enclave.

Tipo:SqlConnectionAttestationProtocol
Aliases:AttestationProtocol
Valores aceitos:NotSpecified, AAS, None, HGS
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-EnclaveAttestationURL

Especifica uma URL de atestado de enclave para criptografia in-loco ao usar o Always Encrypted com enclaves seguros. Necessário se enclaveAttestationProtocol estiver definido como AAS ou HGS.

Tipo:String
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Encrypt

O tipo de criptografia a ser usado ao se conectar ao SQL Server.

Esse valor é mapeado para a propriedade EncryptSqlConnectionEncryptOption no objeto SqlConnection do driver Microsoft.Data.SqlClient.

Na v22 do módulo, o padrão é Optional (para compatibilidade com v21). Na v23+ do módulo, o valor padrão será 'Obrigatório', o que pode criar uma alteração significativa para scripts existentes.

Esse parâmetro é novo na v22 do módulo.

Tipo:String
Valores aceitos:Mandatory, Optional, Strict
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-HostNameInCertificate

O nome do host a ser usado na validação do certificado TLS/SSL do SQL Server. Você deve passar esse parâmetro se a instância do SQL Server estiver habilitada para o Force Encryption e quiser se conectar a uma instância usando nome de host/nome curto. Se esse parâmetro for omitido, passar o FQDN (Nome de Domínio Totalmente Qualificado) para -ServerInstance será necessário para se conectar a uma instância do SQL Server habilitada para o Force Encryption.

Esse parâmetro é novo na v22 do módulo.

Tipo:String
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-InputObject

Especifica o objeto de banco de dados SQL, para o qual esse cmdlet executa a operação.

Tipo:Database
Cargo:1
Valor padrão:None
Obrigatório:True
Aceitar a entrada de pipeline:True
Aceitar caracteres curinga:False

-KeepCheckForeignKeyConstraints

Se definido, verifique se a semântica (CHECK ou NOCHECK) das restrições de chave estrangeira é preservada.

Caso contrário, se não for definido e se UseOnlineApproach não estiver definido, as restrições de chave estrangeira serão sempre recriadas com a opção NOCHECK para minimizar o impacto sobre os aplicativos.

KeepCheckForeignKeyConstraints é válido somente quando UseOnlineApproach está definido.

Com a abordagem offline, a semântica das restrições de chave estrangeira é sempre preservada.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:False
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-KeyVaultAccessToken

Especifica um token de acesso para cofres de chaves no Azure Key Vault. Use esse parâmetro se qualquer uma das chaves mestras de coluna que protegem as colunas a serem criptografadas, descriptografadas ou criptografadas novamente, estiverem armazenadas em cofres de chaves no Azure Key Vault.

Tipo:String
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-LockTimeoutInSeconds

Especifica o tempo máximo (em segundos) em que o cmdlet aguardará os bloqueios de banco de dados necessários para iniciar a última iteração de recuperação. Um valor de -1 (padrão) não indica nenhum período de tempo limite (ou seja, aguarde para sempre). Um valor de 0 significa não esperar. Quando uma espera por um bloqueio excede o valor de tempo limite, um erro é retornado. Válido somente se UseOnlineApproach estiver definido.

Tipo:Int32
Cargo:Named
Valor padrão:-1
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-LogFileDirectory

Se definido, o cmdlet criará um arquivo de log no diretório especificado.

Tipo:String
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-ManagedHsmAccessToken

Especifica um token de acesso para HSMs gerenciados no Azure Key Vault. Use esse parâmetro se qualquer uma das chaves mestras de coluna que protegem as colunas a serem criptografadas, descriptografadas ou criptografadas novamente, forem armazenadas em HSMs gerenciados no Azure Key Vault.

Tipo:String
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-MaxDivergingIterations

Especifica o número máximo de iterações de recuperação consecutivas, em que o número de linhas processadas aumenta. Quando esse limite é atingido, o cmdlet pressupõe que ele não será capaz de acompanhar as alterações feitas na tabela de origem e anula a operação e recria o estado original do banco de dados. Válido somente se UseOnlineApproach estiver definido. Deve ser menor que o valor de MaxIterations.

Tipo:Int32
Cargo:Named
Valor padrão:5
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-MaxDowntimeInSeconds

Especifica o tempo máximo (em segundos), durante o qual a tabela de origem não estará disponível para leituras e gravações. Válido somente se UseOnlineApproach estiver definido.

Tipo:Int32
Cargo:Named
Valor padrão:1800
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-MaxIterationDurationInDays

Especifica o tempo máximo (em dias) de propagação ou uma única iteração de recuperação. Se a propagação ou qualquer iteração de recuperação levar mais do que o valor especificado, o cmdlet anulará a operação e recria o estado original do banco de dados. Válido somente se UseOnlineApproach estiver definido.

Tipo:Int32
Cargo:Named
Valor padrão:3
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-MaxIterations

Especifica o número máximo de iterações na fase de recuperação. Quando esse limite é atingido, o cmdlet anula a operação e recria o estado original do banco de dados. Válido somente se UseOnlineApproach estiver definido.

Tipo:Int32
Cargo:Named
Valor padrão:100
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Path

Especifica o caminho do banco de dados SQL, para o qual esse cmdlet executa a operação. Se você não especificar um valor para esse parâmetro, o cmdlet usará o local de trabalho atual.

Tipo:String
Cargo:1
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-ProgressAction

Determina como o PowerShell responde às atualizações de progresso geradas por um script, cmdlet ou provedor, como as barras de progresso geradas pelo cmdlet Write-Progress. O cmdlet Write-Progress cria barras de progresso que mostram o status de um comando.

Tipo:ActionPreference
Aliases:proga
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Script

Indica que esse cmdlet retorna um script Transact-SQL que executa a tarefa executada por esse cmdlet.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-TrustServerCertificate

Indica se o canal será criptografado ao ignorar a cadeia de certificados para validar a confiança.

Na v22 do módulo, o padrão é $true (para compatibilidade com v21). Na v23+ do módulo, o valor padrão será "$false", o que pode criar uma alteração significativa para scripts existentes.

Esse parâmetro é novo na v22 do módulo.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-UseOnlineApproach

Se definido, o cmdlet usará a abordagem online para garantir que o banco de dados esteja disponível para outros aplicativos para leituras e gravações durante a maior parte da operação.

Caso contrário, o cmdlet bloqueará as tabelas afetadas, tornando-as indisponíveis para atualizações de toda a operação. As tabelas estarão disponíveis para leituras.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:False
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

Entradas

Microsoft.SqlServer.Management.Smo.Database

Saídas

String