Configurar a criptografia de coluna no local com o PowerShell

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

Este artigo fornece as etapas para definir a configuração Always Encrypted de destino para colunas de banco de dados usando o cmdlet Set-SqlColumnEncryption (no módulo SqlServer PowerShell). O cmdlet Set-SqlColumnEncryption modifica o esquema do banco de dados de destino e os dados armazenados nas colunas selecionadas. Os dados armazenados em uma coluna podem ser criptografados, recriptografados ou descriptografados, dependendo das configurações de criptografia de destino especificadas para as colunas e da configuração de criptografia atual. Para ativar operações criptográficas no local usando um enclave, Set-SqlColumnEncryption deve usar uma conexão de base de dados criada com uma string de conexão que inclua o Attestation Protocol e, opcionalmente, as palavras-chave Attestation URL.

Pré-requisitos

Para definir a configuração de criptografia de destino, você precisa ter certeza:

  • Uma chave de criptografia de coluna habilitada para enclave é configurada no banco de dados (se você estiver criptografando ou criptografando novamente uma coluna). Para obter detalhes, consulte Gerenciar chaves para Always Encrypted com enclaves seguros.
  • você está conectado ao banco de dados com Always Encrypted habilitado e as propriedades de validação especificadas na string de conexão.
  • você pode acessar a chave mestra de coluna para cada coluna que deseja criptografar, criptografar novamente ou descriptografar a partir do computador que executa os cmdlets do PowerShell.
  • você usa o módulo SqlServer PowerShell versão 22.0.50 ou posterior. Para criptografia online no local, use o módulo SqlServer PowerShell versão 22.3.0 ou posterior.

Note

A Microsoft recomenda usar o PowerShell 7 ou versões posteriores ao executar scripts Always Encrypted PowerShell. O PowerShell 7 oferece suporte melhorado multiplataforma, melhor desempenho e a mais recente compatibilidade com o módulo SqlServer (v22+), que é necessário para muitos cenários Always Crypted.

Considerações de segurança

O cmdlet Set-SqlColumnEncryption, usado para configurar a criptografia para colunas de banco de dados, lida com chaves Always Encrypted e os dados armazenados em colunas de banco de dados. Portanto, é importante executar o cmdlet em um computador seguro. Se o banco de dados estiver no SQL Server, execute o cmdlet de um computador diferente do computador que hospeda a instância do SQL Server. Como o objetivo principal do Always Encrypted é garantir que os dados confidenciais criptografados estejam seguros mesmo se o sistema de 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 Acesso a chaves de texto simples/armazenamento de chaves Acessa a base de dados
Passo 1. Inicie um ambiente PowerShell e importe o módulo SqlServer. Importar o módulo SqlServer Não Não
Passo 2. Conecte-se ao seu servidor e banco de dados Conectando-se a um banco de dados Não Sim
Passo 3. Autentique-se no Azure, se sua chave mestra de coluna (protegendo a chave de criptografia de coluna, a ser girada) estiver armazenada no Cofre de Chaves do Azure Connect-AzAccount Sim Não
Passo 4. Obtenha um token de acesso para os Cofres de Chaves do Azure. Get-AzAccessToken Não Não
Passo 5. Construa uma matriz de objetos SqlColumnEncryptionSettings - um para cada coluna de banco de dados, você deseja criptografar, criptografar novamente ou descriptografar. SqlColumnMasterKeySettings é um objeto que existe na memória (no PowerShell). Ele especifica o esquema de criptografia de destino para uma coluna. New-SqlColumnEncryptionSettings Não Não
Passo 6. Defina a configuração de criptografia desejada, especificada na matriz de objetos SqlColumnMasterKeySettings, criada na etapa anterior. Uma coluna é encriptada, reencriptada ou desencriptada, dependendo das definições de alvo especificadas e da configuração atual de encriptação da coluna. Set-SqlColumnEncryption

Nota: Este passo pode demorar bastante tempo. As suas aplicações não conseguem aceder às tabelas durante toda a operação ou parte dela, dependendo da abordagem (online vs. offline), que selecionar.
Sim Sim

Encriptar colunas usando enclaves VBS

O exemplo abaixo demonstra a configuração da criptografia de destino para algumas colunas. Se uma das colunas ainda não estiver encriptada, será encriptada. Se alguma coluna já estiver encriptada usando uma chave diferente e/ou um tipo de encriptação diferente, será desencriptada e, em seguida, encriptada novamente com a chave/tipo de destino especificado. Os enclaves VBS atualmente não suportam atestações. O parâmetro EnclaveAttestationProtocol deve ser 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.'

Desencriptar colunas - Exemplo

O exemplo a seguir mostra como descriptografar todas as colunas que estão atualmente criptografadas 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

Encriptar colunas usando enclaves SGX

O exemplo abaixo demonstra a configuração da criptografia de destino para algumas colunas. Se uma das colunas ainda não estiver encriptada, será encriptada. Se alguma coluna já estiver encriptada usando uma chave diferente e/ou um tipo de encriptação diferente, será desencriptada e, em seguida, encriptada novamente com a chave/tipo de destino especificado. Para ativar operações criptográficas no local utilizando um enclave, são necessários os parâmetros EnclaveAttestationProtocol e EnclaveAttestationUrl.

# 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.' 

Desencriptar colunas - Exemplo

O exemplo a seguir mostra como descriptografar todas as colunas que estão atualmente criptografadas 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óximos passos

Ver também