Подготовка ключей с поддержкой анклава

Область применения: SQL Server 2019 (15.x) и более поздних версий — только база данных SQL Azure Для Windows

В этой статье описывается подготовка ключей с поддержкой анклава, которые поддерживают вычисления в безопасных анклавах на стороне сервера, используемых для 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 также позволяет создать главный ключ столбца с поддержкой анклава и ключ шифрования столбцов с поддержкой анклава.

Убедитесь, что установлена последняя общедоступная версия SQL Server Management Studio (SSMS).

Подготовка главных ключей столбцов с поддержкой анклава с помощью диалогового окна "Новый главный ключ столбца"

Чтобы подготовить главный ключ столбца с поддержкой анклава, выполните действия, описанные в разделе Подготовка главных ключей столбцов с помощью диалогового окна "Новый главный ключ столбца". Установите флажок Разрешить вычисления анклава. См. снимок экрана ниже.

Allow enclave computations

Заметка

Флажок Разрешить вычисления анклава отображается только в случае, если для базы данных настроен безопасный анклав. Если вы используете SQL Server, см. статью "Настройка безопасного анклава в SQL Server". Если вы используете базу данных SQL Azure, см. раздел "Включить Always Encrypted с безопасными анклавами" для базы данных SQL Azure.

Совет

Чтобы проверить, поддерживает ли главный ключ столбца анклав, щелкните его правой кнопкой мыши в обозревателе объектов и выберите пункт Свойства. Если ключ включен, анклав вычисления: разрешено отображается в окне со свойствами ключа. Или можно использовать представление sys.column_master_keys (Transact-SQL).

Подготовка ключей шифрования столбцов с поддержкой анклава с помощью диалогового окна "Новый ключ шифрования столбца"

Чтобы подготовить ключ шифрования столбца с поддержкой анклава, выполните действия, описанные в разделе Подготовка ключей шифрования столбцов с помощью диалогового окна "Новый ключ шифрования столбца". При выборе главного ключа столбца убедитесь, что он поддерживает анклав.

Совет

Чтобы проверить, поддерживает ли ключ шифрования столбца анклав, щелкните его правой кнопкой мыши в обозревателе объектов и выберите пункт Свойства. Если ключ включен, анклав вычисления: разрешено отображается в окне со свойствами ключа.

Подготовка ключей с поддержкой анклава с помощью PowerShell

Чтобы подготовить ключи с поддержкой анклава с помощью PowerShell, вам потребуется модуль SqlServer PowerShell версии 22 или более поздней.

Как правило, в подготовке ключей с поддержкой анклава задействованы рабочие процессы подготовки ключей PowerShell (с разделением и без разделения ролей) для Always Encrypted, описанные в статье Подготовка ключей Always Encrypted с помощью PowerShell. В этом разделе приводятся конкретные сведения, касающиеся ключей с поддержкой анклава.

Модуль SqlServer PowerShell расширяет функциональность командлетов New-SqlCertificateStoreColumnMasterKeySettings и New-SqlAzureKeyVaultColumnMasterKeySettings за счет параметра -AllowEnclaveComputations, позволяющего указывать главный ключ столбца с поддержкой анклава в ходе процесса подготовки. Каждый командлет создает локальный объект, содержащий свойства главного ключа столбца (хранящегося в Azure Key Vault или в хранилище сертификатов Windows). Если указано, свойство -AllowEnclaveComputations помечает ключ как поддерживающий анклав в локальном объекте. Кроме того, командлет обращается к указанному главному ключу столбца (в Azure Key Vault или хранилище сертификатов Windows) для добавления цифровой подписи к свойствам ключа. Созданный объект параметров для нового главного ключа столбца с поддержкой анклава можно использовать в последующем вызове командлета New-SqlColumnMasterKey для создания объекта метаданных, описывающего новый ключ в базе данных.

Ключи шифрования столбцов с поддержкой анклавов не отличаются от ключей шифрования столбцов подготовки, которые не включены в анклава. Просто необходимо убедиться, что главный ключ столбца, используемый для шифрования нового ключа шифрования столбца, поддерживает анклав.

Заметка

Сейчас модуль SqlServer PowerShell не поддерживает подготовку ключей с поддержкой анклава, хранящихся в аппаратных модулях безопасности (использующих CNG или CAPI).

Пример: подготовка ключей с поддержкой анклава с помощью хранилище сертификатов Windows

В приведенном ниже законченном примере демонстрируется подготовка ключей с поддержкой анклава с сохранением главного ключа столбца, хранящегося в хранилище сертификатов Windows. В основе сценария лежит пример из раздела Хранилище сертификатов Windows без разделения ролей (пример). Обратите внимание на использование параметра -AllowEnclaveComputations в командлете New-SqlCertificateStoreColumnMasterKeySettings — это единственное различие между рабочими процессами в двух примерах.

# 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

Пример: подготовка ключей с поддержкой анклава с помощью Azure Key Vault

В приведенном ниже законченном примере демонстрируется подготовка ключей с поддержкой анклава с сохранением главного ключа столбца в хранилище ключей в Azure Key Vault. В основе сценария лежит пример из раздела Azure Key Vault без разделения ролей (пример). Важно отметить два различия между рабочим процессом для ключей с поддержкой анклава по сравнению с ключами, которые не включены в анклава.

  • В приведенном ниже сценарии командлет New-SqlCertificateStoreColumnMasterKeySettings использует параметр -AllowEnclaveComputations для создания главного ключа столбца с поддержкой анклава.
  • Приведенный ниже скрипт использует командлет Get-AzAccessToken для получения маркера доступа для хранилищ ключей. Это необходимо, так как для подписывания свойств главного ключа столбца необходимо иметь доступ к New-SqlAzureKeyVaultColumnMasterKeySettings .
# 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

Далее

См. также