Etablera Always Encrypted-nycklar med PowerShell
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Den här artikeln innehåller stegen för att etablera nycklar för Always Encrypted med hjälp av SqlServer PowerShell-modulen. Du kan använda PowerShell för att etablera Always Encrypted-nycklar både med och utan rollavgränsning, vilket ger kontroll över vem som har åtkomst till de faktiska krypteringsnycklarna i nyckelarkivet och vem som har åtkomst till databasen.
En översikt över Always Encrypted-nyckelhantering, inklusive några rekommenderade metodtips på hög nivå, finns i Översikt över nyckelhantering för Always Encrypted. Information om hur du börjar använda SqlServer PowerShell-modulen för Always Encrypted finns i Configure Always Encrypted using PowerShell.
Nyckeletablering utan rollseparation
Den nyckeletableringsmetod som beskrivs i det här avsnittet stöder inte rollseparering mellan säkerhetsadministratörer och dbas. Några av stegen nedan kombinerar åtgärder på fysiska nycklar med åtgärder för nyckelmetadata. Därför rekommenderas den här metoden för att etablera nycklarna för organisationer som använder DevOps-modellen, eller om databasen finns i molnet och det primära målet är att begränsa molnadministratörer (men inte lokala dbas) från att komma åt känsliga data. Det rekommenderas inte om potentiella angripare inkluderar dbas eller om dbas inte ska ha åtkomst till känsliga data.
Innan du kör några steg som innebär åtkomst till oformaterade nycklar eller nyckelarkivet (identifieras i Accesses klartextnycklar/nyckelarkiv kolumn i tabellen nedan) kontrollerar du att PowerShell-miljön körs på en säker dator som skiljer sig från en dator som är värd för databasen. Mer information finns i säkerhetsöverväganden för Nyckelhantering.
Uppgift | Artikel | Åtkomst till klartextnycklar/nyckelarkiv | Åtkomst till databasen |
---|---|---|---|
Steg 1. Skapa en kolumnhuvudnyckel i ett nyckelarkiv. Obs! SqlServer PowerShell-modulen stöder inte det här steget. Om du vill utföra den här uppgiften från en kommandorad använder du de verktyg som är specifika för det valda nyckelarkivet. |
Skapa och lagra kolumnhuvudnycklar för Always Encrypted | Ja | Nej |
Steg 2. Starta en PowerShell-miljö och importera SqlServer PowerShell-modulen. | Konfigurera Always Encrypted med PowerShell | Nej | Nej |
Steg 3. Anslut till servern och databasen. | Anslut till en databas | Nej | Ja |
Steg 4. Skapa en SqlColumnMasterKeySettings objekt som innehåller information om platsen för kolumnhuvudnyckeln. SqlColumnMasterKeySettings är ett objekt som finns i minnet (i PowerShell). Använd den cmdlet som är specifik för ditt nyckelarkiv. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings Ny-SqlCngKolumnHuvudnyckelInställningar New-SqlCspColumnMasterKeySettings |
Nej | Nej |
Steg 5. Skapa metadata om kolumnhuvudnyckeln i databasen. |
New-SqlColumnMasterKey Obs! under täcket utfärdar cmdleten CREATE COLUMN MASTER KEY (Transact-SQL)-instruktionen för att skapa nyckelmetadata. |
Nej | Ja |
Steg 6. Autentisera till Azure om din kolumnhuvudnyckel lagras i Azure Key Vault. | Connect-AzAccount | Ja | Nej |
Steg 7. Hämta en åtkomsttoken för Azure Key Vaults om din kolumnhuvudnyckel lagras i Azure Key Vault. | Get-AzAccessToken | Nej | Nej |
Steg 8. Generera en ny kolumnkrypteringsnyckel, kryptera den med kolumnhuvudnyckeln och skapa metadata för kolumnkrypteringsnyckeln i databasen. |
New-SqlColumnEncryptionKey Obs! Använd en variant av cmdleten som internt genererar och krypterar en kolumnkrypteringsnyckel. Obs! I bakgrunden kör cmdleten CREATE COLUMN ENCRYPTION KEY (Transact-SQL)-instruktionen för att skapa nyckelmetadata. |
Ja | Ja |
Windows Certificate Store utan rollavgränsning (exempel)
Det här skriptet är ett exempel från slutpunkt till slutpunkt för att generera en kolumnhuvudnyckel som är ett certifikat i Windows Certificate Store, generera och kryptera en kolumnkrypteringsnyckel och skapa nyckelmetadata i en SQL Server-databas.
# 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 utan rollavgränsning (exempel)
Det här skriptet är ett exempel från slutpunkt till slutpunkt för att etablera och konfigurera ett nyckelvalv i Azure Key Vault, generera en kolumnhuvudnyckel i valvet, generera och kryptera en kolumnkrypteringsnyckel och skapa nyckelmetadata i en Azure SQL-databas.
# 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 utan rollavgränsning (exempel)
Skriptet nedan är ett exempel från slutpunkt till slutpunkt för att generera en kolumnhuvudnyckel i ett nyckelarkiv som implementerar kryptografi-API :et nästa generations (CNG), genererar och krypterar en kolumnkrypteringsnyckel och skapar nyckelmetadata i en SQL Server-databas.
I exemplet utnyttjas nyckellagring som använder Microsoft Software Key Storage Provider. Du kan välja att ändra exemplet så att det använder ett annat lager, till exempel din maskinvarusäkerhetsmodul. För det måste du se till att nyckellagringsprovidern (KSP) som implementerar CNG för din enhet är installerad och korrekt på datorn. Du måste ersätta Microsoft Software Key Storage Provider
med enhetens KSP-namn.
# 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
Nyckeletablering med rollseparation
Det här avsnittet innehåller stegen för att konfigurera kryptering där säkerhetsadministratörer inte har åtkomst till databasen och databasadministratörer inte har åtkomst till nyckelarkivet eller oformaterade nycklar.
Säkerhetsadministratör
Innan du kör några steg som innebär åtkomst till oformaterade nycklar eller nyckelarkivet (identifieras i Accesses oformaterade nycklar/nyckelarkiv kolumnen i tabellen nedan) kontrollerar du att:
- PowerShell-miljön körs på en säker dator som skiljer sig från en dator som är värd för databasen.
- DBA:er i din organisation har ingen åtkomst till datorn (vilket skulle motverka syftet med rollseparation).
Mer information finns i säkerhetsöverväganden för Nyckelhantering.
Uppgift | Artikel | Åtkomst till klartextnycklar/nyckelarkiv | Åtkomst till databasen |
---|---|---|---|
Steg 1. Skapa en kolumnhuvudnyckel i ett nyckelarkiv. Obs! SqlServer-modulen stöder inte det här steget. För att kunna utföra den här uppgiften från en kommandorad måste du använda de verktyg som är specifika för din nyckellagringstyp. |
Skapa och lagra kolumnhuvudnycklar för Always Encrypted | Ja | Nej |
Steg 2. Starta en PowerShell-session och importera SqlServer-modulen. | Importera SqlServer-modulen | Nej | Nej |
Steg 3. Skapa en SqlColumnMasterKeySettings objekt som innehåller information om platsen för kolumnhuvudnyckeln. SqlColumnMasterKeySettings är ett objekt som finns i minnet (i PowerShell). Använd den cmdlet som är specifik för ditt nyckelarkiv. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings Ny-SqlCspColumnMasterKeyInställningar |
Nej | Nej |
Steg 4. Autentisera till Azure om din kolumnhuvudnyckel lagras i Azure Key Vault. | Connect-AzAccount | Ja | Nej |
Steg 5. Hämta en åtkomsttoken för Azure Key Vaults om din kolumnhuvudnyckel lagras i Azure Key Vault. | Get-AzAccessToken | Nej | Nej |
Steg 6. Generera en kolumnkrypteringsnyckel, kryptera den med kolumnhuvudnyckeln för att skapa ett krypterat värde för kolumnkrypteringsnyckeln. | New-SqlColumnEncryptionKeyEncryptedValue | Ja | Nej |
Steg 7. Ange platsen för kolumnhuvudnyckeln (providernamnet och en nyckelsökväg för kolumnhuvudnyckeln) och ett krypterat värde för kolumnkrypteringsnyckeln till DBA. | Se exemplen nedan. | Nej | Nej |
DBA
DBA använder den information de får från säkerhetsadministratören (steg 7 ovan) för att skapa och hantera metadata för Always Encrypted-nyckeln i databasen.
Uppgift | Artikel | Åtkomst till klartextnycklar | Åtkomst till databasen |
---|---|---|---|
Steg 1. Hämta platsen för kolumnhuvudnyckeln och det krypterade värdet för kolumnkrypteringsnyckeln från säkerhetsadministratören. | Se exemplen nedan. | Nej | Nej |
Steg 2. Starta en PowerShell-miljö och importera SqlServer-modulen. | Konfigurera Always Encrypted med PowerShell | Nej | Nej |
Steg 3. Anslut till servern och en databas. | Anslut till en databas | Nej | Ja |
Steg 4. Skapa ett SqlColumnMasterKeySettings-objekt som innehåller information om platsen för din kolumnhuvudnyckel. SqlColumnMasterKeySettings är ett objekt som finns i minnet. | New-SqlColumnMasterKeySettings | Nej | Nej |
Steg 5. Skapa metadata om kolumnhuvudnyckeln i databasen |
New-SqlColumnMasterKey Obs! i bakgrunden utfärdar cmdleten instruktionen CREATE COLUMN MASTER KEY (Transact-SQL) för att skapa metadata för kolumnhuvudnyckeln. |
Nej | Ja |
Steg 6. Skapa kolumnkrypteringsnyckelmetadata i databasen. | New-SqlColumnEncryptionKey Obs! DBA använder en variant av cmdleten som bara skapar kolumnkrypteringsnyckelmetadata. Under täcket utfärdar cmdleten CREATE COLUMN ENCRYPTION KEY (Transact-SQL)-instruktionen för att skapa kolumnkrypteringsnyckelmetadata. |
Nej | Ja |
Windows Certificate Store med rollavgränsning (exempel)
Säkerhetsadministratör
# 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
Nästa steg
- Konfigurera kolumnkryptering med Always Encrypted med PowerShell
- Rotera Always Encrypted-nycklar med PowerShell
- Utveckla program med Always Encrypted
Se även
- Always Encrypted
- Översikt över nyckelhantering för Always Encrypted
- Skapa och lagra kolumnhuvudnycklar för Always Encrypted
- Konfigurera Always Encrypted med PowerShell
- Etablera Always Encrypted-nycklar med SQL Server Management Studio
- SKAPA KOLUMNHUVUDNYCKEL (Transact-SQL)
- TA BORT KOLUMNHUVUDNYCKEL (Transact-SQL)
- SKAPA KOLUMNKRYPTERINGSNYCKEL (Transact-SQL)
- ÄNDRA KOLUMNKRYPTERINGSNYCKEL (Transact-SQL)
- TA BORT KOLUMNKRYPTERINGSNYCKEL (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sys.column_encryption_keys (Transact-SQL)