Partilhar via


Girar chaves sempre criptografadas usando o PowerShell

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

Este artigo fornece as etapas para girar chaves para Always Encrypted usando o módulo SqlServer PowerShell. Para obter informações sobre como começar a usar o módulo SqlServer PowerShell para Always Encrypted, consulte Configure Always Encrypted using PowerShell.

A rotação de chaves sempre encriptadas é o processo de substituição de uma chave existente por uma nova. Talvez seja necessário girar uma chave se ela tiver sido comprometida ou para estar em conformidade com as políticas ou regulamentos de conformidade da sua organização que exigem que as chaves criptográficas sejam alternadas regularmente.

O Always Encrypted usa dois tipos de chaves, portanto, há dois fluxos de trabalho de rotação de chaves de alto nível; rotação de chaves mestras de coluna e rotação de chaves de encriptação de coluna.

  • Rotação da chave de criptografia de coluna - envolve a descriptografia de dados criptografados com a chave atual e a recriptografia dos dados usando a nova chave de criptografia de coluna. Como a rotação de uma chave de criptografia de coluna requer acesso às chaves e ao banco de dados, a rotação da chave de criptografia de coluna só pode ser executada sem separação de funções.
  • Rotação da chave mestra de coluna - envolve a descriptografia de chaves de criptografia de coluna protegidas com a chave mestra de coluna atual, criptografando-as novamente usando a nova chave mestra de coluna e atualizando os metadados para ambos os tipos de chaves. A rotação da chave mestra de coluna pode ser concluída com ou sem separação de funções (ao usar o módulo SqlServer PowerShell).

Rotação da Chave Mestra de Coluna sem Separação de Funções

O método de rotação de uma chave mestra de coluna descrito nesta seção não oferece suporte à separação de funções entre um Administrador de Segurança e um DBA. Algumas das etapas abaixo combinam operações nas chaves físicas com operações em metadados importantes, portanto, esse fluxo de trabalho é recomendado para organizações que usam o modelo DevOps ou quando seu banco de dados está hospedado na nuvem e o objetivo principal é restringir o acesso de administradores de nuvem (mas não DBAs locais) a dados confidenciais. Não é recomendado se os potenciais adversários incluírem DBAs ou se os DBAs não deverem ter acesso a dados confidenciais.

Tarefa Artigo Acede a chaves de texto simples/repositório de chaves Acessos à base de dados
Passo 1. Crie uma nova chave mestra de coluna em um repositório de chaves.

Nota: O módulo SqlServer PowerShell não suporta esta etapa. Para realizar essa tarefa a partir da linha de comando, você precisa usar ferramentas específicas para seu armazenamento de chaves.
Criar e armazenar chaves mestras de coluna para o Always Encrypted Sim Não
Passo 2. Inicie um ambiente do PowerShell e importe o módulo SqlServer Importar o módulo SqlServer Não Não
Passo 3. Conecte-se ao seu servidor e banco de dados. Conectando-se a um banco de dados Não Sim
Passo 4. Crie um objeto SqlColumnMasterKeySettings que contenha informações sobre o local da sua nova chave mestra de coluna. SqlColumnMasterKeySettings é um objeto que existe na memória (no PowerShell). Para criá-lo, você precisa usar o cmdlet específico para seu armazenamento de chaves. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Não Não
Passo 5. Crie os metadados sobre sua nova chave mestra de coluna em seu banco de dados. New-SqlColumnMasterKey

Nota: sob as capas, este cmdlet emite a instrução CREATE COLUMN MASTER KEY (Transact-SQL) para criar metadados de chave.
Não Sim
Passo 6. Autentique-se no Azure, se sua chave mestra de coluna atual ou sua nova chave mestra de coluna estiver armazenada em um cofre de chaves ou em um HSM gerenciado no Cofre de Chaves do Azure Connect-AzAccount Sim Não
Passo 7. Obtenha um token de acesso para os Cofres de Chaves do Azure, se a sua chave mestra de coluna estiver armazenada no Cofre de Chaves do Azure. Get-AzAccessToken Não Não
Passo 8. Inicie a rotação, cifrando cada uma das chaves de encriptação de coluna, que estão atualmente protegidas pela antiga chave mestra de coluna, utilizando a nova chave mestra de coluna. Após essa etapa, cada chave de criptografia de coluna afetada (associada à chave mestra de coluna antiga, sendo girada), é criptografada com a chave mestra de coluna antiga e nova e tem dois valores criptografados nos metadados do banco de dados. Invoke-SqlColumnMasterKeyRotation Sim Sim
Passo 9. Coordene-se com os administradores de todos os aplicativos que consultam colunas criptografadas no banco de dados (e estão protegidos com a antiga chave mestra de coluna), para que eles possam garantir que os aplicativos possam acessar a nova chave mestra de coluna. Criar e armazenar chaves mestras de coluna (sempre criptografadas) Sim Não
Passo 10. Completar a rotação

Nota: antes de executar esta etapa, verifique se todos os aplicativos que consultam colunas criptografadas protegidas com a chave mestra de coluna antiga foram configurados para usar a nova chave mestra de coluna. Se executar este passo prematuramente, algumas dessas aplicações poderão não conseguir desencriptar os dados. Conclua a rotação removendo do banco de dados os valores criptografados que foram criados com a antiga chave mestra de coluna. Isso remove a associação entre a chave mestra de coluna antiga e as chaves de criptografia de coluna que ela protege.
Complete-SqlColumnMasterKeyRotation Não Sim
Passo 10. Remova os metadados da chave mestra da coluna antiga. Remove-SqlColumnMasterKey Não Sim

Observação

É altamente recomendável não eliminar permanentemente a antiga chave-mestre da coluna após a rotação. Em vez disso, você deve manter a chave mestra da coluna antiga em seu armazenamento de chaves atual ou arquivá-la em outro local seguro. Se restaurar o seu banco de dados de um arquivo de backup para um ponto no tempo antes de a nova chave mestra de coluna ter sido configurada, vai precisar da chave antiga para acessar os dados.

Rotação de uma chave mestra de coluna sem divisão de funções (exemplo com certificado Windows)

O script abaixo é um exemplo de ponta a ponta que substitui uma chave mestra de coluna existente (CMK1) por uma nova chave mestra de coluna (CMK2).

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

# Import the SqlServer module
Import-Module "SqlServer"

# 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; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your new column master key. 
$newCmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint

# Create metadata for your new column master key in the database.
$newCmkName = "CMK2"
New-SqlColumnMasterKey -Name $newCmkName -InputObject $database -ColumnMasterKeySettings $newCmkSettings

# Initiate the rotation from the current column master key to the new column master key.
$oldCmkName = "CMK1"
Invoke-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName -TargetColumnMasterKeyName $newCmkName -InputObject $database

# Complete the rotation of the old column master key.
Complete-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName  -InputObject $database

# Remove the old column master key metadata.
Remove-SqlColumnMasterKey -Name $oldCmkName -InputObject $database

Rotação da Chave Mestra de Coluna com Separação de Funções

O fluxo de trabalho de rotação de chave mestra de coluna descrito nesta seção garante a separação entre um administrador de segurança e um DBA.

Importante

Antes de executar qualquer etapa em que o acede a chaves de texto simples/repositório de chaves=Sim na tabela abaixo (etapas que acedem a chaves de texto simples ou ao repositório de chaves), assegure-se de que o ambiente do PowerShell é executado numa máquina segura diferente de um computador que hospeda a sua base de dados. Para obter mais informações, consulte Considerações de segurança para gerenciamento de chaves.

Parte 1: DBA

Um DBA recupera metadados sobre a chave mestra de coluna a ser girada e sobre as chaves de criptografia de coluna afetadas, associadas à chave mestra de coluna atual. O DBA compartilha todas essas informações com um administrador de segurança.

Tarefa Artigo Acesso a chaves de texto simples/armazém de chaves Acessos à base de dados
Passo 1. Inicie um ambiente PowerShell e importe o módulo SqlServer. Importar o módulo SqlServer Não Nenhum
Passo 2. Conecte-se ao seu servidor e a um banco de dados. Conectar-se a um banco de dados Não Sim
Passo 3. Recupere os metadados sobre a chave mestra da coluna antiga. Get-SqlColumnMasterKey Não Sim
Passo 4. Recupere os metadados sobre as chaves de criptografia de coluna protegidas pela antiga chave mestra de coluna, incluindo os valores criptografados dessas chaves. Get-SqlColumnEncryptionKey Não Sim
Passo 5. Compartilhe o local da chave mestra de coluna (o nome do provedor e um caminho de chave da chave mestra de coluna) e os valores criptografados das chaves de criptografia de coluna correspondentes, protegidas com a antiga chave mestra de coluna. Veja os exemplos abaixo. Não Não

Parte 2: Administrador de Segurança

O administrador de segurança gera uma nova chave mestra de coluna, criptografa novamente as chaves de criptografia de coluna afetadas com a nova chave mestra de coluna e compartilha as informações sobre a nova chave mestra de coluna, bem como o conjunto de novos valores criptografados para as chaves de criptografia de coluna afetadas, com o DBA.

Tarefa Artigo Aceder a chaves em texto puro/armazenamento de chaves Acesso à base de dados
Passo 1. Obtenha a localização da chave mestra de coluna antiga e os valores criptografados das chaves de criptografia de coluna correspondentes, protegidas com a chave mestra de coluna antiga, do seu DBA. N/A
Veja os exemplos abaixo.
Não Não
Passo 2. Crie uma nova chave mestra de coluna num repositório de chaves.

Nota: O módulo SqlServer não suporta esta etapa. Para realizar essa tarefa a partir de uma linha de comando, você precisa usar as ferramentas específicas do tipo de armazenamento de chaves.
Criar e armazenar chaves mestras de coluna para Always Encrypted Sim Não
Passo 3. Inicie um ambiente PowerShell e importe o módulo SqlServer. Importar o módulo SqlServer Não Não
Passo 4. Crie um objeto SqlColumnMasterKeySettings que contenha informações sobre o local da sua antiga coluna chave mestra. SqlColumnMasterKeySettings é um objeto que existe na memória (no PowerShell). New-SqlColumnMasterKeySettings Não Não
Passo 5. Crie um objeto SqlColumnMasterKeySettings que contenha informações sobre o local do seu nova chave mestra de coluna. SqlColumnMasterKeySettings é um objeto que existe na memória (no PowerShell). Para criá-lo, você precisa usar o cmdlet específico para seu armazenamento de chaves. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Não Não
Passo 6. Autentique-se no Azure, se sua chave mestra de coluna antiga (atual) ou sua nova chave mestra de coluna estiver armazenada em um cofre de chaves ou em um HSM gerenciado no Cofre de Chaves do Azure. Connect-AzAccount Sim Não
Passo 7. Obtenha um token de acesso para os Cofres de Chaves do Azure, se a sua chave mestra de coluna estiver armazenada no Cofre de Chaves do Azure. Get-AzAccessToken Não Não
Passo 8. Criptografe novamente cada valor da chave de criptografia de coluna, que atualmente está protegida com a antiga chave mestra de coluna, usando a nova chave mestra de coluna. Novo-ValorCifradoDeChaveDeEncriptaçãoDeColunaSql

Nota: Ao chamar esse cmdlet, passe os objetos SqlColumnMasterKeySettings para que a chave mestra de coluna antiga e a nova coluna, juntamente com um valor da chave de criptografia de coluna, sejam criptografadas novamente.
Sim Não
Passo 9. Compartilhe o local da nova chave mestra de coluna (o nome do provedor e um caminho de chave da chave mestra de coluna) e o conjunto de novos valores criptografados das chaves de criptografia de coluna com seu DBA. Veja os exemplos abaixo. Não Não

Observação

É altamente recomendável que não elimine permanentemente a antiga chave mestra de coluna após a rotação. Em vez disso, você deve manter a chave mestra da coluna antiga em seu armazenamento de chaves atual ou arquivá-la em outro local seguro. Se você restaurar seu banco de dados de um arquivo de backup para um ponto no tempo antes de a nova chave mestra de coluna foi configurada, você precisará da chave antiga para acessar os dados.

Parte 3: DBA

O DBA cria metadados para a nova chave mestra de coluna e atualiza os metadados das chaves de criptografia de coluna afetadas, para adicionar o novo conjunto de valores criptografados. Nesta etapa, o DBA também se coordena com os administradores dos aplicativos que consultam colunas de criptografia, que garantem que o aplicativo possa acessar a nova chave mestra de coluna. Depois que todos os aplicativos estiverem configurados para usar a nova chave mestra de coluna, o DBA removerá o conjunto antigo de valores criptografados e os metadados da chave mestra de coluna antiga.

Tarefa Artigo Aceder a chaves de texto simples/keystore Acessa base de dados
Passo 1. Obtenha a localização da nova chave mestra de coluna e o novo conjunto de valores encriptados das chaves de encriptação de coluna correspondentes, protegidas com a chave mestra de coluna antiga, junto do seu Administrador de Segurança. Veja os exemplos abaixo. Não Não
Passo 2. Inicie um ambiente PowerShell e importe o módulo SqlServer. Importar o módulo SqlServer Não Não
Passo 3. Conecte-se ao seu servidor e a um banco de dados. Conectando-se a um banco de dados Não Sim
Passo 4. Crie um objeto SqlColumnMasterKeySettings que contenha informações sobre o local da sua nova chave mestra de coluna. SqlColumnMasterKeySettings é um objeto que existe na memória (no PowerShell). New-SqlColumnMasterKeySettings Não Não
Passo 5. Crie os metadados sobre sua nova chave mestra de coluna em seu banco de dados. New-SqlColumnMasterKey

Observação: Nos bastidores, este cmdlet executa a instrução CREATE COLUMN MASTER KEY (Transact-SQL) para criar metadados de chave.
Não Sim
Passo 6. Recupere os metadados sobre chaves de encriptação de colunas, protegidas pela antiga chave mestra da coluna. Get-SqlColumnEncryptionKey Não Sim
Passo 7. Adicione um novo valor criptografado (produzido usando a nova chave mestra de coluna) aos metadados de cada chave de criptografia de coluna afetada. Add-SqlColumnEncryptionKeyValue Não Sim
Passo 8. Coordene-se com os administradores de todos os aplicativos que consultam colunas criptografadas no banco de dados (e estão protegidos com a antiga chave mestra de coluna), para que eles possam garantir que os aplicativos possam acessar a nova chave mestra de coluna. Criando e armazenando chaves mestras de coluna (sempre criptografadas) Não Não
Passo 9. Conclua a rotação removendo do banco de dados os valores criptografados associados à chave mestra da coluna antiga.

Nota: Antes de executar esta etapa, verifique se todos os aplicativos que consultam colunas criptografadas protegidas com a antiga chave mestra de coluna foram configurados para usar a nova chave mestra de coluna. Se executar este passo prematuramente, algumas dessas aplicações poderão não conseguir desencriptar os dados.

Esta etapa remove uma associação entre a chave mestra de coluna antiga e as chaves de criptografia de coluna que ela protege.
Complete-SqlColumnMasterKeyRotation

Como alternativa, você pode usar Remove-SqlColumnEncryptionKeyValue
Não Sim
Passo 10. Remova os metadados da chave mestra da coluna antiga do banco de dados Remove-SqlColumnMasterKey Não Sim

Girando uma chave mestra de coluna com separação de funções (exemplo de certificado do Windows)

O script abaixo é um exemplo de ponta a ponta para gerar uma nova chave mestra de coluna que está certificada no Repositório de Certificados do Windows, alternando uma chave mestra de coluna existente (atual) para substituí-la pela nova. O script assume que o banco de dados de destino contém a chave mestra da coluna, chamada CMK1 (a ser girada), que criptografa algumas chaves de criptografia de coluna.

Parte 1: DBA

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

# 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; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Retrieve the data about the old column master key, which needs to be rotated.
$oldCmkName = "CMK1"
$oldCmk = Get-SqlColumnMasterKey -Name $oldCmkName -InputObject $database


# Share the location of the old column master key with a Security Administrator, via a CSV file on a share drive.
$oldCmkDataFile = "Z:\oldcmkdata.txt"
"KeyStoreProviderName, KeyPath" > $oldCmkDataFile
$oldCmk.KeyStoreProviderName +", " + $oldCmk.KeyPath >> $oldCmkDataFile


# Find column encryption keys associated with the old column master key and provide the encrypted values of column encryption keys to the Security Administrator, via a CSV file on a share drive.
$ceks = Get-SqlColumnEncryptionKey -InputObject $database
$oldCekValuesFile = "Z:\oldcekvalues.txt"
"CEKName, CEKEncryptedValue" > $oldCekValuesFile 
for($i=0; $i -lt $ceks.Length; $i++){
    if($ceks[$i].ColumnEncryptionKeyValues.Length -eq 2) {
        # This column encryption has 2 encrypted values - let's check, if it is associated with the old column master key.
        if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName -or $ceks[$i].ColumnEncryptionKeyValues[1].ColumnMasterKeyName -eq $oldCmkName) {
            Write-Host $ceks[$i].Name "already has 2 encrypted values and therefore" $oldCmkName + "cannot be rotated"
            exit 1
        }
    }
    if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName) {# This column encryption key has 1 encrypted value that was produced using the old column master key
        # Save the name and the encrypted value of the column encryption key in the file.
        $encryptedValue =  "0x" + -join ($ceks[$i].ColumnEncryptionKeyValues[0].EncryptedValue |  foreach {$_.ToString("X2") } )
        $ceks[$i].Name + "," + $encryptedValue >> $oldCekValuesFile
    }
} 

Parte 2: Administrador de Segurança

# Obtain the location of the old column master key and the encrypted values of the corresponding column encryption keys, from your DBA, via a CSV file on a share drive.
$oldCmkDataFile = "Z:\oldcmkdata.txt"
$oldCmkData = Import-Csv $oldCmkDataFile
$oldCekValuesFile = "Z:\oldcekvalues.txt"
$oldCekValues = @(Import-Csv $oldCekValuesFile)

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

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

# Create a SqlColumnMasterKeySettings object for your old column master key. 
$oldCmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $oldCmkData.KeyStoreProviderName -KeyPath $oldCmkData.KeyPath

# Create a SqlColumnMasterKeySettings object for your new column master key. 
$newCmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation $storeLocation -Thumbprint $cert.Thumbprint


# Prepare a CSV file, you will use to share the encrypted values of column encryption keys, produced using the new column master key.
$newCekValuesFile = "Z:\newcekvalues.txt"
"CEKName, CEKEncryptedValue" > $newCekValuesFile

# Re-encrypt each value with the new column master key and save the new encrypted value in the file.
for($i=0; $i -lt $oldCekValues.Count; $i++){
    # Re-encrypt each value with the new CMK
    $newValue = New-SqlColumnEncryptionKeyEncryptedValue -TargetColumnMasterKeySettings $newCmkSettings -ColumnMasterKeySettings $oldCmkSettings -EncryptedValue $oldCekValues[$i].CEKEncryptedValue
    $oldCekValues[$i].CEKName + ", " + $newValue >> $newCekValuesFile
}

# Share the new column master key data with your DBA, via a CSV file.
$newCmkDataFile = $home + "\newcmkdata.txt"
"KeyStoreProviderName, KeyPath" > $newCmkDataFile
$newCmkSettings.KeyStoreProviderName +", " + $newCmkSettings.KeyPath >> $newCmkDataFile

Parte 3: DBA

# Obtain the location of the new column master key and the new encrypted values of the corresponding column encryption keys, from your Security Administrator, via a CSV file on a share drive.
$newCmkDataFile = "Z:\newcmkdata.txt"
$newCmkData = Import-Csv $newCmkDataFile
$newCekValuesFile = "Z:\newcekvalues.txt"
$newCekValues = @(Import-Csv $newCekValuesFile)

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

# 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; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your new column master key. 
$newCmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $newCmkData.KeyStoreProviderName -KeyPath $newCmkData.KeyPath
# Create metadata for the new column master key in the database.
$newCmkName = "CMK2"
New-SqlColumnMasterKey -Name $newCmkName -InputObject $database -ColumnMasterKeySettings $newCmkSettings


# Get all CEK objects
$oldCmkName = "CMK1"
$ceks = Get-SqlColumnEncryptionKey -InputObject $database
for($i=0; $i -lt $ceks.Length; $i++){
    if($ceks[$i].ColumnEncryptionKeyValues.Length -eq 2) {# This column encryption key has 2 encrypted values. Let's check, if it is associated with the old CMK.
        if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName -or $ceks[$i].ColumnEncryptionKeyValues[1].ColumnMasterKeyName -eq $oldCmkName) {
            Write-Host $ceks[$i].Name "already has 2 encrypted values and therefore" $oldCmkName + "cannot be rotated"
            exit 1
        }
    }
    if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName) {
        # Find the corresponding new encrypted value, received from the Security Administrator.
        $newValueRow = ($newCekValues| Where-Object {$_.CEKName -eq $ceks[$i].Name }[0])
        # Update the column encryption key metadata object by adding the new encrypted value
        Add-SqlColumnEncryptionKeyValue -ColumnMasterKeyName $newCmkName -Name $ceks[$i].Name -EncryptedValue $newValueRow.CEKEncryptedValue -InputObject $database 
    }
}

# Complete the rotation of the current column master key.
Complete-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName  -InputObject $database

# Remove the old column master key.
Remove-SqlColumnMasterKey -Name $oldCmkName -InputObject $database

Girando uma chave de criptografia de coluna

Girar uma chave de criptografia de coluna envolve descriptografar os dados em todas as colunas, criptografados com a chave a ser girada e criptografar novamente os dados usando a nova chave de criptografia de coluna. Esse fluxo de trabalho de rotação requer acesso às chaves e ao banco de dados e, portanto, não pode ser executado com separação de funções. Rotacionar uma chave de criptografia de coluna pode levar muito tempo se as tabelas que contêm colunas criptografadas com essa chave, que está a ser rotacionada, forem grandes. Portanto, sua organização precisa planejar cuidadosamente uma rotação de chave de criptografia de coluna.

Você pode girar uma chave de criptografia de coluna usando uma abordagem offline ou online. É provável que o método anterior seja mais rápido, mas seus aplicativos não podem gravar nas tabelas afetadas. A última abordagem provavelmente levará mais tempo, mas você pode limitar o intervalo de tempo, durante o qual as tabelas afetadas não estão disponíveis para aplicativos. Para obter mais informações, consulte Configurar a criptografia de coluna usando Always Encrypted com PowerShell e Set-SqlColumnEncryption.

Tarefa Artigo Acede a chaves de texto simples/keystore Acessos à 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 a um banco de dados. Conectando-se a um banco de dados Não Sim
Passo 3. Autentique-se no Azure, se a sua chave mestra de coluna (protegendo a chave de criptografia de coluna, a ser rotacionada) estiver armazenada num cofre de chaves ou num HSM gerido no Azure Key Vault. Connect-AzAccount Sim Não
Passo 4. Obtenha um token de acesso para os Cofres de Chaves do Azure, se a sua chave mestra de coluna estiver armazenada no Cofre de Chaves do Azure. Get-AzAccessToken Não Não
Passo 5. Gere uma nova chave de criptografia de coluna, criptografe-a com a chave mestra de coluna e crie metadados de chave de criptografia de coluna no banco de dados. New-SqlColumnEncryptionKey

Nota: Use uma variação do cmdlet que gera e criptografa internamente uma chave de criptografia de coluna.
Nos bastidores, este cmdlet emite a instrução CREATE COLUMN ENCRYPTION KEY (Transact-SQL) para criar os metadados da chave.
Sim Sim
Passo 6. Encontre todas as colunas criptografadas com a chave de criptografia de coluna antiga. Guia de programação do SQL Server Management Objects (SMO) Não Sim
Passo 7. Crie um objeto SqlColumnEncryptionSettings para cada coluna afetada. SqlColumnEncryptionSettings é um objeto que existe na memória (no PowerShell). Ele especifica o esquema de criptografia de destino para uma coluna. Nesse caso, o objeto deve especificar que a coluna afetada deve ser criptografada usando a nova chave de criptografia de coluna. New-SqlColumnEncryptionSettings Não Não
Passo 8. Criptografe novamente as colunas, identificadas na etapa 5, usando a nova chave de criptografia de coluna. Set-SqlColumnEncryption

Nota: Este passo pode demorar muito tempo. Seus aplicativos não poderão acessar as tabelas durante toda a operação ou parte dela, dependendo da abordagem (online versus offline) selecionada.
Sim Sim
Passo 9. Remova os metadados da chave de criptografia de coluna antiga. Remove-SqlColumnEncryptionKey Não Sim

Exemplo - Rotação de uma chave de encriptação de coluna

O script abaixo demonstra a rotação de uma chave de criptografia de coluna. O script pressupõe que o banco de dados de destino contém algumas colunas criptografadas com uma chave de criptografia de coluna, chamada CEK1 (a ser girada), que é protegida usando uma chave mestra de coluna, chamada CMK1 (a chave mestra de coluna não é armazenada no Cofre de Chaves do Azure).

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

# 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; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr

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


# Find all columns encrypted with the old column encryption key, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$oldCekName = "CEK1"
$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 -and $columns[$j].ColumnEncryptionKeyName -eq $oldCekName) {
            $threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name 
            $ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType $columns[$j].EncryptionType -EncryptionKey $newCekName
        }
     }
}

# Re-encrypt all columns, currently encrypted with the old column encryption key, using the new column encryption key.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -UseOnlineApproach -MaxDowntimeInSeconds 120 -LogFileDirectory .

# Remove the old column encryption key metadata.
Remove-SqlColumnEncryptionKey -Name $oldCekName -InputObject $database

Próximos passos

Ver também