Partilhar via


Provisionar 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 provisionar chaves para Always Encrypted usando o módulo SqlServer PowerShell. Você pode usar o PowerShell para provisionar chaves Always Encrypted com e sem separação de funções, fornecendo controle sobre quem tem acesso às chaves de criptografia reais no armazenamento de chaves e quem tem acesso ao banco de dados.

Para obter uma visão geral do gerenciamento de chaves Always Encrypted, incluindo algumas recomendações de práticas recomendadas de alto nível, consulte Overview of key management for Always Encrypted. Para obter informações sobre como começar a usar o módulo SqlServer PowerShell para Always Encrypted, consulte Configure Always Encrypted using PowerShell.

Provisionamento de chaves sem separação de funções

O método de provisionamento de chaves descrito nesta seção não oferece suporte à separação de funções entre administradores de segurança e DBAs. Algumas das etapas abaixo combinam operações em chaves físicas com operações em metadados de chave. Portanto, esse método de provisionamento das chaves é recomendado para organizações que usam o modelo DevOps ou se o banco de dados estiver hospedado na nuvem e o objetivo principal for 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.

Antes de executar qualquer etapa que envolva o acesso a chaves de texto sem formatação ou ao armazenamento de chaves (identificado na coluna Accesses plaintext keys/key store na tabela abaixo), verifique se o ambiente do PowerShell é executado em uma máquina segura diferente de um computador que hospeda seu banco de dados. Para obter mais informações, consulte Considerações de segurança para gerenciamento de chaves.

Tarefa Artigo Acessa chaves em texto claro/armazenamento de chaves Acessos à base de dados
Passo 1. Crie uma chave mestra de coluna num armazenamento de chaves.

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

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

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

Nota: sob as capas, o 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 a sua chave mestra de coluna estiver armazenada 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. 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.

Nota: Sob as capas, o cmdlet emite a instrução CREATE COLUMN ENCRYPTION KEY (Transact-SQL) para criar metadados de chave.
Sim Sim

Repositório de certificados do Windows sem separação de funções (exemplo)

Esse script é um exemplo de ponta a ponta para gerar uma chave mestra de coluna que é um certificado no Repositório de Certificados do Windows, gerar e criptografar uma chave de criptografia de coluna e criar metadados de chave em um banco de dados do SQL Server.

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

# 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 column master key. 
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings


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

Azure Key Vault sem separação de funções (exemplo)

Esse script é um exemplo de ponta a ponta para provisionar e configurar um cofre de chaves no Cofre de Chaves do Azure, gerando uma chave mestra de coluna no cofre, gerando e criptografando uma chave de criptografia de coluna e criando metadados de chave em um banco de dados SQL do Azure.

# Create a column master key in Azure Key Vault.
Import-Module Az
Connect-AzAccount
$SubscriptionId = "<Azure SubscriptionId>"
$resourceGroup = "<resource group name>"
$azureLocation = "<datacenter location>"
$akvName = "<key vault name>"
$akvKeyName = "<key name>"
$azureCtx = Set-AzConteXt -SubscriptionId $SubscriptionId # Sets the context for the below cmdlets to the specified subscription.
New-AzResourceGroup -Name $resourceGroup -Location $azureLocation # Creates a new resource group - skip, if your desired group already exists.
New-AzKeyVault -VaultName $akvName -ResourceGroupName $resourceGroup -Location $azureLocation # Creates a new key vault - skip if your vault already exists.
Set-AzKeyVaultAccessPolicy -VaultName $akvName -ResourceGroupName $resourceGroup -PermissionsToKeys get, create, delete, list, wrapKey,unwrapKey, sign, verify -UserPrincipalName $azureCtx.Account
$akvKey = Add-AzKeyVaultKey -VaultName $akvName -Name $akvKeyName -Destination "Software"

# Connect to your database (Azure SQL database).
Import-Module "SqlServer"

$serverName = "<Azure SQL server name>.database.windows.net"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Authentication = Active Directory Integrated; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your column master key. 
$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyURL $akvKey.Key.Kid

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings -KeyVaultAccessToken $keyVaultAccessToken

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

# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database. 
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName -KeyVaultAccessToken $keyVaultAccessToken

CNG/KSP sem separação de funções (exemplo)

O script abaixo é um exemplo de ponta a ponta para gerar uma chave mestra de coluna em um armazenamento de chaves que implementa CNG (Cryptography Next Generation API), gerar e criptografar uma chave de criptografia de coluna e criar metadados de chave em um banco de dados do SQL Server.

O exemplo aproveita o armazenamento de chaves que usa o Microsoft Software Key Storage Provider. Você pode optar por modificar o exemplo para usar outro armazenamento, como o módulo de segurança de hardware. Para isso, você precisará certificar-se de que o provedor de armazenamento de chaves (KSP) que implementa o CNG para seu dispositivo está instalado e corretamente em sua máquina. Você precisará substituir Microsoft Software Key Storage Provider pelo nome KSP do seu dispositivo.

# Create a column master key in a key store that has a CNG provider, a.k.a key store provider (KSP).
$cngProviderName = "Microsoft Software Key Storage Provider" # If you have an HSM, you can use a KSP for your HSM instead of a Microsoft KSP
$cngAlgorithmName = "RSA"
$cngKeySize = 2048 # Recommended key size for Always Encrypted column master keys
$cngKeyName = "AlwaysEncryptedKey" # Name identifying your new key in the KSP
$cngProvider = New-Object System.Security.Cryptography.CngProvider($cngProviderName)
$cngKeyParams = New-Object System.Security.Cryptography.CngKeyCreationParameters
$cngKeyParams.provider = $cngProvider
$cngKeyParams.KeyCreationOptions = [System.Security.Cryptography.CngKeyCreationOptions]::OverwriteExistingKey
$keySizeProperty = New-Object System.Security.Cryptography.CngProperty("Length", [System.BitConverter]::GetBytes($cngKeySize), [System.Security.Cryptography.CngPropertyOptions]::None);
$cngKeyParams.Parameters.Add($keySizeProperty)
$cngAlgorithm = New-Object System.Security.Cryptography.CngAlgorithm($cngAlgorithmName)
$cngKey = [System.Security.Cryptography.CngKey]::Create($cngAlgorithm, $cngKeyName, $cngKeyParams)

# 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 column master key. 
$cmkSettings = New-SqlCngColumnMasterKeySettings -CngProviderName $cngProviderName -KeyName $cngKeyName

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings

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

Provisionamento de chaves com separação de funções

Esta seção fornece as etapas para configurar a criptografia em que os administradores de segurança não têm acesso ao banco de dados e os administradores de banco de dados não têm acesso ao armazenamento de chaves ou às chaves de texto sem formatação.

Administrador de Segurança

Antes de executar qualquer etapa que envolva o acesso a chaves de texto sem formatação ou ao armazenamento de chaves (identificado na coluna Acessos a chaves de texto sem formatação na tabela abaixo), certifique-se de que:

  1. O ambiente do PowerShell é executado em uma máquina segura que é diferente de um computador que hospeda seu banco de dados.
  2. Os DBAs em sua organização não têm acesso à máquina (o que derrotaria o propósito da separação de funções).

Para obter mais informações, consulte Considerações de segurança para gerenciamento de chaves.

Tarefa Artigo Acede a chaves de texto simples/ao armazenamento de chaves Acessos à base de dados
Passo 1. Crie uma chave mestra de coluna num armazenamento 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 2. Inicie uma sessão do PowerShell e importe o módulo SqlServer. Importar o módulo SqlServer Não Não
Passo 3. Crie um objeto SqlColumnMasterKeySettings que contenha informações sobre o local da sua chave mestra de coluna. SqlColumnMasterKeySettings é um objeto que existe na memória (no PowerShell). Use o cmdlet específico para o seu armazenamento de chaves. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Não Não
Passo 4. Autentique-se no Azure, se a sua chave mestra de coluna estiver armazenada no Cofre de Chaves do Azure. Connect-AzAccount Sim Não
Passo 5. 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 6. Gere uma chave de criptografia de coluna, criptografe-a com a chave mestra de coluna para produzir um valor criptografado da chave de criptografia de coluna. New-SqlColumnEncryptionKeyEncryptedValue Sim Não
Passo 7. Forneça o local da chave mestra de coluna (o nome do provedor e o caminho da chave mestra de coluna) e o valor criptografado da chave de encriptação de coluna para o DBA. Veja os exemplos abaixo. Não Não

Administrador de Bases de Dados (DBA)

Os DBAs usam as informações que recebem do administrador de segurança (etapa 7 acima) para criar e gerenciar os metadados de chave Always Encrypted no banco de dados.

Tarefa Artigo Acede a teclas de texto simples Acessos à base de dados
Passo 1. Obtenha a localização da chave-mestra da coluna e o valor encriptado da chave de encriptação da coluna 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. Configurar o Always Encrypted usando o PowerShell Não Não
Passo 3. Conecte-se ao seu servidor e a um banco de dados. Conectar-se a um banco de dados Não Sim
Passo 4. Crie um objeto SqlColumnMasterKeySettings que contenha informações sobre o local da sua chave mestra de coluna. SqlColumnMasterKeySettings é um objeto que existe na memória. New-SqlColumnMasterKeySettings Não Não
Passo 5. Criar os metadados sobre a chave mestra da coluna em seu banco de dados New-SqlColumnMasterKey
Nota: sob as capas, o cmdlet emite a instrução CREATE COLUMN MASTER KEY (Transact-SQL) para criar metadados de chave mestra de coluna.
Não Sim
Passo 6. Crie os metadados da chave de criptografia de coluna no banco de dados. New-SqlColumnEncryptionKey
Nota: Os DBAs usam uma variação do cmdlet que cria apenas metadados para a chave de encriptação da coluna.
Por trás dos bastidores, o cmdlet emite a instrução CREATE COLUMN ENCRYPTION KEY (Transact-SQL) para criar os metadados da chave de encriptação de coluna.
Não Sim

Repositório de certificados do Windows com separação de funções (exemplo)

Administrador de Segurança

# Create a 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 column master key. 
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint

# Generate a column encryption key, encrypt it with the column master key to produce an encrypted value of the column encryption key.
$encryptedValue = New-SqlColumnEncryptionKeyEncryptedValue -TargetColumnMasterKeySettings $cmkSettings

# Share the location of the column master key and an encrypted value of the column encryption key with a DBA, via a CSV file on a share drive
$keyDataFile = "Z:\keydata.txt"
"KeyStoreProviderName, KeyPath, EncryptedValue" > $keyDataFile
$cmkSettings.KeyStoreProviderName + ", " + $cmkSettings.KeyPath + ", " + $encryptedValue >> $keyDataFile

# Read the key data back to verify
$keyData = Import-Csv $keyDataFile
$keyData.KeyStoreProviderName
$keyData.KeyPath
$keyData.EncryptedValue 

Administrador de Bases de Dados (DBA)

# Obtain the location of the column master key and the encrypted value of the column encryption key from your Security Administrator, via a CSV file on a share drive.
$keyDataFile = "Z:\keydata.txt"
$keyData = Import-Csv $keyDataFile

# Import the SqlServer module
Import-Module "SqlServer"

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your column master key. 
$cmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $keyData.KeyStoreProviderName -KeyPath $keyData.KeyPath

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings

# Generate a  column encryption key, encrypt it with the column master key and create column encryption key metadata in the database. 
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName -EncryptedValue $keyData.EncryptedValue

Próximos passos

Ver também