Sdílet prostřednictvím


Zřízení klíčů Always Encrypted pomocí PowerShellu

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Tento článek obsahuje postup zřízení klíčů pro Always Encrypted pomocí modulu SqlServer PowerShell. Pomocí PowerShellu můžete zřizovat klíče Always Encrypted jak , tak bez oddělení rolí, což umožňuje kontrolu nad tím, kdo má přístup ke skutečným šifrovacím klíčům v úložišti klíčů a kdo má přístup k databázi.

Přehled správy klíčů Always Encrypted, včetně některých doporučení osvědčených postupů vysoké úrovně, najdete v tématu Přehled správy klíčů pro funkci Always Encrypted. Informace o tom, jak začít používat modul SqlServer PowerShell pro Always Encrypted, najdete v tématu Konfigurace funkce Always Encrypted pomocí powershellového.

Zřizování klíčů bez oddělení rolí

Metoda zřizování klíčů popsaná v této části nepodporuje oddělení rolí mezi správci zabezpečení a správci dba. Některé z následujících kroků kombinují operace s fyzickými klíči s operacemi s metadaty klíčů. Proto se tato metoda zřizování klíčů doporučuje pro organizace používající model DevOps, nebo pokud je databáze hostovaná v cloudu a primárním cílem je omezit správce cloudu (ale ne místní dbA) z přístupu k citlivým datům. Nedoporučuje se, pokud mezi potenciální protivníky patří správci databází, nebo pokud správci databází nemají mít přístup k citlivým datům.

Před spuštěním jakýchkoli kroků, které zahrnují přístup ke klíčům ve formátu prostého textu nebo k úložišti klíčů (jak je uvedeno ve sloupci Přístup ke klíčům ve formátu prostého textu/úložišti klíčů v následující tabulce), se ujistěte, že prostředí PowerShell běží na zabezpečeném počítači, který není stejný jako ten, na němž je hostována vaše databáze. Další informace najdete v tématu aspekty zabezpečení pro správu klíčů.

Úkol Článek Přístup ke klíčům nebo úložišti klíčů ve formátu prostého textu Přístup k databázi
Krok 1. Vytvořte hlavní klíč sloupce v úložišti klíčů.

Poznámka: modul SqlServer PowerShell tento krok nepodporuje. K provedení tohoto úkolu z příkazového řádku použijte nástroje specifické pro vybrané úložiště klíčů.
Vytvoření a uložení hlavních klíčů sloupců pro funkci Always Encrypted Ano Ne
Krok 2. Spusťte prostředí PowerShell a naimportujte modul SqlServer PowerShellu. Konfigurace Always Encrypted pomocí PowerShellu Ne Ne
Krok 3. Připojte se k serveru a databázi. Připojit k databázi Ne Ano
Krok 4. Vytvořte SqlColumnMasterKeySettings objekt, který obsahuje informace o umístění hlavního klíče sloupce. SqlColumnMasterKeySettings je objekt, který existuje v paměti (v PowerShellu). Použijte rutinu (cmdlet) specifickou pro vaše úložiště klíčů. New-SqlAzureKeyVaultColumnMasterKeySettings

Nový-SqlCertifikátovýObchodSloupcovýHlavníKlíčNastavení

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Ne Ne
Krok 5. Vytvořte metadata o hlavním klíči sloupce v databázi. New-SqlColumnMasterKey

Poznámka: Na pozadí rutina cmdlet vydává příkaz CREATE COLUMN MASTER KEY (Transact-SQL) k vytvoření metadat klíče.
Ne Ano
Krok 6. Ověřte se v Azure, pokud je hlavní klíč sloupce uložený ve službě Azure Key Vault. Connect-AzAccount Ano Ne
Krok 7. Získejte přístupový token pro službu Azure Key Vault, pokud je hlavní klíč sloupce uložený ve službě Azure Key Vault. Get-AzAccessToken Ne Ne
Krok 8. Vygenerujte nový šifrovací klíč sloupce, zašifrujte ho pomocí hlavního klíče sloupce a vytvořte metadata šifrovacího klíče sloupce v databázi. New-SqlColumnEncryptionKey

Poznámka: Použijte variantu rutiny, která interně generuje a šifruje šifrovací klíč sloupce.

Poznámka: Interně cmdlet využívá příkaz CREATE COLUMN ENCRYPTION KEY (Transact-SQL) k vytvoření metadat klíče.
Ano Ano

Úložiště certifikátů systému Windows bez oddělení rolí (příklad)

Tento skript je kompletní příklad pro generování hlavního klíče sloupce, který je certifikátem ve Windows Certificate Storu, generování a šifrování šifrovacího klíče sloupce a vytváření metadat klíčů v databázi SQL Serveru.

# 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 bez oddělení rolí (příklad)

Tento skript je kompletní příklad pro zřizování a konfiguraci trezoru klíčů ve službě Azure Key Vault, generování hlavního klíče sloupce v trezoru, generování a šifrování šifrovacího klíče sloupce a vytváření metadat klíčů v databázi Azure SQL.

# 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 bez oddělení rolí (příklad)

Následující skript je kompletní příklad pro generování hlavního klíče sloupce v úložišti klíčů, který implementuje rozhraní CNG (Cryptography Next Generation API), generování a šifrování šifrovacího klíče sloupce a vytváření metadat klíčů v databázi SQL Serveru.

Příklad využívá úložiště klíčů, které používá Microsoftovský poskytovatel úložiště softwarových klíčů. Můžete se rozhodnout změnit příklad tak, aby používal jiné úložiště, například modul hardwarového zabezpečení. Abyste toho dosáhli, musíte se ujistit, že poskytovatel úložiště klíčů (KSP), který implementuje CNG pro vaše zařízení, je na vašem počítači správně nainstalován a funkční. Budete muset nahradit Microsoft Software Key Storage Provider názvem KSP vašeho zařízení.

# 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

Zřizování klíčů s oddělením rolí

Tato část obsahuje postup konfigurace šifrování, kdy správci zabezpečení nemají přístup k databázi a správci databází nemají přístup k úložišti klíčů nebo klíčům prostého textu.

Správce zabezpečení

Před spuštěním jakýchkoli kroků, které zahrnují přístup ke klíčům prostého textu nebo úložišti klíčů (identifikovaných v Accesses keys/key store sloupec v následující tabulce), ujistěte se, že:

  1. Prostředí PowerShell běží na zabezpečeném počítači, který se liší od počítače hostujícího vaši databázi.
  2. DbA ve vaší organizaci nemají přístup k počítači (které by poškodilo účel oddělení rolí).

Další informace najdete v tématu aspekty zabezpečení pro správu klíčů.

Úkol Článek Přístup ke klíčům nebo úložišti klíčů ve formátu prostého textu Přístup k databázi
Krok 1. Vytvořte hlavní klíč sloupce v úložišti klíčů.

Poznámka: modul SqlServer tento krok nepodporuje. Pokud chcete tento úkol provést z příkazového řádku, musíte použít nástroje, které jsou specifické pro konkrétní typ úložiště klíčů.
Vytvoření a uložení hlavních klíčů sloupců pro funkci Always Encrypted Ano Ne
Krok 2. Spusťte relaci PowerShellu a naimportujte modul SqlServer. Import modulu SqlServer Ne Ne
Krok 3. Vytvořte SqlColumnMasterKeySettings objekt, který obsahuje informace o umístění hlavního klíče sloupce. SqlColumnMasterKeySettings je objekt, který existuje v paměti (v PowerShellu). Použijte rutinu (cmdlet) specifickou pro vaše úložiště klíčů. New-SqlAzureKeyVaultColumnMasterKeySettings

Nový-SqlCertifikátovýObchodSloupcovýHlavníKlíčNastavení

New-SqlCngColumnMasterKeySettings

Nové nastavení hlavního klíče sloupce SqlCsp
Ne Ne
Krok 4. Ověřte se v Azure, pokud je hlavní klíč sloupce uložený ve službě Azure Key Vault. Connect-AzAccount Ano Ne
Krok 5. Získejte přístupový token pro službu Azure Key Vault, pokud je hlavní klíč sloupce uložený ve službě Azure Key Vault. Get-AzAccessToken Ne Ne
Krok 6. Vygenerujte šifrovací klíč sloupce, zašifrujte ho pomocí hlavního klíče sloupce a vytvořte zašifrovanou hodnotu šifrovacího klíče sloupce. New-SqlColumnEncryptionKeyEncryptedValue Ano Ne
Krok 7. Poskytněte umístění sloupcového hlavního klíče (název poskytovatele a cestu ke klíči sloupcového hlavního klíče) a zašifrovanou hodnotu šifrovacího klíče sloupce správci databáze. Podívejte se na následující příklady. Ne Ne

DBA

DbA používají informace, které obdrží od správce zabezpečení (krok 7 výše), k vytvoření a správě metadat klíčů Always Encrypted v databázi.

Úkol Článek Přístup ke klíčům prostého textu Přístup k databázi
Krok 1. Získejte umístění hlavního klíče sloupce a zašifrovanou hodnotu šifrovacího klíče sloupce od správce zabezpečení. Podívejte se na následující příklady. Ne Ne
Krok 2. Spusťte prostředí PowerShell a naimportujte modul SqlServer. Konfigurace Always Encrypted pomocí PowerShell Ne Ne
Krok 3. Připojte se k serveru a databázi. Připojit k databázi Ne Ano
Krok 4. Vytvořte objekt SqlColumnMasterKeySettings, který obsahuje informace o umístění hlavního klíče sloupce. SqlColumnMasterKeySettings je objekt, který existuje v paměti. New-SqlColumnMasterKeySettings Ne Ne
Krok 5. Vytvoření metadat o hlavním klíči sloupce v databázi New-SqlColumnMasterKey
Poznámka: V zákulisí cmdlet vydává příkaz CREATE COLUMN MASTER KEY (Transact-SQL) k vytvoření metadat hlavního klíče sloupce.
Ne Ano
Krok 6. Vytvořte v databázi metadata sloupcového šifrovacího klíče. New-SqlColumnEncryptionKey
Poznámka: Správci databází používají variantu rutiny, která vytváří pouze metadata šifrovacího klíče sloupce.
Na pozadí cmdlet vydává příkaz CREATE COLUMN ENCRYPTION KEY (Transact-SQL) ke vytvoření metadat šifrovacího klíče sloupce.
Ne Ano

Úložiště certifikátů Systému Windows s oddělením rolí (příklad)

Správce zabezpečení

# 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

Další kroky

Viz také