Udostępnij za pośrednictwem


Przydziel klucze z obsługą enklawy

Dotyczy: SQL Server 2019 (15.x) i nowszych — tylko Windows Azure SQL Database

W tym artykule opisano sposób aprowizacji kluczy z obsługą enklawy obsługujących obliczenia wewnątrz bezpiecznych enklaw po stronie serwera używanych do Always Encrypted z bezpiecznymi enklawami.

Ogólne wytyczne i procesy dotyczące zarządzania kluczami Always Encrypted mają zastosowanie podczas przydzielania kluczy obsługujących enklawy. Ten artykuł zawiera szczegółowe informacje specyficzne dla Always Encrypted z bezpiecznymi enklawami.

Aby aprowizować klucz główny kolumny z obsługą enklawy przy użyciu programu SQL Server Management Studio lub programu PowerShell, upewnij się, że nowy klucz obsługuje obliczenia enklawy. Spowoduje to, że narzędzie (SSMS lub PowerShell) wygeneruje instrukcję CREATE COLUMN MASTER KEY, która ustawia ENCLAVE_COMPUTATIONS w metadanych klucza głównego kolumn w bazie danych. Aby uzyskać więcej informacji, zobacz CREATE COLUMN MASTER KEY (Transact-SQL).

Narzędzie podpisze również cyfrowo właściwości wzorca kolumny za pomocą klucza głównego kolumny i będzie przechowywać podpis w metadanych bazy danych. Podpis uniemożliwia złośliwe manipulowanie ustawieniem ENCLAVE_COMPUTATIONS. Sterowniki klienta SQL weryfikują podpisy przed zezwoleniem na użycie enklawy. Zapewnia to administratorom zabezpieczeń kontrolę nad tym, które dane kolumn mogą być obliczane wewnątrz enklawy.

ENCLAVE_COMPUTATIONS jest niezmienny, co oznacza, że nie można go zmienić po zdefiniowaniu klucza głównego kolumny w metadanych. Aby włączyć obliczenia enklawy przy użyciu klucza szyfrowania kolumny, który szyfruje dany klucz główny kolumny, należy obrócić klucz główny kolumny i zastąpić go kluczem głównym kolumny z włączoną obsługą enklawy. Zobacz Obracanie kluczy z obsługą enklawy.

Notatka

Obecnie zarówno program SSMS, jak i program PowerShell obsługują klucze główne kolumn z obsługą enklawy przechowywane w usłudze Azure Key Vault lub magazynie certyfikatów systemu Windows. Sprzętowe moduły zabezpieczeń (korzystające z CNG lub CAPI) nie są obsługiwane.

Aby utworzyć klucz szyfrowania kolumny obsługujący enklawę, należy upewnić się, że wybrano klucz główny kolumny z obsługą enklawy do zaszyfrowania nowego klucza.

Poniższe sekcje zawierają więcej szczegółów na temat konfiguracji kluczy obsługujących enklawę przy użyciu SSMS i PowerShell.

Udostępniaj klucze z obsługą enklawy przy użyciu programu SQL Server Management Studio

W programie SQL Server Management Studio można przydzielić zasoby:

  • Klucz główny kolumny przystosowany do enklaw używany w oknie dialogowym Nowy Klucz Główny Kolumny.
  • Klucz szyfrowania kolumny z obsługą enklawy przy użyciu okna dialogowego New Column Encryption Key (Nowy klucz szyfrowania kolumny).

Kreator Always Encrypted umożliwia również utworzenie klucza głównego kolumn z obsługą enklawy oraz klucza szyfrowania kolumn z obsługą enklawy.

Upewnij się, że zainstalowałeś najnowszą ogólnie dostępną wersję programu SQL Server Management Studio (SSMS).

Utwórz klucze główne kolumn obsługujące enklawę za pomocą okna dialogowego Nowy klucz główny kolumny

Aby skonfigurować klucz główny kolumny wspierający enklawy, wykonaj kroki opisane w Skonfiguruj klucze główne kolumn za pomocą okna dialogowego 'Nowy klucz główny kolumny'. Upewnij się, że zaznaczono opcję Zezwalaj na obliczenia enklawy. Zobacz poniższy zrzut ekranu:

Zezwalaj na obliczenia enklawy

Notatka

Pole wyboru zezwalaj na obliczenia enklawy zezwalaj na jest wyświetlane tylko wtedy, gdy dla bazy danych skonfigurowano bezpieczną enklawę. Jeśli używasz programu SQL Server, zobacz Konfigurowanie bezpiecznej enklawy w programie SQL Server. Jeśli używasz usługi Azure SQL Database, zobacz Enable Always Encrypted with secure enclaves for your Azure SQL Database(Włączanie funkcji Always Encrypted z bezpiecznymi enklawami dla usługi Azure SQL Database).

Napiwek

Aby sprawdzić, czy klucz główny kolumny jest przystosowany do enklawy, kliknij go prawym przyciskiem myszy w Eksploratorze obiektów i wybierz Właściwości. Jeśli klucz jest z obsługą enklawy, Obliczenia enklawy: Dozwolone pojawi się w oknie właściwości klucza. Alternatywnie możesz użyć widoku sys.column_master_keys (Transact-SQL).

Aprowizuj klucze szyfrowania kolumn z obsługą enklawy za pomocą okna dialogowego Nowy klucz szyfrowania kolumny

Aby skonfigurować klucz szyfrowania kolumn z obsługą enklawy, wykonaj kroki opisane w Konfigurowanie kluczy szyfrowania kolumn przy użyciu nowego okna dialogowego Klucz szyfrowania kolumny. Podczas wybierania klucza głównego kolumny upewnij się, że jest on obsługiwany przez enklawę.

Napiwek

Aby sprawdzić, czy klucz szyfrowania kolumny obsługuje enklawę, kliknij go prawym przyciskiem myszy w Eksploratorze obiektów i wybierz pozycję Właściwości . Jeśli klucz jest obsługiwany przez enklawę, Obliczenia Enklawy: Dozwolone pojawi się w oknie właściwości klucza.

Udostępnij klucze obsługiwane przez enklawę przy użyciu programu PowerShell

Aby udostępniać klucze obsługujące enklawę przy użyciu programu PowerShell, potrzebny jest moduł SqlServer PowerShell w wersji 22 lub wyższej.

Ogólnie rzecz biorąc, procesy aprowizacji kluczy w programie PowerShell (z separacją ról i bez niej) dla funkcji Always Encrypted, opisane w artykule Provision Always Encrypted Keys using PowerShell, również mają zastosowanie do kluczy obsługujących enklawy. W tej sekcji opisano szczegóły specyficzne dla kluczy z obsługą enklawy.

Moduł SqlServer PowerShell rozszerza polecenia cmdlet New-SqlCertificateStoreColumnMasterKeySettings i New-SqlAzureKeyVaultColumnMasterKeySettings za pomocą parametru -AllowEnclaveComputations, aby umożliwić określenie klucza głównego kolumny, który jest specjalnie włączony dla enklaw, podczas procesu wdrażania. Każde polecenie cmdlet tworzy obiekt lokalny zawierający właściwości klucza głównego kolumny (przechowywanego w usłudze Azure Key Vault lub w magazynie certyfikatów systemu Windows). Jeśli zostanie określona, właściwość -AllowEnclaveComputations oznacza klucz jako zezwalający na enklawę w obiekcie lokalnym. Powoduje to również, że polecenie cmdlet uzyskuje dostęp do przywołynego klucza głównego kolumny (w usłudze Azure Key Vault lub w magazynie certyfikatów systemu Windows) w celu cyfrowego podpisania właściwości klucza. Po utworzeniu obiektu ustawień dla nowego klucza głównego kolumny z włączoną funkcją enklawy, można go użyć w kolejnym wywołaniu polecenia cmdlet New-SqlColumnMasterKey w celu utworzenia obiektu metadanych opisującego nowy klucz w bazie danych.

Dostarczanie kluczy szyfrowania kolumn z obsługą enklawy nie różni się od dostarczania kluczy szyfrowania kolumn, które nie obsługują enklawy. Wystarczy upewnić się, że klucz główny kolumny używany do szyfrowania nowego klucza szyfrowania kolumny obsługuje enklawy.

Notatka

Moduł SqlServer PowerShell nie obsługuje obecnie konfigurowania kluczy z obsługą enklaw przechowywanych w sprzętowych modułach bezpieczeństwa (przy użyciu CNG lub CAPI).

Przykład — udostępnij klucze z obsługą enklawy używając magazynu certyfikatów systemu Windows

W poniższym przykładzie pokazano, jak aprowizować klucze z obsługą enklawy, przechowując klucz główny kolumny przechowywany w magazynie certyfikatów systemu Windows. Skrypt bazuje na przykładzie w Magazynie certyfikatów systemu Windows bez podziału ról (Przykład). Należy pamiętać, że użycie parametru -AllowEnclaveComputations w poleceniu cmdlet New-SqlCertificateStoreColumnMasterKeySettings stanowi jedyną różnicę między sekwencjami procesu w dwóch przykładach.

# 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" -MinimumVersion 22.0.50

# 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"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your column master key
# using the -AllowEnclaveComputations parameter.
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint -AllowEnclaveComputations

# 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

Przykład — skonfiguruj klucze obsługujące enklawy przy użyciu usługi Azure Key Vault

W poniższym przykładzie pokazano, jak udostępniać klucze obsługujące enklawę, przechowując klucz główny kolumny w magazynie kluczy Azure Key Vault. Skrypt jest oparty na przykładzie Azure Key Vault (przykład bez separacji ról). Należy pamiętać o dwóch różnicach między przepływem pracy dla kluczy obsługujących enklawę a kluczami, które nie obsługują enklawy.

  • W poniższym skrypcie New-SqlCertificateStoreColumnMasterKeySettings używa parametru -AllowEnclaveComputations do nadania kluczowi głównemu kolumny funkcji współpracy z enklawą.
  • Poniższy skrypt używa polecenia cmdlet Get-AzAccessToken do uzyskania tokenu dostępu dla Azure Key Vault. Jest to konieczne, ponieważ New-SqlAzureKeyVaultColumnMasterKeySettings musi mieć dostęp do usługi Azure Key Vault, aby podpisać właściwości klucza głównego kolumny.
# Create a column master key in Azure Key Vault.
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
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.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token 

# Create a SqlColumnMasterKeySettings object for your column master key. 
$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyURL $akvKey.ID -AllowEnclaveComputations -KeyVaultAccessToken $keyVaultAccessToken

# 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 -KeyVaultAccessToken $keyVaultAccessToken

Następne kroki

Zobacz też