Настройка шифрования столбцов на месте с помощью PowerShell

Область применения: 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

Следующий шаг