Подготовка ключей Always Encrypted с помощью PowerShell

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру SQL Azure

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

Обзор процесса управления ключами Always Encrypted, включая некоторые общие рекомендации, см. в разделе Общие сведения об управлении ключами для Always Encrypted. Сведения о начале работы с модулем SqlServer PowerShell для постоянного шифрования см. в разделе Configure Always Encrypted using PowerShell(Настройка постоянного шифрования с помощью PowerShell).

Подготовка ключей без разделения ролей

В описанном здесь способе подготовки ключей не поддерживается разделение ролей между администраторами безопасности и администраторами баз данных. В некоторых шагах операции с физическими ключами объединены с операциями с метаданными ключей. Таким образом, этот метод подготовки ключей рекомендуется для организаций, использующих модель разработки и операций, или если база данных размещается в облаке и основная цель заключается в ограничении доступа администраторов облака (но не локальных администраторов баз данных) к конфиденциальным данным. Этот метод не рекомендуется использовать, если администраторы баз данных являются потенциальными злоумышленниками или они не должны иметь доступ к конфиденциальным данным.

Перед выполнением действий, связанных с доступом к ключам с открытым текстом или хранилищу ключей (определены в столбце Доступ к ключам с открытым текстом или хранилищу ключей в таблице ниже), убедитесь, что среда PowerShell запущена на защищенном компьютере, отличном от компьютера с базой данных. Дополнительные сведения см. в разделе Security Considerations for Key Management(Вопросы безопасности для управления ключами).

Задача Статья Доступ к ключам с открытым текстом или хранилищу ключей Доступ к базе данных
Шаг 1. Создание главного ключа столбца в хранилище ключей.

Примечание. Модуль SqlServer PowerShell не поддерживает этот шаг. Для выполнения этой задачи из командной строки используйте средства, поддерживаемые выбранным хранилищем ключей.
Создание и хранение главных ключей столбцов для Always Encrypted Да No
Шаг 2. Запуск среды PowerShell и импорт модуля SqlServer. Настройка постоянного шифрования с помощью PowerShell No No
Шаг 3. Соединение с сервером и базой данных. Соединение с базой данных No Да
Шаг 4. Создание объекта SqlColumnMasterKeySettings , содержащего сведения о расположении главного ключа столбца. SqlColumnMasterKeySettings — это объект, который существует в памяти (PowerShell). Используйте командлет, поддерживаемый хранилищем ключей. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
No No
Шаг 5. Создание метаданных о главном ключе столбца в базе данных. New-SqlColumnMasterKey

Примечание. На самом деле для создания метаданных ключа командлет выполняет инструкцию CREATE COLUMN MASTER KEY (Transact-SQL) .
No Да
Шаг 6. Проверка подлинности в Azure, если главный ключ столбца хранится в хранилище ключей Azure. Connect-AzAccount Да No
Шаг 7. Получите маркер доступа для Azure Key Vault, если главный ключ столбца хранится в Azure Key Vault. Get-AzAccessToken No No
Шаг 8. Создание ключа шифрования столбца, его шифрование с помощью главного ключа столбца и создание метаданных ключа шифрования столбца в базе данных. New-SqlColumnEncryptionKey

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

Примечание. На самом деле для создания метаданных ключа командлет выполняет инструкцию CREATE COLUMN ENCRYPTION KEY (Transact-SQL) .
Да Да

Хранилище сертификатов Windows без разделения ролей (пример)

Этот скрипт — законченный пример создания главного ключа столбца, который является сертификатом в хранилище сертификатов Windows, создания и шифрования ключа шифрования столбца и создания метаданных ключа в базе данных 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"
$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

Хранилище ключей Azure без разделения ролей (пример)

Этот сценарий является законченным примером подготовки и настройки хранилища ключей в Azure Key Vault, создания главного ключа столбца в хранилище, создания и шифрования ключа шифрования столбца и создания метаданных ключа в базе данных Azure SQL.

# 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"
$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 без разделения ролей (пример)

Этот скрипт является законченным примером создания главного ключа столбца в хранилище ключей, реализующем API CNG, создания и шифрования ключа шифрования столбца и создания метаданных ключа в базе данных SQL Server.

В примере используется хранилище ключей с ПО поставщика хранилища ключей Microsoft Software Key Storage Provider. Этот пример можно изменить для использования другого хранилища, например аппаратного модуля безопасности. Для этого необходимо надлежащим образом установить и запустить на компьютере поставщик хранилища ключей (KSP), реализующий CNG. Необходимо заменить Microsoft Software Key Storage Provider именем KSP вашего устройства.

# 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"
$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

Подготовка ключей с разделением ролей

В этом разделе описано, как настроить шифрование, когда у администраторов безопасности нет доступа к базе данных, а у администраторов баз данных — доступа к хранилищу ключей или ключам с обычным текстом.

Администратор безопасности

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

  1. Среда PowerShell используется на защищенном компьютере (и не на компьютере с базой данных).
  2. Администраторы баз данных в вашей организации не имеют доступа к компьютеру (что противоречило бы концепции разделения ролей).

Дополнительные сведения см. в разделе Security Considerations for Key Management(Вопросы безопасности для управления ключами).

Задача Статья Доступ к ключам с открытым текстом или хранилищу ключей Доступ к базе данных
Шаг 1. Создание главного ключа столбца в хранилище ключей.

Примечание. Модуль SqlServer не поддерживает этот шаг. Для выполнения этой задачи из командной строки используйте средства, поддерживаемые выбранным хранилищем ключей.
Создание и хранение главных ключей столбцов для Always Encrypted Да No
Шаг 2. Запуск сеанса PowerShell и импорт модуля SqlServer. Импорт модуля SqlServer No No
Шаг 3. Создание объекта SqlColumnMasterKeySettings , содержащего сведения о расположении главного ключа столбца. SqlColumnMasterKeySettings — это объект, который существует в памяти (PowerShell). Используйте командлет, поддерживаемый хранилищем ключей. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
No No
Шаг 4. Проверка подлинности в Azure, если главный ключ столбца хранится в хранилище ключей Azure. Connect-AzAccount Да No
Шаг 5. Получите маркер доступа для Azure Key Vault, если главный ключ столбца хранится в Azure Key Vault. Get-AzAccessToken No No
Шаг 6. Создание ключа шифрования столбца, его шифрование с помощью главного ключа столбца для формирования зашифрованного значения ключа шифрования столбца. New-SqlColumnEncryptionKeyEncryptedValue Да No
Шаг 7. Предоставление администратору баз данных информации о расположении главного ключа столбца (имени поставщика и пути к главному ключу столбца) и зашифрованного значения ключа шифрования. См. следующие примеры. No No

Администратор баз данных

Базы данных используют сведения, полученные администратором безопасности (шаг 7 выше), для создания метаданных ключа Always Encrypted в базе данных и управления ими.

Задача Статья Доступ к ключам с открытым текстом Доступ к базе данных
Шаг 1. Получение расположения главного ключа столбца и зашифрованного значения ключа шифрования столбца от администратора безопасности. См. следующие примеры. No No
Шаг 2. Запуск среды PowerShell и импорт модуля SqlServer. Настройка постоянного шифрования с помощью PowerShell No No
Шаг 3. Соединение с сервером и базой данных. Соединение с базой данных No Да
Шаг 4. Создание объекта SqlColumnMasterKeySettings, содержащего сведения о расположении главного ключа столбца. SqlColumnMasterKeySettings — это объект, который существует в памяти. New-SqlColumnMasterKeySettings No No
Шаг 5. Создание метаданных о главном ключе столбца в базе данных. New-SqlColumnMasterKey
Примечание. На самом деле для создания метаданных главного ключа столбца командлет выполняет инструкцию CREATE COLUMN MASTER KEY (Transact-SQL) .
No Да
Шаг 6. Создание метаданных ключа шифрования столбца в базе данных. New-SqlColumnEncryptionKey
Примечание. Администраторы баз данных используют разновидность командлета, который создает только метаданные ключа шифрования столбца.
На самом деле для создания метаданных ключа шифрования столбца командлет выполняет инструкцию CREATE COLUMN ENCRYPTION KEY (Transact-SQL) .
No Да

Хранилище сертификатов Windows с разделением ролей (пример)

Администратор безопасности

# 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 

Администратор баз данных

# 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"
$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

Дальнейшие действия

См. также