Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instâ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:
- O ambiente do PowerShell é executado em uma máquina segura que é diferente de um computador que hospeda seu banco de dados.
- 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
- Configurar a criptografia de coluna usando Always Encrypted com PowerShell
- Girar chaves sempre criptografadas usando o PowerShell
- Desenvolver aplicações utilizando Always Encrypted
Ver também
- Sempre criptografado
- Visão geral da gestão de chaves para Always Encrypted
- Criar e armazenar chaves mestras de coluna para o Always Encrypted
- Configurar o Always Encrypted usando o PowerShell
- provisionar chaves sempre criptografadas usando o SQL Server Management Studio
- CRIAR CHAVE MESTRA DE COLUNA (Transact-SQL)
- REMOVER COLUNA DE CHAVE MESTRA (Transact-SQL)
- CRIAR CHAVE DE CRIPTOGRAFIA DE COLUNA (Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY (Transact-SQL)
- RETIRAR CHAVE DE ENCRIPTAÇÃO DE COLUNA (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sys.column_encryption_keys (Transact-SQL)