Udostępnij za pośrednictwem


Aprowizuj klucze Always Encrypted przy użyciu programu PowerShell

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Ten artykuł zawiera kroki aprowizowania kluczy dla funkcji Always Encrypted przy użyciu modułu SqlServer programu PowerShell. Za pomocą programu PowerShell można aprowizować klucze Always Encrypted zarówno z separacją ról, jak i bez, zapewniając kontrolę nad tym, kto ma dostęp do rzeczywistych kluczy szyfrowania w magazynie kluczy i kto ma dostęp do bazy danych.

Aby zapoznać się z omówieniem zarządzania kluczami Always Encrypted, w tym zaleceniami dotyczącymi najlepszych rozwiązań wysokiego poziomu, zobacz Omówienie zarządzania kluczami dla usługi Always Encrypted. Aby uzyskać informacje na temat rozpoczynania korzystania z modułu SqlServer PowerShell dla funkcji Always Encrypted, zobacz Configure Always Encrypted using PowerShell.

Udostępnianie kluczy bez separacji ról

Kluczowa metoda aprowizacji opisana w tej sekcji nie obsługuje separacji ról między administratorami zabezpieczeń i administratorami baz danych. Niektóre z poniższych kroków łączą operacje na kluczach fizycznych z operacjami na metadanych klucza. W związku z tym ta metoda aprowizacji kluczy jest zalecana dla organizacji korzystających z modelu DevOps lub jeśli baza danych jest hostowana w chmurze, a głównym celem jest ograniczenie dostępu do poufnych danych przez administratorów chmury (ale nie lokalnych administratorów baz danych). Nie zaleca się, jeśli potencjalni przeciwnicy obejmują administratorów baz danych lub jeśli administratorzy baz danych nie powinni mieć dostępu do poufnych danych.

Przed wykonaniem kroków obejmujących dostęp do kluczy w postaci zwykłego tekstu lub magazynu kluczy (zidentyfikowanego w Accesses plaintext keys/key store kolumny w poniższej tabeli), upewnij się, że środowisko programu PowerShell działa na bezpiecznej maszynie innej niż komputer hostujący bazę danych. Aby uzyskać więcej informacji, zobacz Zagadnienia dotyczące zabezpieczeń dotyczące zarządzania kluczami.

Zadanie Artykuł Uzyskuje dostęp do kluczy w postaci zwykłego tekstu/magazynu kluczy Uzyskuje dostęp do bazy danych
Krok 1. Utwórz klucz główny dla kolumny w magazynie kluczy.

Uwaga: moduł SqlServer PowerShell nie obsługuje tego kroku. Aby wykonać to zadanie z poziomu wiersza polecenia, użyj narzędzi specyficznych dla wybranego magazynu kluczy.
Tworzenie kluczy głównych kolumn i ich przechowywanie dla Always Encrypted Tak Nie
Krok 2. Uruchom środowisko programu PowerShell i zaimportuj moduł SqlServer PowerShell. konfigurowanie funkcji Always Encrypted przy użyciu programu PowerShell Nie Nie
Krok 3. Nawiąż połączenie z serwerem i bazą danych. Nawiązywanie połączenia z bazą danych Nie Tak
Krok 4. Utwórz obiekt SqlColumnMasterKeySettings zawierający informacje o lokalizacji klucza głównego kolumny. SqlColumnMasterKeySettings to obiekt, który istnieje w pamięci (w programie PowerShell). Użyj polecenia cmdlet odpowiedniego dla magazynu kluczy. new-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Nie Nie
Krok 5. Utwórz metadane dotyczące klucza głównego kolumny w bazie danych. new-SqlColumnMasterKey

Uwaga: wewnętrznie polecenie cmdlet wydaje polecenie CREATE COLUMN MASTER KEY (Transact-SQL) w celu utworzenia metadanych klucza.
Nie Tak
Krok 6. Uwierzytelnij się w Azure, jeśli klucz główny kolumny jest przechowywany w Azure Key Vault. Connect-AzAccount Tak Nie
Krok 7. Uzyskaj token dostępu do Azure Key Vault, jeśli Twój klucz główny kolumny jest przechowywany w Azure Key Vault. Get-AzAccessToken Nie Nie
Krok 8. Wygeneruj nowy klucz szyfrowania kolumny, zaszyfruj go przy użyciu klucza głównego kolumny i utwórz metadane klucza szyfrowania kolumny w bazie danych. new-SqlColumnEncryptionKey

Uwaga: Użyj odmiany polecenia cmdlet, które wewnętrznie generuje i szyfruje klucz szyfrowania kolumny.

Uwaga: W tle polecenie cmdlet wystawia instrukcję CREATE COLUMN ENCRYPTION KEY (Transact-SQL) w celu utworzenia metadanych klucza.
Tak Tak

Magazyn certyfikatów systemu Windows bez separacji ról (przykład)

Ten skrypt jest kompleksowym przykładem generowania klucza głównego kolumny jako certyfikatu w magazynie certyfikatów systemu Windows, generowania i szyfrowania klucza szyfrowania kolumn oraz tworzenia metadanych klucza w bazie danych programu 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

Usługa Azure Key Vault bez separacji ról (przykład)

Ten skrypt jest kompleksowym przykładem udostępniania i konfigurowania magazynu kluczy w Azure Key Vault, generowania klucza głównego kolumny w magazynie, generowania i szyfrowania klucza szyfrowania kolumn oraz tworzenia metadanych klucza w 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 bez separacji ról (przykład)

Poniższy skrypt to kompleksowy przykład generowania klucza głównego kolumny w repozytorium kluczy, które implementuje interfejs API kryptografii nowej generacji (CNG), generowania i szyfrowania klucza szyfrowania kolumny oraz tworzenia metadanych kluczy w bazie danych programu SQL Server.

Przykład wykorzystuje magazyn kluczy, który korzysta z Microsoft Software Key Storage Provider. Możesz wybrać, aby zmodyfikować przykład w taki sposób, by korzystał z innego typu magazynu, takiego jak sprzętowy moduł zabezpieczeń. W tym celu należy upewnić się, że dostawca magazynu kluczy (KSP), który implementuje CNG dla Twojego urządzenia, jest zainstalowany i działa prawidłowo na maszynie. Musisz zastąpić Microsoft Software Key Storage Provider nazwą KSP dla Twojego urządzenia.

# 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

Zarządzanie kluczami z oddzieleniem ról

Ta sekcja zawiera kroki konfigurowania szyfrowania, w którym administratorzy zabezpieczeń nie mają dostępu do bazy danych, a administratorzy baz danych nie mają dostępu do magazynu kluczy ani kluczy w postaci zwykłego tekstu.

Administrator zabezpieczeń

Przed wykonaniem jakichkolwiek kroków obejmujących dostęp do kluczy w postaci zwykłego tekstu lub magazynu kluczy (zidentyfikowanego w kolumnie Accesses plaintext keys/key store w poniższej tabeli), upewnij się, że:

  1. Środowisko programu PowerShell działa na bezpiecznej maszynie innej niż komputer hostujący bazę danych.
  2. Administratorzy baz danych w organizacji nie mają dostępu do maszyny, co zaprzeczyłoby celowi separacji ról.

Aby uzyskać więcej informacji, zobacz Zagadnienia dotyczące zabezpieczeń dotyczące zarządzania kluczami.

Zadanie Artykuł Uzyskuje dostęp do kluczy w postaci zwykłego tekstu/magazynu kluczy Uzyskuje dostęp do bazy danych
Krok 1. Utwórz klucz główny kolumny w magazynie kluczy.

Uwaga: moduł SqlServer nie obsługuje tego kroku. Aby wykonać to zadanie z poziomu wiersza polecenia, należy użyć narzędzi specyficznych dla typu magazynu kluczy.
Tworzenie kluczy głównych kolumn i ich przechowywanie dla Always Encrypted Tak Nie
Krok 2. Uruchom sesję programu PowerShell i zaimportuj moduł SqlServer. Importowanie modułu SqlServer Nie Nie
Krok 3. Utwórz obiekt SqlColumnMasterKeySettings zawierający informacje o lokalizacji klucza głównego kolumny. SqlColumnMasterKeySettings jest obiektem, który istnieje w pamięci (w programie PowerShell). Użyj polecenia cmdlet odpowiedniego dla magazynu kluczy. new-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Nie Nie
Krok 4. Uwierzytelnij się w Azure, jeśli klucz główny kolumny jest przechowywany w Azure Key Vault. Connect-AzAccount Tak Nie
Krok 5. Uzyskaj token dostępu dla usługi Azure Key Vault, jeśli klucz główny kolumny jest przechowywany w usłudze Azure Key Vault. Get-AzAccessToken Nie Nie
Krok 6. Wygeneruj klucz szyfrowania kolumny, zaszyfruj go przy użyciu klucza głównego kolumny, aby wygenerować zaszyfrowaną wartość klucza szyfrowania kolumny. new-SqlColumnEncryptionKeyEncryptedValue Tak Nie
Krok 7. Podaj lokalizację klucza głównego kolumny (nazwę dostawcy i ścieżkę klucza głównego kolumny) oraz zaszyfrowaną wartość klucza szyfrowania kolumny administratorowi bazy danych. Zapoznaj się z poniższymi przykładami. Nie Nie

Administrator Baz Danych

Administratorzy baz danych używają informacji, które otrzymują od administratora zabezpieczeń (krok 7 powyżej), aby utworzyć metadane klucza Always Encrypted w bazie danych i zarządzać nimi.

Zadanie Artykuł Uzyskuje dostęp do kluczy w postaci zwykłego tekstu Uzyskuje dostęp do bazy danych
Krok 1. Uzyskaj lokalizację klucza głównego kolumny i zaszyfrowaną wartość klucza szyfrowania kolumny od Administratora Bezpieczeństwa. Zapoznaj się z poniższymi przykładami. Nie Nie
Krok 2. Uruchom środowisko programu PowerShell i zaimportuj moduł SqlServer. konfigurowanie funkcji Always Encrypted przy użyciu programu PowerShell Nie Nie
Krok 3. Nawiąż połączenie z serwerem i bazą danych. Nawiązywanie połączenia z bazą danych Nie Tak
Krok 4. Utwórz obiekt SqlColumnMasterKeySettings zawierający informacje o lokalizacji klucza głównego kolumny. SqlColumnMasterKeySettings to obiekt, który istnieje w pamięci. New-SqlColumnMasterKeySettings Nie Nie
Krok 5. Tworzenie metadanych dotyczących klucza głównego kolumny w bazie danych new-SqlColumnMasterKey
Uwaga: w tle polecenie cmdlet wystawia instrukcję "CREATE COLUMN MASTER KEY (Transact-SQL)" w celu utworzenia metadanych klucza głównego kolumny.
Nie Tak
Krok 6. Utwórz metadane klucza szyfrowania kolumny w bazie danych. New-SqlColumnEncryptionKey
Uwaga: Administratorzy baz danych używają odmiany polecenia cmdlet, które tworzy tylko metadane klucza szyfrowania kolumny.
Pod spodem polecenie cmdlet wykonuje instrukcję CREATE COLUMN ENCRYPTION KEY (Transact-SQL), aby utworzyć metadane klucza szyfrowania kolumny.
Nie Tak

Magazyn certyfikatów systemu Windows z separacją ról (przykład)

Administrator zabezpieczeń

# 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 

Administrator Baz Danych

# 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

Następne kroki

Zobacz też