Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada de SQL do Azure
Este artigo fornece as etapas para definir a configuração de destino Always Encrypted para colunas de banco de dados que usam o cmdlet Set-SqlColumnEncryption (no módulo do SqlServer PowerShell). O cmdlet Set-SqlColumnEncryption modifica tanto o esquema de banco de dados de destino como os dados armazenados nas colunas selecionadas. Os dados armazenados em uma coluna podem ser criptografados, criptografados novamente ou descriptografados, de acordo com as configurações de criptografia de destino especificadas para as colunas e a configuração de criptografia atual. Para disparar operações criptográficas no local usando um enclave, Set-SqlColumnEncryption deve usar uma conexão de banco de dados criada usando uma cadeia de conexão com o Protocolo de Atestado e, opcionalmente, as palavras-chave de URL de Atestado.
Pré-requisitos
Para definir a configuração de criptografia de destino, verifique se:
- uma chave de criptografia de coluna habilitada por enclave está configurada no banco de dados (se você estiver criptografando ou recriptografando uma coluna). Para ver detalhes, consulte Gerenciar chaves para Always Encrypted com enclaves seguros.
- você está conectado ao banco de dados com o Always Encrypted habilitado e com as propriedades de atestado especificadas na string de conexão.
- Você pode acessar a chave mestra de coluna para cada coluna que deseja criptografar, criptografar novamente ou descriptografar no computador que executa os cmdlets do PowerShell.
- Use o módulo SqlServer do PowerShell versão 22.0.50 ou mais recente. Para criptografia online e local, use o módulo SqlServer PowerShell versão 22.3.0 ou posterior.
Note
A Microsoft recomenda usar o PowerShell 7 ou superior ao executar scripts do PowerShell para Always Encrypted. O PowerShell 7 fornece suporte multiplataforma aprimorado, melhor desempenho e compatibilidade com a versão mais recente do módulo SqlServer (v22+), que é necessária para muitos cenários do Always Encrypted.
Considerações sobre segurança
O cmdlet Set-SqlColumnEncryption , usado para configurar a criptografia para colunas de banco de dados, gerencia chaves Always Encrypted e os dados armazenados em colunas de banco de dados. Portanto, é importante que você execute o cmdlet em um computador seguro. Se o seu banco de dados estiver no SQL Server, execute o cmdlet em um computador diferente daquele que hospeda a sua instância do SQL Server. Como o objetivo principal do Always Encrypted é garantir que os dados confidenciais criptografados estejam seguros mesmo se o sistema do banco de dados for comprometido, a execução de um script do PowerShell que processa chaves e/ou dados confidenciais no computador do SQL Server pode reduzir ou anular os benefícios do recurso.
| Tarefa | Artigo | Acessa chaves de texto não criptografado/repositório de chaves | Acessar banco de dados |
|---|---|---|---|
| Etapa 1. Inicie um ambiente do PowerShell e importe o módulo do SqlServer. | Importar o módulo do SqlServer | Não | Não |
| Etapa 2. Conecte-se ao servidor e banco de dados | Conectando-se a um banco de dados | Não | Sim |
| Etapa 3. Autenticar no Azure, se sua chave mestra de coluna (protegendo a chave de criptografia de coluna, a ser rotacionada) estiver armazenada no Azure Key Vault | Connect-AzAccount | Sim | Não |
| Etapa 4. Obtenha um token de acesso para Azure Key Vaults. | Get-AzAccessToken | Não | Não |
| Etapa 5. Construir uma matriz de objetos SqlColumnEncryptionSettings - uma para cada coluna de banco de dados que você deseja criptografar, criptografar novamente ou descriptografar. SqlColumnMasterKeySettings é um objeto que existe na memória (no PowerShell). Especifica o esquema de criptografia de destino para uma coluna. | New-SqlColumnEncryptionSettings | Não | Não |
| Etapa 6. Defina a configuração de criptografia desejada, especificada na matriz de objetos SqlColumnMasterKeySettings que você criou na etapa anterior. Uma coluna é criptografada, criptografada novamente ou descriptografada, dependendo das configurações de destino especificadas e da configuração de criptografia atual da coluna. |
Set-SqlColumnEncryption Nota: Essa etapa pode levar muito tempo. Seus aplicativos não podem acessar as tabelas durante toda a operação ou parte dela, dependendo da abordagem (online ou offline) que você escolher. |
Sim | Sim |
Criptografar colunas usando enclaves VBS
O exemplo abaixo demonstra a definição da configuração da criptografia de destino para duas colunas. Se a coluna ainda não estiver criptografada, ela o será. Se qualquer coluna já estiver criptografada usando uma chave diferente e/ou um tipo de criptografia diferente, ela será descriptografada e criptografada novamente com o tipo da chave de destino especificado. Atualmente, os enclaves VBS não oferecem suporte à atestação. O parâmetro EnclaveAttestationProtocol deve estar definido como None, e o EnclaveAttestationUrl não é necessário.
# Import modules
Import-Module SqlServer
Import-Module Az.Accounts
# Edit these values.
$serverName = '<your-server>.database.windows.net'
$databaseName = 'ContosoHR'
$cekName = 'CEK'
$subscriptionId = '<your-subscription-id>'
# Columns to encrypt with the CEK.
$columnsToEncrypt = @(
'dbo.Employees.SSN',
'dbo.Employees.Salary'
)
# Sign in with Microsoft Entra and select subscription.
Connect-AzAccount
Set-AzContext -SubscriptionId $subscriptionId
# Token needed when CEK uses Azure Key Vault CMK.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl 'https://vault.azure.net').Token
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Build encryption settings for target columns.
$columnEncryptionSettings = @(
$columnsToEncrypt | ForEach-Object {
New-SqlColumnEncryptionSettings -ColumnName $_ -EncryptionType Randomized -EncryptionKey $cekName
}
)
# Encrypt or re-encrypt the columns.
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $columnEncryptionSettings -EnclaveAttestationProtocol None -LogFileDirectory . -KeyVaultAccessToken $keyVaultAccessToken
Write-Host 'Done.'
Descriptografar colunas – Exemplo
O exemplo a seguir mostra como descriptografar todas as colunas que estão criptografadas no momento em um banco de dados.
# Import modules
Import-Module SqlServer -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
#Connect to Azure
Connect-AzAccount
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Find all encrypted columns, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$tables = $database.Tables
for($i=0; $i -lt $tables.Count; $i++){
$columns = $tables[$i].Columns
for($j=0; $j -lt $columns.Count; $j++) {
if($columns[$j].isEncrypted) {
$threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name
$ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType "Plaintext"
}
}
}
# Decrypt all columns.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -LogFileDirectory . -EnclaveAttestationProtocol "None" -KeyVaultAccessToken $keyVaultAccessToken
Criptografar colunas usando enclaves SGX
O exemplo abaixo demonstra a definição da configuração da criptografia de destino para duas colunas. Se a coluna ainda não estiver criptografada, ela o será. Se qualquer coluna já estiver criptografada usando uma chave diferente e/ou um tipo de criptografia diferente, ela será descriptografada e criptografada novamente com o tipo da chave de destino especificado. Para executar operações criptográficas localmente usando um enclave, os parâmetros EnclaveAttestationProtocol e EnclaveAttestationUrl são obrigatórios.
# Import modules
Import-Module SqlServer
Import-Module Az.Accounts
# Edit these values.
$serverName = '<your-server>.database.windows.net'
$databaseName = 'ContosoHR'
$cekName = 'CEK'
$subscriptionId = '<your-subscription-id>'
# Columns to encrypt with the CEK.
$columnsToEncrypt = @(
'dbo.Employees.SSN',
'dbo.Employees.Salary'
)
# Sign in with Microsoft Entra and select subscription.
Connect-AzAccount
Set-AzContext -SubscriptionId $subscriptionId
# Token needed when CEK uses Azure Key Vault CMK.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl 'https://vault.azure.net').Token
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Build encryption settings for target columns.
$columnEncryptionSettings = @(
$columnsToEncrypt | ForEach-Object {
New-SqlColumnEncryptionSettings -ColumnName $_ -EncryptionType Randomized -EncryptionKey $cekName
}
)
# Encrypt or re-encrypt the columns.
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $columnEncryptionSettings -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>" -KeyVaultAccessToken $keyVaultAccessToken -LogFileDirectory .
Write-Host 'Done.'
Descriptografar colunas – Exemplo
O exemplo a seguir mostra como descriptografar todas as colunas que estão criptografadas no momento em um banco de dados.
# Import modules
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
#Connect to Azure
Connect-AzAccount
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Find all encrypted columns, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$tables = $database.Tables
for($i=0; $i -lt $tables.Count; $i++){
$columns = $tables[$i].Columns
for($j=0; $j -lt $columns.Count; $j++) {
if($columns[$j].isEncrypted) {
$threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name
$ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType "Plaintext"
}
}
}
# Decrypt all columns.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -LogFileDirectory . -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>" -KeyVaultAccessToken $keyVaultAccessToken
Próximas etapas
Confira também
- Always Encrypted com enclaves seguros
- Gerenciar chaves para Always Encrypted com enclaves seguros
- Configure a criptografia de colunas localmente com Transact-SQL
- Configurar a criptografia de coluna no local com um pacote DAC
- Configurar a criptografia de colunas localmente usando o assistente Always Encrypted no SSMS