Sdílet prostřednictvím


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ší.

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 5. Nastavte požadovanou konfiguraci šifrování zadanou v poli objektů SqlColumnMasterKeySettings, které jste vytvořili v předchozím kroku. Sloupec se zaš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 dlouhou dobu. Vaše aplikace nebudou mít 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" -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 = "<servername>.database.windows.net"
$databaseName = "<DatabaseName>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + ";  Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Encrypt the selected columns (or re-encrypt, if they are already encrypted using keys/encrypt types, different than the specified keys/types.
$ces = @() 
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.SSN" -EncryptionType "Randomized" -EncryptionKey "CEK" 
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.Salary" -EncryptionType "Randomized" -EncryptionKey "CEK" 
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory . -EnclaveAttestationProtocol "None" -KeyVaultAccessToken $keyVaultAccessToken

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>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$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.

# 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 = "<servername>.database.windows.net"
$databaseName = "<DatabaseName>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + ";  Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Encrypt the selected columns (or re-encrypt, if they are already encrypted using keys/encrypt types, different than the specified keys/types.
$ces = @() 
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.SSN" -EncryptionType "Randomized" -EncryptionKey "CEK" 
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.Salary" -EncryptionType "Randomized" -EncryptionKey "CEK" 
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory . -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>"   -KeyVaultAccessToken $keyVaultAccessToken

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>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$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ší kroky

Viz také