Delen via


Always Encrypted-sleutels inrichten met Behulp van PowerShell

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Dit artikel bevat de stappen voor het inrichten van sleutels voor Always Encrypted met behulp van de SqlServer PowerShell-module. U kunt PowerShell gebruiken om Always Encrypted-sleutels in te richten met zowel met als zonder rolscheiding, waarmee u bepaalt wie toegang heeft tot de werkelijke versleutelingssleutels in het sleutelarchief en wie toegang heeft tot de database.

Zie Overzicht van sleutelbeheer voor Always Encrypted-voor een overzicht van Always Encrypted-sleutelbeheer, waaronder enkele aanbevelingen op hoog niveau. Zie Always Encrypted configureren met behulp van PowerShellvoor meer informatie over het gebruik van de SqlServer PowerShell PowerShell-module voor Always Encrypted.

Sleutelinrichting zonder rolscheiding

De belangrijkste inrichtingsmethode die in deze sectie wordt beschreven, biedt geen ondersteuning voor rolscheiding tussen beveiligingsbeheerders en DBA's. Sommige van de onderstaande stappen combineren bewerkingen op fysieke sleutels met bewerkingen op sleutelmetagegevens. Daarom wordt deze methode voor het inrichten van de sleutels aanbevolen voor organisaties die het DevOps-model gebruiken, of als de database wordt gehost in de cloud en het primaire doel is om cloudbeheerders (maar niet on-premises DBA's) toegang te geven tot gevoelige gegevens. Het wordt niet aanbevolen als potentiële aanvallers DBA's bevatten of als DBA's geen toegang moeten hebben tot gevoelige gegevens.

Voordat u eventuele stappen uitvoert waarbij toegang wordt verkregen tot tekst zonder opmaak of het sleutelarchief (geïdentificeerd in de Accesses plaintext keys/key store kolom in de onderstaande tabel), moet u ervoor zorgen dat de PowerShell-omgeving wordt uitgevoerd op een beveiligde computer die verschilt van een computer die als host fungeert voor uw database. Zie Beveiligingsoverwegingen voor sleutelbeheervoor meer informatie.

Taak Artikel Toegang tot platte-tekst sleutels/sleutelopslag Toegang tot database
Stap 1. Maak een kolomhoofdsleutel in een sleutelarchief.

Opmerking: de SqlServer PowerShell-module biedt geen ondersteuning voor deze stap. Als u deze taak vanaf een opdrachtregel wilt uitvoeren, gebruikt u de hulpprogramma's die specifiek zijn voor het geselecteerde sleutelarchief.
kolomhoofdsleutels maken en opslaan voor Always Encrypted- Ja Nee
Stap 2. Start een PowerShell-omgeving en importeer de SqlServer PowerShell-module. Always Encrypted configureren met behulp van PowerShell Nee Nee
Stap 3. Maak verbinding met uw server en database. Verbinding maken met een database Nee Ja
Stap 4. Maak een SqlColumnMasterKeySettings-object met informatie over de locatie van de hoofdsleutel van de kolom. SqlColumnMasterKeySettings is een object dat zich in het geheugen bevindt (in PowerShell). Gebruik de cmdlet die specifiek is voor uw sleutelarchief. New-SqlAzureKeyVaultColumnMasterKeySettings

Nieuwe-SQLCertificaatOpslagKolomHoofdsleutelInstellingen

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Nee Nee
Stap 5. Maak de metagegevens over de kolomhoofdsleutel in uw database. New-SqlColumnMasterKey

Opmerking: achter de schermen voert de cmdlet de CREATE COLUMN MASTER KEY (Transact-SQL) instructie uit om sleutelmetagegevens te maken.
Nee Ja
Stap 6. Verifieer bij Azure als uw kolomhoofdsleutel is opgeslagen in Azure Key Vault. Connect-AzAccount Ja Nee
Stap 7. Verkrijg een toegangstoken voor Azure Key Vaults als uw kolomhoofdsleutel is opgeslagen in Azure Key Vault. Get-AzAccessToken Nee Nee
Stap 8. Genereer een nieuwe kolomversleutelingssleutel, versleutel deze met de kolomhoofdsleutel en maak metagegevens van kolomversleutelingssleutels in de database. New-SqlColumnEncryptionKey

Opmerking: Gebruik een variant van de cmdlet die intern een kolomversleutelingssleutel genereert en versleutelt.

Opmerking: Achter de schermen voert de cmdlet de CREATE COLUMN ENCRYPTION KEY (Transact-SQL) verklaring uit om sleutelmetagegevens te maken.
Ja Ja

Windows-certificaatarchief zonder functiescheiding (voorbeeld)

Dit script is een end-to-end-voorbeeld voor het genereren van een kolomhoofdsleutel die een certificaat is in het Windows-certificaatarchief, het genereren en versleutelen van een kolomversleutelingssleutel en het maken van sleutelmetagegevens in een SQL Server-database.

# 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 zonder rolscheiding (voorbeeld)

Dit script is een end-to-end-voorbeeld voor het inrichten en configureren van een sleutelkluis in Azure Key Vault, het genereren van een kolomhoofdsleutel in de kluis, het genereren en versleutelen van een kolomversleutelingssleutel en het maken van sleutelmetagegevens in een Azure SQL-database.

# 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 zonder rolscheiding (voorbeeld)

Het onderstaande script is een end-to-end-voorbeeld voor het genereren van een kolomhoofdsleutel in een sleutelarchief dat CNG (Cryptography Next Generation API) implementeert, een kolomversleutelingssleutel genereert en versleutelt en sleutelmetagegevens maakt in een SQL Server-database.

In het voorbeeld wordt gebruikgemaakt van het sleutelarchief dat gebruikmaakt van Microsoft Software Key Storage Provider. U kunt ervoor kiezen om het voorbeeld te wijzigen om een andere opslag te gebruiken, zoals bijvoorbeeld uw hardwarebeveiligingsmodule. Hiervoor moet u ervoor zorgen dat de sleutelarchiefprovider (KSP) die CNG implementeert voor uw apparaat, correct op uw computer is geïnstalleerd. U moet Microsoft Software Key Storage Provider vervangen door de KSP-naam van uw apparaat.

# 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

Sleutelbeheer met rolscheiding

Deze sectie bevat de stappen voor het configureren van versleuteling waarbij beveiligingsbeheerders geen toegang hebben tot de database en databasebeheerders geen toegang hebben tot het sleutelarchief of niet-versleutelde sleutels.

Beveiligingsbeheerder

Voordat u stappen uitvoert waarbij toegang tot niet-opgemaakte tekstsleutels of het sleutelarchief is vereist (geïdentificeerd in de Accesses plaintext keys/key store kolom in de onderstaande tabel), moet u ervoor zorgen dat:

  1. De PowerShell-omgeving wordt uitgevoerd op een beveiligde computer die verschilt van een computer die als host fungeert voor uw database.
  2. Databasebeheerders in uw organisatie hebben geen toegang tot de machine (dat zou het doel van rolscheiding tenietdoen).

Zie Beveiligingsoverwegingen voor sleutelbeheervoor meer informatie.

Taak Artikel Toegang tot platte-tekst sleutels/sleutelopslag Toegang tot database
Stap 1. Maak een kolomhoofdsleutel in een sleutelopslag.

Opmerking: de SqlServer-module biedt geen ondersteuning voor deze stap. Als u deze taak vanaf een opdrachtregel wilt uitvoeren, moet u de hulpprogramma's gebruiken die specifiek zijn voor het type sleutelarchief.
kolomhoofdsleutels maken en opslaan voor Always Encrypted- Ja Nee
Stap 2. Start een PowerShell-sessie en importeer de SqlServer-module. Importeer de SqlServer-module Nee Nee
Stap 3. Maak een SqlColumnMasterKeySettings-object met informatie over de locatie van de hoofdsleutel van de kolom. SqlColumnMasterKeySettings is een object dat zich in het geheugen bevindt (in PowerShell). Gebruik de cmdlet die specifiek is voor uw sleutelarchief. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

Nieuwe SQL-CspKolomMasterKeyInstellingen
Nee Nee
Stap 4. Verifieer bij Azure als uw kolomhoofdsleutel is opgeslagen in Azure Key Vault. Connect-AzAccount Ja Nee
Stap 5. Verkrijg een toegangstoken voor Azure Key Vaults als uw kolomhoofdsleutel is opgeslagen in Azure Key Vault. Get-AzAccessToken Nee Nee
Stap 6. Genereer een kolomversleutelingssleutel, versleutel deze met de kolomhoofdsleutel om een versleutelde waarde van de kolomversleutelingssleutel te produceren. New-SqlColumnEncryptionKeyEncryptedValue Ja Nee
Stap 7. Geef de locatie op van de kolomhoofdsleutel (de providernaam en een sleutelpad van de kolomhoofdsleutel) en een versleutelde waarde van de kolomversleutelingssleutel naar de DBA. Zie de onderstaande voorbeelden. Nee Nee

Databasebeheerder

DBA's gebruiken de informatie die ze ontvangen van de beveiligingsbeheerder (stap 7 hierboven) om de metagegevens van de Always Encrypted-sleutel in de database te maken en te beheren.

Taak Artikel Toegang tot gegevenssleutels in platte tekst Toegang tot database
Stap 1. Haal de locatie op van de kolomhoofdsleutel en de versleutelde waarde van de kolomversleutelingssleutel van uw beveiligingsbeheerder. Zie de onderstaande voorbeelden. Nee Nee
Stap 2. Start een PowerShell-omgeving en importeer de SqlServer-module. Always Encrypted configureren met behulp van PowerShell Nee Nee
Stap 3. Maak verbinding met uw server en een database. Verbinding maken met een database Nee Ja
Stap 4. Maak een SqlColumnMasterKeySettings-object dat informatie bevat over de locatie van uw kolomhoofdsleutel. SqlColumnMasterKeySettings is een object dat zich in het geheugen bevindt. New-SqlColumnMasterKeySettings Nee Nee
Stap 5. De metagegevens over de kolomhoofdsleutel in uw database maken New-SqlColumnMasterKey
Opmerking: onder de covers geeft de cmdlet de CREATE COLUMN MASTER KEY (Transact-SQL) instructie uit om metagegevens van de kolomhoofdsleutel te maken.
Nee Ja
Stap 6. Maak de metagegevens van de kolomversleutelingssleutel in de database. New-SqlColumnEncryptionKey
Opmerking: DBA's gebruiken een variant van de cmdlet waarmee alleen metagegevens van kolomversleutelingssleutels worden gemaakt.
Onder de dekking geeft de cmdlet de CREATE COLUMN ENCRYPTION KEY (Transact-SQL) instructie voor het maken van metagegevens van kolomversleutelingssleutels.
Nee Ja

Windows-certificaatarchief met functiescheiding (voorbeeld)

Beveiligingsbeheerder

# 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 

Databasebeheerder

# 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

Volgende stappen

Zie ook