Konfigurace místního šifrování sloupců pomocí PowerShellu

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Tento článek obsahuje postup nastavení cílové konfigurace Always Encrypted pro sloupce databáze pomocí rutiny Set-SqlColumnEncryption (v modulu SqlServer PowerShellu). Cmdlet Set-SqlColumnEncryption upraví jak schéma cílové databáze, tak i data uložená ve vybraných sloupcích. Data uložená ve sloupci je možné zašifrovat, znovu zašifrovat nebo dešifrovat v závislosti na zadaném nastavení šifrování pro sloupce a aktuální konfiguraci šifrování. Pokud chcete aktivovat kryptografické operace na místě pomocí enklávy, Set-SqlColumnEncryption musí používat připojení k databázi vytvořené pomocí připojovacího řetězce s Attestation Protocol a volitelně i klíčová slova URL pro ověření identity.

Požadavky

Pokud chcete nastavit cílovou konfiguraci šifrování, musíte se ujistit, že:

  • Šifrovací klíč sloupce s povolením enklávy je nakonfigurovaný v databázi (pokud šifrujete nebo znovu šifrujete sloupec). Podrobnosti najdete v tématu Správa klíčů pro Always Encrypted se zabezpečenou enklávou.
  • jste připojení k databázi s povolenou funkcí Always Encrypted a vlastnostmi ověření identity zadanými v připojovacím řetězci.
  • Ke hlavnímu klíči sloupce pro každý sloupec, který chcete šifrovat, znovu zašifrovat nebo dešifrovat, můžete přistupovat z počítače, na kterém běží rutiny PowerShellu.
  • používáte modul SqlServer PowerShell verze 22.0.50 nebo novější. Pro místní online šifrování použijte modul SqlServer PowerShell verze 22.3.0 nebo novější.

Poznámka:

Microsoft doporučuje používat PowerShell 7 nebo novější při spouštění skriptů PowerShellu Always Encrypted. PowerShell 7 poskytuje vylepšenou podporu pro různé platformy, lepší výkon a nejnovější kompatibilitu s modulem SqlServer (v22+), který je nutný pro mnoho scénářů Always Encrypted.

Důležité informace o zabezpečení

Rutina Set-SqlColumnEncryption, která slouží ke konfiguraci šifrování sloupců databáze, zpracovává klíče Always Encrypted i data uložená ve sloupcích databáze. Proto je klíčové spustit cmdlet na zabezpečeném počítači. Pokud je vaše databáze v SQL Serveru, spusťte rutinu z jiného počítače, než je počítač hostující instanci SQL Serveru. Vzhledem k tomu, že primárním cílem funkce Always Encrypted je zajistit, aby šifrovaná citlivá data byla v bezpečí i v případě ohrožení databázového systému, spuštění skriptu PowerShellu, který zpracovává klíče nebo citlivá data na počítači s SQL Serverem, může snížit nebo porazit výhody této funkce.

Úkol Článek Přístup ke klíčům nebo úložišti klíčů ve formátu prostého textu Přístup k databázi
Krok 1. Spusťte prostředí PowerShell a naimportujte modul SqlServer. Import modulu SqlServer Ne Ne
Krok 2. Připojení k serveru a databázi Připojení k databázi Ne Ano
Krok 3. Ověřte se v Azure, jestli je váš hlavní klíč sloupce (chránící šifrovací klíč sloupce, který se má rotovat) uložen v Azure Key Vault. Connect-AzAccount Ano Ne
Krok 4. Získejte přístupový token pro služby Azure Key Vault. Get-AzAccessToken Ne Ne
Krok 5. Vytvořte pole objektů SqlColumnEncryptionSettings – jeden pro každý sloupec databáze, který chcete zašifrovat, znovu zašifrovat nebo dešifrovat. SqlColumnMasterKeySettings je objekt, který existuje v paměti (v PowerShellu). Určuje cílové schéma šifrování pro sloupec. New-SqlColumnEncryptionSettings Ne Ne
Krok 6. Nastavte požadovanou konfiguraci šifrování zadanou v poli objektů SqlColumnMasterKeySettings, které jste vytvořili v předchozím kroku. Sloupec se šifruje, znovu zašifruje nebo dešifruje v závislosti na zadaných cílových nastaveních a aktuální konfiguraci šifrování sloupce. Set-SqlColumnEncryption

Poznámka: Tento krok může trvat delší dobu. Vaše aplikace nemají přístup k tabulkám prostřednictvím celé operace nebo jeho části v závislosti na přístupu (online nebo offline), který vyberete.
Ano Ano

Šifrování sloupců pomocí enkláv VBS

Následující příklad ukazuje nastavení konfigurace cílového šifrování pro několik sloupců. Pokud některý ze sloupců ještě není zašifrovaný, zašifruje se. Pokud je některý sloupec už šifrovaný pomocí jiného klíče nebo jiného typu šifrování, dešifruje se a pak se znovu zašifruje zadaným cílovým klíčem nebo typem. Enklávy VBS v současné době nepodporují ověření identity. Parametr EnclaveAttestationProtocol by měl být nastavený na None a enclaveAttestationUrl není povinný.

# 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.'

Dešifrování sloupců – příklad

Následující příklad ukazuje, jak dešifrovat všechny sloupce, které jsou aktuálně šifrované v databázi.

# 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

Šifrování sloupců pomocí enkláv SGX

Následující příklad ukazuje nastavení konfigurace cílového šifrování pro několik sloupců. Pokud některý ze sloupců ještě není zašifrovaný, zašifruje se. Pokud je některý sloupec už šifrovaný pomocí jiného klíče nebo jiného typu šifrování, dešifruje se a pak se znovu zašifruje zadaným cílovým klíčem nebo typem. K aktivaci místních kryptografických operací pomocí enklávy se vyžadují parametry EnclaveAttestationProtocol a EnclaveAttestationUrl.

Important

Always Encrypted with Intel Software Guard Extensions (Intel SGX) enclaves končí s podporou 31. října 2027. Migrujte postižené databáze před tímto datem. Po 31. říjnu 2027 Azure automaticky přesune jakoukoli databázi, která zůstane na výpočetní úrovni řady DC, do podporované úrovně standardních řad (non-DC) a umožní bezpečnostní enklávy založené na virtualizaci (VBS). Pro možnosti migrace viz průvodce migrací Always Encrypted with Intel SGX Enclaves.

# 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.' 

Dešifrování sloupců – příklad

Následující příklad ukazuje, jak dešifrovat všechny sloupce, které jsou aktuálně šifrované v databázi.

# 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

Další krok