Подготовка ключей Always Encrypted с помощью PowerShell
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр 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 | Да | Нет |
Шаг 2. Запуск среды PowerShell и импорт модуля SqlServer. | Настройка постоянного шифрования с помощью PowerShell | Нет | Нет |
Шаг 3. Соединение с сервером и базой данных. | Соединение с базой данных | Нет | Да |
Шаг 4. Создание объекта SqlColumnMasterKeySettings , содержащего сведения о расположении главного ключа столбца. SqlColumnMasterKeySettings — это объект, который существует в памяти (PowerShell). Используйте командлет, специфичный для вашего хранилища ключей. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Нет | Нет |
Шаг 5. Создание метаданных о главном ключе столбца в базе данных. |
New-SqlColumnMasterKey Примечание. На самом деле для создания метаданных ключа командлет выполняет инструкцию CREATE COLUMN MASTER KEY (Transact-SQL) . |
Нет | Да |
Шаг 6. Авторизуйтесь в Azure, если ваш главный ключ столбца хранится в хранилище ключей Azure. | Connect-AzAccount | Да | Нет |
Шаг 7. Получите токен доступа для Azure Key Vaults, если главный ключ столбца хранится в Azure Key Vault. | Get-AzAccessToken | Нет | Нет |
Шаг 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
Назначение ключей с разделением ролей
В этом разделе описано, как настроить шифрование, когда у администраторов безопасности нет доступа к базе данных, а у администраторов баз данных — доступа к хранилищу ключей или ключам с обычным текстом.
Администратор безопасности
Перед выполнением действий, предполагающих доступ к ключам с открытым текстом или хранилищу ключей (определены в столбце Доступ к ключам с открытым текстом или хранилищу ключей в таблице ниже), убедитесь, что выполнены указанные далее условия.
- Среда PowerShell используется на защищенном компьютере (и не на компьютере с базой данных).
- Администраторы баз данных в вашей организации не имеют доступа к компьютеру (что противоречило бы концепции разделения ролей).
Дополнительные сведения см. в разделе Security Considerations for Key Management(Вопросы безопасности для управления ключами).
Задача | Статья | Доступ к ключам с открытым текстом или хранилищу ключей | Доступ к базе данных |
---|---|---|---|
Шаг 1. Создайте главный ключ столбца в хранилище ключей. Примечание. Модуль SqlServer не поддерживает этот шаг. Для выполнения этой задачи из командной строки используйте средства, поддерживаемые выбранным хранилищем ключей. |
Создание и хранение главных ключей столбцов для Always Encrypted | Да | Нет |
Шаг 2. Запуск сеанса PowerShell и импорт модуля SqlServer. | Импорт модуля SqlServer | Нет | Нет |
Шаг 3. Создание объекта SqlColumnMasterKeySettings , содержащего сведения о расположении главного ключа столбца. SqlColumnMasterKeySettings — это объект, который существует в памяти (PowerShell). Используйте командлет, специфичный для вашего хранилища ключей. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Нет | Нет |
Шаг 4. Выполните аутентификацию в Azure, если ваш главный ключ столбца хранится в хранилище ключей Azure. | Connect-AzAccount | Да | Нет |
Шаг 5. Получите токен доступа для Azure Key Vaults, если ваш главный ключ столбца хранится в Azure Key Vault. | Get-AzAccessToken | Нет | Нет |
Шаг 6. Создайте ключ шифрования столбца, зашифруйте его с помощью главного ключа столбца, чтобы получить зашифрованное значение ключа шифрования столбца. | New-SqlColumnEncryptionKeyEncryptedValue | Да | Нет |
Шаг 7. Предоставьте администратору баз данных информацию о расположении главного ключа столбца (имя поставщика и путь к главному ключу столбца) и зашифрованное значение ключа шифрования столбца. | См. следующие примеры. | Нет | Нет |
Администратор баз данных
Базы данных используют сведения, полученные администратором безопасности (шаг 7 выше), для создания метаданных ключа Always Encrypted в базе данных и управления ими.
Задача | Статья | Доступ к ключам с открытым текстом | Доступ к базе данных |
---|---|---|---|
Шаг 1. Получите у администратора безопасности расположение основного ключа столбца и зашифрованное значение ключа шифрования столбца. | См. следующие примеры. | Нет | Нет |
Шаг 2. Запуск среды PowerShell и импорт модуля SqlServer. | Настройка постоянного шифрования с помощью PowerShell | Нет | Нет |
Шаг 3. Соединение с сервером и базой данных. | Соединение с базой данных | Нет | Да |
Шаг 4. Создание объекта SqlColumnMasterKeySettings, содержащего сведения о расположении главного ключа столбца. SqlColumnMasterKeySettings — это объект, который существует в памяти. | New-SqlColumnMasterKeySettings | Нет | Нет |
Шаг 5. Создание метаданных о главном ключе столбца в базе данных. |
New-SqlColumnMasterKey Примечание: В фоновом режиме командлет выполняет инструкцию CREATE COLUMN MASTER KEY (Transact-SQL) для создания метаданных главного ключа столбца. |
Нет | Да |
Шаг 6. Создание метаданных ключа шифрования столбца в базе данных. | New-SqlColumnEncryptionKey Примечание. Администраторы баз данных используют разновидность командлета, который создает только метаданные ключа шифрования столбца. В фоновом режиме командлет выполняет инструкцию CREATE COLUMN ENCRYPTION KEY (Transact-SQL) для создания метаданных ключа шифрования столбца. |
Нет | Да |
Хранилище сертификатов 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
Следующие шаги
- Настройка шифрования столбцов с помощью Always Encrypted с PowerShell
- Смена ключей Always Encrypted с помощью PowerShell
- Разработка приложений с помощью Always Encrypted
См. также
- Always Encrypted
- Общие сведения об управлении ключами для Always Encrypted
- Создание и хранение основных ключей столбцов для Always Encrypted
- Настройка постоянного шифрования с помощью PowerShell
- Настройка ключей Always Encrypted с помощью SQL Server Management Studio
- CREATE COLUMN MASTER KEY (Transact-SQL)
- DROP COLUMN MASTER KEY (Transact-SQL)
- СОЗДАНИЕ КЛЮЧА ШИФРОВАНИЯ СТОЛБЦА (Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY (Transact-SQL)
- DROP COLUMN ENCRYPTION KEY (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sys.column_encryption_keys (Transact-SQL)