Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
В этой статье описаны шаги по настройке целевой конфигурации постоянного шифрования для столбцов базы данных с помощью командлета Set-SqlColumnEncryption (в модуле SqlServer PowerShell). Командлет Set-SqlColumnEncryption изменяет схему целевой базы данных и данные, хранящиеся в выбранных столбцах. В зависимости от целевых параметров шифрования, указанных для столбцов и текущей конфигурации шифрования, хранимые в столбце данные могут быть зашифрованы, повторно зашифрованы или расшифрованы. Чтобы активировать криптографические операции непосредственно, используя анкла́в, Set-SqlColumnEncryption должен использовать подключение к базе данных, созданное с помощью строки подключения с протоколом аттестации и, при необходимости, с ключевыми словами для URL-адреса аттестации.
Необходимые условия
Чтобы задать целевую конфигурацию шифрования, необходимо выполнить следующие условия:
- Ключ шифрования столбцов с поддержкой анклава конфигурируется в базе данных (если вы шифруете или повторно шифруете столбец). Дополнительные сведения см. в разделе "Управление ключами для Always Encrypted с безопасными анклавами".
- Вы подключены к базе данных с включенной Always Encrypted и свойствами аттестации, указанными в строке подключения.
- вы можете получить доступ к главному ключу столбца для каждого столбца, который вы хотите зашифровать, повторно зашифровать или расшифровать, на компьютере, с которого выполняются командлеты PowerShell.
- вы используете модуль SqlServer PowerShell версии 22.0.50 или более поздней версии. Для шифрования на месте используется модуль SqlServer PowerShell версии 22.3.0 или более поздней версии.
Note
Microsoft рекомендует использовать PowerShell 7 или более поздней версии при выполнении скриптов PowerShell always Encrypted. PowerShell 7 обеспечивает улучшенную кроссплатформенную поддержку, более высокую производительность и последнюю совместимость с модулем SqlServer (версии 22+), который необходим для многих сценариев Always Encrypted.
Соображения безопасности
Командлет Set-SqlColumnEncryption , используемый для настройки шифрования столбцов базы данных, обрабатывает ключи постоянного шифрования и данные, хранящиеся в столбцах базы данных. Поэтому командлет нужно запускать на защищенном компьютере. Если ваша база данных размещена на сервере SQL Server, командлет нужно запускать на другом компьютере, отличном от компьютера с инстанцией SQL Server. Поскольку основной задачей функции постоянного шифрования является обеспечение целостности зашифрованных конфиденциальных данных даже в случае нарушения безопасности системы базы данных, выполнение скрипта PowerShell, обрабатывающего ключи или конфиденциальные данные на сервере SQL Server, может снизить или вообще отменить эффект действия функции.
| Задача | Статья | Доступ к ключам с открытым текстом или хранилищу ключей | Доступ к базе данных |
|---|---|---|---|
| Шаг 1. Запуск среды PowerShell и импорт модуля SqlServer. | Импорт модуля SqlServer | Нет | Нет |
| Шаг 2. Соединение с сервером и базой данных | Подключение к базе данных | Нет | Да |
| Шаг 3. Пройдите аутентификацию в Azure, если главный ключ столбца (который защищает ключ шифрования и подлежит ротации) хранится в Azure Key Vault. | Connect-AzAccount | Да | Нет |
| Шаг 4. Получите маркер доступа для Azure Key Vaults. | Get-AzAccessToken | Нет | Нет |
| Шаг 5. Создание массива объектов SqlColumnEncryptionSettings — по одному для каждого столбца базы данных, который требуется зашифровать, повторно зашифровать или расшифровать. SqlColumnMasterKeySettings — это объект, который существует в памяти (PowerShell). Он определяет целевую схему шифрования столбца. | New-SqlColumnEncryptionSettings (Создать настройки шифрования столбцов SQL) | Нет | Нет |
| Шаг 6. Настройте нужную конфигурацию шифрования, указанную в массиве объектов SqlColumnMasterKeySettings, созданном на предыдущем шаге. Столбец шифруется, повторно шифруется или расшифровывается в зависимости от указанных параметров целевого объекта и текущей конфигурации шифрования столбца. |
Set-SqlColumnEncryption Примечание: Этот шаг может занять много времени. Ваши приложения не смогут получить доступ к таблицам на протяжении всей операции или её части в зависимости от выбранного вами подхода (в сети или в автономном режиме). |
Да | Да |
Шифрование столбцов с помощью анклавов VBS
В примере ниже показано, как задать целевую конфигурацию шифрования для нескольких столбцов. Если какой-либо столбец не зашифрован, он будет зашифрован. Если какой-либо столбец уже зашифрован с помощью другого ключа и (или) другого типа шифрования, он будет расшифрован и повторно зашифрован с помощью указанного целевого ключа или типа шифрования. В настоящее время анклавы VBS не поддерживают аттестацию. Параметр EnclaveAttestationProtocol должен иметь значение None , а enclaveAttestationUrl не требуется.
# Import modules
Import-Module SqlServer
Import-Module Az.Accounts
# Edit these values.
$serverName = '<your-server>.database.windows.net'
$databaseName = 'ContosoHR'
$cekName = 'CEK'
$subscriptionId = '<your-subscription-id>'
# Columns to encrypt with the CEK.
$columnsToEncrypt = @(
'dbo.Employees.SSN',
'dbo.Employees.Salary'
)
# Sign in with Microsoft Entra and select subscription.
Connect-AzAccount
Set-AzContext -SubscriptionId $subscriptionId
# Token needed when CEK uses Azure Key Vault CMK.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl 'https://vault.azure.net').Token
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Build encryption settings for target columns.
$columnEncryptionSettings = @(
$columnsToEncrypt | ForEach-Object {
New-SqlColumnEncryptionSettings -ColumnName $_ -EncryptionType Randomized -EncryptionKey $cekName
}
)
# Encrypt or re-encrypt the columns.
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $columnEncryptionSettings -EnclaveAttestationProtocol None -LogFileDirectory . -KeyVaultAccessToken $keyVaultAccessToken
Write-Host 'Done.'
Расшифровка столбцов — пример
В примере ниже показано, как расшифровать все столбцы, которые на данный момент зашифрованы в базе данных.
# Import modules
Import-Module SqlServer -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
#Connect to Azure
Connect-AzAccount
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Find all encrypted columns, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$tables = $database.Tables
for($i=0; $i -lt $tables.Count; $i++){
$columns = $tables[$i].Columns
for($j=0; $j -lt $columns.Count; $j++) {
if($columns[$j].isEncrypted) {
$threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name
$ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType "Plaintext"
}
}
}
# Decrypt all columns.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -LogFileDirectory . -EnclaveAttestationProtocol "None" -KeyVaultAccessToken $keyVaultAccessToken
Шифрование столбцов с помощью анклавов SGX
В примере ниже показано, как задать целевую конфигурацию шифрования для нескольких столбцов. Если какой-либо столбец не зашифрован, он будет зашифрован. Если какой-либо столбец уже зашифрован с помощью другого ключа и (или) другого типа шифрования, он будет расшифрован и повторно зашифрован с помощью указанного целевого ключа или типа шифрования. Чтобы активировать криптографические операции на месте с помощью анклава, требуются параметры EnclaveAttestationProtocol и EnclaveAttestationUrl.
# Import modules
Import-Module SqlServer
Import-Module Az.Accounts
# Edit these values.
$serverName = '<your-server>.database.windows.net'
$databaseName = 'ContosoHR'
$cekName = 'CEK'
$subscriptionId = '<your-subscription-id>'
# Columns to encrypt with the CEK.
$columnsToEncrypt = @(
'dbo.Employees.SSN',
'dbo.Employees.Salary'
)
# Sign in with Microsoft Entra and select subscription.
Connect-AzAccount
Set-AzContext -SubscriptionId $subscriptionId
# Token needed when CEK uses Azure Key Vault CMK.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl 'https://vault.azure.net').Token
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Build encryption settings for target columns.
$columnEncryptionSettings = @(
$columnsToEncrypt | ForEach-Object {
New-SqlColumnEncryptionSettings -ColumnName $_ -EncryptionType Randomized -EncryptionKey $cekName
}
)
# Encrypt or re-encrypt the columns.
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $columnEncryptionSettings -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>" -KeyVaultAccessToken $keyVaultAccessToken -LogFileDirectory .
Write-Host 'Done.'
Расшифровка столбцов — пример
В примере ниже показано, как расшифровать все столбцы, которые на данный момент зашифрованы в базе данных.
# Import modules
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
#Connect to Azure
Connect-AzAccount
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Find all encrypted columns, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$tables = $database.Tables
for($i=0; $i -lt $tables.Count; $i++){
$columns = $tables[$i].Columns
for($j=0; $j -lt $columns.Count; $j++) {
if($columns[$j].isEncrypted) {
$threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name
$ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType "Plaintext"
}
}
}
# Decrypt all columns.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -LogFileDirectory . -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>" -KeyVaultAccessToken $keyVaultAccessToken