Condividi tramite


Effettuare il provisioning di chiavi Always Encrypted con PowerShell

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

In questo articolo sono descritti i passaggi per effettuare il provisioning delle chiavi per Always Encrypted usando il modulo PowerShell SqlServer. È possibile usare PowerShell per effettuare il provisioning di chiavi Always Encrypted con e senza separazione dei ruolioffrendo il controllo su coloro che hanno accesso alle chiavi di crittografia effettive nell'archivio chiavi e coloro che hanno accesso al database.

Per una panoramica della gestione delle chiavi Always Encrypted, incluse alcune procedure consigliate, vedere Panoramica della gestione delle chiavi per Always Encrypted. Per informazioni su come usare il modulo PowerShell SqlServer per Always Encrypted, vedere Configurare Always Encrypted tramite PowerShell.

Provisioning delle chiavi senza separazione dei ruoli

Il metodo di provisioning delle chiavi descritto in questa sezione non supporta la separazione dei ruoli tra amministratori della sicurezza e amministratori di database. Alcuni dei passaggi descritti in questa sezione combinano operazioni su chiavi fisiche con operazioni sui metadati delle chiavi. Questo metodo di provisioning delle chiavi è quindi consigliato per le organizzazioni che usano il modello DevOps oppure se il database è ospitato nel cloud e l'obiettivo principale consiste nel limitare l'accesso ai dati sensibili agli amministratori del cloud escludendo gli amministratori di database locali. Questo metodo non è consigliato nel caso in cui eventuali concorrenti includano amministratori di database oppure se gli amministratori di database non devono avere accesso ai dati sensibili.

Prima di eseguire tutti i passaggi che comportano l'accesso a chiavi di testo non crittografato o all'archivio chiavi (identificate nella colonna Accesses plaintext keys/key store nella tabella seguente), assicurarsi che l'ambiente PowerShell venga eseguito in un computer sicuro diverso da un computer che ospita il database. Per altre informazioni, vedere Considerazioni sulla sicurezza per la gestione delle chiavi.

Attività Articolo Accede alle chiavi in testo non crittografato o all'archivio delle chiavi Accede al database
Passaggio 1: Creare una chiave principale della colonna in un archivio di chiavi.

Nota: il modulo PowerShell SqlServer non supporta questo passaggio. Per eseguire questa attività da una riga di comando, usare gli strumenti specifici dell'archivio chiavi selezionato.
Creare e archiviare chiavi master di colonna per Always Encrypted NO
Passaggio 2. Avviare un ambiente PowerShell e importare il modulo PowerShell SqlServer. Configurare Always Encrypted tramite PowerShell NO NO
Passaggio 3. Connettersi al server e al database. Connettersi a un database NO
Passaggio 4. Creare un oggetto SqlColumnMasterKeySettings che includa informazioni sul percorso della chiave master della colonna. In PowerShell SqlColumnMasterKeySettings è un oggetto presente in memoria. Utilizzare il cmdlet specifico per il proprio archivio chiavi. Impostazioni della chiave master di colonna del Key Vault di SQL Azure

Nuovo-SqlCertificateStoreColumnMasterKeyImpostazioni

New-SqlCngColumnMasterKeySettings (Imposta nuove configurazioni per la chiave principale della colonna in SQL)

New-SqlCspColumnMasterKeySettings
NO NO
Passaggio 5. Creare i metadati relativi alla chiave master della colonna nel database.

Nota: Non viene verificata la validità delle chiavi o dei certificati usati per generare la chiave master della colonna.
[New-SqlColumnMasterKey](/powershell/sqlserver/sqlserver/vlatest/new-sqlcolumnmasterkey)

Nota: sotto le quinte, il cmdlet rilascia l'istruzione CREATE COLUMN MASTER KEY per creare i metadati della chiave.
NO
Passaggio 6. Autenticati su Azure, se la chiave master della colonna è conservata in Azure Key Vault. Connect-AzAccount NO
Passaggio 7. Ottieni un token di accesso per le Azure Key Vaults, se la chiave master della colonna è archiviata in una Azure Key Vault. Get-AzAccessToken NO NO
Passaggio 8. Generare una nuova chiave di crittografia di colonna, crittografarla con la chiave master della colonna e creare i metadati della chiave di crittografia della colonna nel database. New-SqlColumnEncryptionKey

Nota: usare una variante del cmdlet che genera internamente e crittografa una chiave di crittografia della colonna.

Nota: Dietro le quinte, il cmdlet emette l'istruzione CREATE COLUMN ENCRYPTION KEY per creare i metadati della chiave.

Archivio certificati Windows senza separazione dei ruoli (esempio)

Questo script è un esempio end-to-end di generazione di una chiave master della colonna che è un certificato nell'archivio certificati di Windows, di generazione e crittografia di una chiave di crittografia della colonna e di creazione dei metadati della chiave in un database di 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 senza separazione dei ruoli (esempio)

Questo script è un esempio end-to-end di provisioning e configurazione di un Azure Key Vault, generazione di una column master key nel vault, generazione e crittografia di una column encryption key e creazione dei metadati della chiave in un database SQL di 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 senza separazione dei ruoli (esempio)

Lo script che segue è un esempio end-to-end di generazione di una chiave master della colonna in un archivio chiavi che implementa l'API Cryptography Next Generation (CNG) generando e crittografando una chiave di crittografia della colonna e creando i metadati della chiave in un database di SQL Server.

Nell'esempio viene usato l'archivio chiavi che usa il provider di archiviazione chiavi software Microsoft. È possibile scegliere di modificare l'esempio per usare un altro archivio, ad esempio il modulo di sicurezza hardware. A tale scopo, è necessario assicurarsi che il provider di archiviazione chiavi (KSP) che implementa CNG per il dispositivo sia installato correttamente nel computer. Sostituire quindi Microsoft Software Key Storage Provider con il nome KSP del 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

Gestione delle chiavi con separazione dei ruoli

In questa sezione sono elencati i passaggi per la configurazione della crittografia per i casi in cui gli amministratori della sicurezza non hanno accesso al database e gli amministratori di database non hanno accesso all'archivio chiavi o alle chiavi di testo non crittografato.

Amministratore della sicurezza

Prima di eseguire tutti i passaggi che comportano l'accesso alle chiavi di testo non crittografato o all'archivio chiavi (identificato nella colonna Accesses plaintext keys/key store nella tabella seguente), assicurarsi che:

  • L'ambiente di PowerShell viene eseguito su una macchina protetta diversa da un computer che ospita il database.
  • gli amministratori di database dell'organizzazione non abbiano accesso al computer (cosa che vanificherebbe lo scopo della separazione dei ruoli).

Per altre informazioni, vedere Considerazioni sulla sicurezza per la gestione delle chiavi.

Attività Articolo Accede alle chiavi in testo non crittografato o all'archivio delle chiavi Accede al database
Passaggio 1: Creare una chiave principale della colonna in un archivio di chiavi.

Nota: il modulo SqlServer non supporta questo passaggio. Per eseguire questa attività da una riga di comando, è necessario usare gli strumenti specifici del tipo di archivio chiavi.
Creare e archiviare chiavi master di colonna per Always Encrypted NO
Passaggio 2. Avviare una sessione di PowerShell e importare il modulo SqlServer. Importazione del modulo SqlServer NO NO
Passaggio 3. Creare un oggetto SqlColumnMasterKeySettings che includa informazioni sul percorso della chiave master della colonna. SqlColumnMasterKeySettings è un oggetto presente in memoria (PowerShell). Utilizzare il cmdlet specifico per il proprio archivio chiavi. Impostazioni della chiave master di colonna del Key Vault di SQL Azure

Nuovo-SqlCertificateStoreColumnMasterKeyImpostazioni

New-SqlCngColumnMasterKeySettings (Imposta nuove configurazioni per la chiave principale della colonna in SQL)

New-SqlCspColumnMasterKeySettings
NO NO
Passaggio 4. Autenticati su Azure, se la chiave master della colonna è conservata in Azure Key Vault. Connect-AzAccount NO
Passaggio 5. Ottieni un token di accesso per le Azure Key Vaults, se la chiave master della colonna è archiviata in una Azure Key Vault. Get-AzAccessToken NO NO
Passaggio 6. Generare una chiave di crittografia della colonna, crittografarla con la chiave master della colonna per generare un valore crittografato della chiave di crittografia della colonna. New-SqlColumnEncryptionKeyEncryptedValue NO
Passaggio 7. Fornire il percorso della chiave master della colonna (nome del provider e percorso della chiave master della colonna) e un valore crittografato della chiave di crittografia della colonna all'amministratore di database. Vedere gli esempi alla fine dell'articolo. NO NO

DBA

Gli amministratori di database usano le informazioni ricevute dall'amministratore della sicurezza (passaggio 7 precedente) per creare e gestire i metadati della chiave Always Encrypted nel database.

Attività Articolo Accede alle chiavi di testo non crittografato Accede al database
Passaggio 1: Ottieni il percorso della chiave master della colonna e il valore crittografato della chiave di crittografia della colonna dal tuo amministratore della sicurezza. Vedere gli esempi alla fine dell'articolo. NO NO
Passaggio 2. Avviare un ambiente PowerShell e importare il modulo SqlServer. Configurare Always Encrypted tramite PowerShell NO NO
Passaggio 3. Connettiti al server e a un database. Connettersi a un database NO
Passaggio 4. Creare un oggetto SqlColumnMasterKeySettings che includa informazioni sul percorso della chiave master della colonna. SqlColumnMasterKeySettings è un oggetto presente in memoria. New-SqlColumnMasterKeySettings NO NO
Passaggio 5. Creare i metadati relativi alla chiave master della colonna nel database.

Nota: Non viene verificata la validità delle chiavi o dei certificati usati per generare la chiave master della colonna.
New-SqlColumnMasterKey
Nota: dietro le quinte, il cmdlet genera l'istruzione CREATE COLUMN MASTER KEY (Transact-SQL) per creare i metadati della chiave master della colonna (Column Master Key).
NO
Passaggio 6. Creare i metadati della chiave di crittografia della colonna nel database. New-SqlColumnEncryptionKey
Nota: gli amministratori di database usano una variazione del cmdlet che crea soltanto i metadati della chiave di crittografia della colonna.
Il cmdlet genera l'istruzione CREATE COLUMN ENCRYPTION KEY (Transact-SQL) per creare i metadati della chiave di crittografia della colonna.
NO

Archivio certificati Windows con separazione dei ruoli (esempio)

Amministratore della sicurezza

# 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

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