Поделиться через


Предоставление ключей, поддерживающих анклав

Применимо к: SQL Server 2019 (15.x) и более поздних версий в Базе данных SQL Windows Azure

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

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

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

Разрешить вычисления в анклаве

Примечание.

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

Tip

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

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

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

Tip

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

Настройка ключей, которые поддерживают анклав, с помощью 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; 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 для получения токена доступа для ключевых хранилищ. Это необходимо, потому что 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