適用於: SQL Server 2019 (15.x) 與更新版本 - 僅限 Windows
Azure SQL 資料庫
本文描述如何配置支援記憶體保護區的金鑰,以支援在伺服器端安全記憶體保護區中進行計算,用於具備安全記憶體保護區的 Always Encrypted。
在您佈建已啟用記憶體保護區的金鑰時,適用管理 Always Encrypted 金鑰的一般方針和流程。 本文探討與 Always Encrypted 和安全區域相關的詳細資料。
若要使用 SQL Server Management Studio 或 PowerShell 佈建支援安全區域的資料行主金鑰,請確認新的金鑰支援安全區域計算。 這會使工具 (SSMS 或 PowerShell) 產生 CREATE COLUMN MASTER KEY
陳述式,在資料庫中的資料行主要金鑰中繼資料內設定 ENCLAVE_COMPUTATIONS
。 如需詳細資訊,請參閱 CREATE COLUMN MASTER KEY (Transact-SQL)。
工具也會使用資料行主要金鑰對資料行主要屬性進行數位簽署,並會將簽章儲存在資料庫中繼資料內。 簽章能防止 ENCLAVE_COMPUTATIONS
設定被惡意竄改。 SQL 用戶端驅動程式會在允許使用安全區域之前先驗證簽章。 這可讓安全系統管理員控制可在記憶體保護區內計算的特定資料行資料。
ENCLAVE_COMPUTATIONS
是固定的,這表示您在中繼資料中定義資料行主要金鑰後,便無法進行變更。 若要啟用記憶體保護區計算以使用資料行加密金鑰,您需要更新用於加密資料行的指定資料行主要金鑰,並將其替換為啟用了記憶體保護區的資料行主要金鑰。 請參閱輪替已啟用安全區的金鑰。
注意
目前,SSMS 和 PowerShell 都支援封裝資料行主要金鑰,這些金鑰儲存在 Azure Key Vault 或 Windows 憑證存放區中。 不支援硬體安全性模組 (使用 CNG 或 CAPI)。
若要建立已啟用記憶體保護區的資料行加密金鑰,您需要確認您選取已啟用記憶體保護區的資料行主要金鑰來加密新金鑰。
下列各節提供詳細資料,說明如何使用 SSMS 和 PowerShell 來佈建已啟用記憶體保護區的金鑰。
使用 SQL Server Management Studio 佈建已啟用安全區的金鑰
您可在 SQL Server Management Studio 中佈建:
- 使用 [新增資料行主要金鑰] 對話方塊建立啟用保護區的資料行主金鑰。
- 使用 [新增資料行加密金鑰] 對話方塊來設定支援區域保護功能的資料行加密金鑰。
Always Encrypted 精靈也可讓您建立已啟用安全區的欄位主金鑰和已啟用安全區的欄位加密金鑰。
確定您已安裝最新正式發行 (GA) 版的 SQL Server Management Studio (SSMS)。
使用 [新增資料行主金鑰] 對話方塊來配置啟用 enclave 的資料行主金鑰
若要佈建啟用封裝功能的資料行主金鑰,請按照使用 [新增資料行主金鑰] 對話方塊來佈建資料行主金鑰中的步驟進行操作。 請確認選取允許區塊計算。 請參閱以下的螢幕擷取畫面:
注意
只有當資料庫設定有安全記憶體保護區時,才會出現 [允許記憶體保護區計算] 核取方塊。 如果您正在使用 SQL Server,請參閱在 SQL Server 中設定安全記憶體保護區。 如果您正在使用 Azure SQL Database,請參閱為 Azure SQL Database 啟用 Always Encrypted 及安全區域。
提示
若要檢查特定欄位主索引鍵是否支持 enclaving 功能,請在 [物件總管] 中以滑鼠右鍵按一下該欄位主索引鍵,並選取[屬性]。 若金鑰已啟用加密區,視窗中便會出現 [加密區計算: 允許],此顯示金鑰的屬性。 或者,您可以使用 sys.column_master_keys (Transact-SQL) 檢視。
使用 [新增資料行加密金鑰] 選項來設定已啟用封裝區的資料行加密金鑰
請在 [新增資料行加密金鑰] 對話方塊中遵循步驟來佈建已啟用記憶體保護區的資料行加密金鑰。 選取資料行主要金鑰時,請確保它已啟用安全區功能。
提示
若要檢查資料行加密金鑰是否已啟用禁區功能,請在 [物件總管] 中以滑鼠右鍵按一下該資料行加密金鑰,並選取 [屬性]。 若金鑰啟用了安全區域,視窗中顯示金鑰屬性時,便會出現 [安全區域計算: 允許]。
使用 PowerShell 配置啟用安全區域的金鑰
若要使用 PowerShell 佈建啟用記憶體保護區的金鑰,則需要有 SqlServer PowerShell 模組版本 22 或更高版本。
一般而言,使用 PowerShell 佈建 Always Encrypted 金鑰中所描述 PowerShell 的 Always Encrypted 金鑰佈建工作流程 (搭配或不搭配角色隔離),其也適用於已啟用記憶體保護區的金鑰。 本節描述與加密區啟用的金鑰相關的特定詳細資料。
SqlServer PowerShell 模組使用 -AllowEnclaveComputations
參數擴展 New-SqlCertificateStoreColumnMasterKeySettings 和 New-SqlAzureKeyVaultColumnMasterKeySettings Cmdlet,允許您在佈建過程中指定已啟用記憶體保護區的資料行主要金鑰。 無論哪一個 Cmdlet 都會建立一個本機物件,該物件包含資料行主金鑰的屬性(此屬性儲存在 Azure Key Vault 或 Windows 憑證存放區中)。 若進行指定,-AllowEnclaveComputations
屬性便會在本機物件中將金鑰標記為已啟用記憶體保護區。 這也會使 Cmdlet 存取參考的資料行主要金鑰 (位於 Azure Key Vault 或 Windows 憑證存放區中),以對金鑰屬性進行數位簽署。 在您為啟用安全區域的資料行主金鑰建立設定物件後,您便可以在後續調用 New-SqlColumnMasterKey Cmdlet 時使用該金鑰,來建立描述資料庫中新金鑰的中繼資料物件。
佈建已啟用記憶體保護區資料行加密金鑰的過程,與佈建未啟用記憶體保護區資料行加密金鑰的過程沒有任何不同。 您只需要確認用來加密新欄位加密金鑰的欄位主金鑰已支援 enclave。
注意
SqlServer PowerShell 模組目前不支援佈建儲存在硬體安全性模組 (利用 CNG 或 CAPI) 中已啟用保護區的金鑰。
範例 - 使用 Windows 憑證存放區佈建已啟用區域技術的金鑰
以下的端對端範例展示如何配置已啟用 enclave 的金鑰,並將資料欄主金鑰儲存在 Windows 憑證存放區中。 指令碼是以不使用角色隔離的 Windows 憑證存放區 (範例) 中範例為基礎。 值得注意的是在 New-SqlCertificateStoreColumnMasterKeySettings Cmdlet 中使用了 -AllowEnclaveComputations
參數,這是兩個範例中工作流程的唯一差異。
# 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; TrustServerCertificate = 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
範例 - 使用 Azure Key Vault 佈建已啟用安全區域的金鑰
以下端對端範例會示範如何佈建啟用隔離區的金鑰,以將資料行主要金鑰儲存在 Azure Key Vault 中。 指令碼是以不使用角色隔離的 Azure Key Vault (範例) 中範例為基礎。 請務必注意已啟用記憶體保護區金鑰與未啟用記憶體保護區金鑰工作流程之間的兩項差異。
- 在以下指令碼中,New-SqlCertificateStoreColumnMasterKeySettings 使用
-AllowEnclaveComputations
參數來讓新資料行主要金鑰啟用安全區域功能。 - 以下指令碼使用 Get-AzAccessToken Cmdlet 來取得金鑰保存庫的存取權杖。 這是必要的,因為 New-SqlAzureKeyVaultColumnMasterKeySettings 需要有權存取 Azure Key Vault 才能簽署資料行主要金鑰的屬性。
# 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; TrustServerCertificate = 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
下一步
- 使用安全記憶體保護區執行 Transact-SQL 陳述式
- 使用 Always Encrypted 及安全區域直接設定資料行加密
- 為現有加密欄位啟用具有安全區域的 Always Encrypted
- 使用具有安全執行環境的 Always Encrypted 開發應用程式