Udostępnij za pośrednictwem


Konfiguracja szyfrowania kolumn bezpośrednio za pomocą programu PowerShell

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

W tym artykule przedstawiono kroki ustawiania docelowej konfiguracji funkcji Always Encrypted dla kolumn bazy danych przy użyciu polecenia cmdlet Set-SqlColumnEncryption (w module SqlServer PowerShell). Polecenie cmdlet Set-SqlColumnEncryption modyfikuje zarówno schemat docelowej bazy danych, jak i dane przechowywane w wybranych kolumnach. Dane przechowywane w kolumnie mogą być szyfrowane, ponownie szyfrowane lub odszyfrowywane w zależności od określonych docelowych ustawień szyfrowania dla kolumn i bieżącej konfiguracji szyfrowania. Aby wywołać operacje kryptograficzne w miejscu przy użyciu enklawy, Set-SqlColumnEncryption musi użyć połączenia z bazą danych utworzonego za pomocą ciągu połączenia z protokołem zaświadczania i opcjonalnie słowami kluczowymi adresu URL zaświadczania.

Warunki wstępne

Aby ustawić docelową konfigurację szyfrowania, należy upewnić się, że:

  • Klucz szyfrowania kolumn obsługujący enklawę jest skonfigurowany w bazie danych (jeśli szyfrujesz lub ponownie szyfrujesz kolumnę). Aby uzyskać szczegółowe informacje, zobacz Zarządzanie kluczami dla Always Encrypted z bezpiecznymi enklawami.
  • Nawiązano połączenie z bazą danych z włączoną funkcją Always Encrypted i właściwościami zaświadczania określonymi w parametrach połączenia.
  • Dostęp do klucza głównego kolumny dla każdej kolumny, którą chcesz zaszyfrować, ponownie zaszyfrować lub odszyfrować, możesz uzyskać z komputera z uruchomionymi poleceniami cmdlet programu PowerShell.
  • używasz modułu SqlServer PowerShell w wersji 22.0.50 lub nowszej. W przypadku szyfrowania online w miejscu użyj modułu SqlServer PowerShell w wersji 22.3.0 lub nowszej.

Zagadnienia dotyczące zabezpieczeń

Polecenie cmdlet Set-SqlColumnEncryption służące do konfigurowania szyfrowania kolumn bazy danych, obsługuje zarówno klucze Always Encrypted, jak i dane przechowywane w kolumnach bazy danych. Dlatego ważne jest, aby uruchamiać polecenie „cmdlet” na bezpiecznym komputerze. Jeśli baza danych znajduje się w programie SQL Server, wykonaj polecenie cmdlet z innego komputera niż komputer hostowania wystąpienia programu SQL Server. Ponieważ głównym celem funkcji Always Encrypted jest zapewnienie bezpieczeństwa zaszyfrowanych poufnych danych, nawet jeśli system bazy danych zostanie naruszony, wykonanie skryptu programu PowerShell, który przetwarza klucze i/lub poufne dane na komputerze z programem SQL Server, może zmniejszyć lub pokonać korzyści wynikające z tej funkcji.

Zadanie Artykuł Uzyskuje dostęp do kluczy w postaci zwykłego tekstu/magazynu kluczy Uzyskuje dostęp do bazy danych
Krok 1. Uruchom środowisko programu PowerShell i zaimportuj moduł SqlServer. Importowanie modułu SqlServer Nie Nie
Krok 2. Nawiązywanie połączenia z serwerem i bazą danych Nawiązywanie połączenia z bazą danych Nie Tak
Krok 3. Uwierzytelnij się w Azure, jeśli klucz główny kolumny (chroniący klucz szyfrowania kolumny, który należy obrócić) jest przechowywany w usłudze Azure Key Vault Connect-AzAccount Tak Nie
Krok 4. Uzyskaj token dostępu dla usługi Azure Key Vault. Get-AzAccessToken Nie Nie
Krok 5. Utwórz tablicę obiektów SqlColumnEncryptionSettings — jedną dla każdej kolumny bazy danych, którą chcesz zaszyfrować, ponownie zaszyfrować lub odszyfrować. SqlColumnMasterKeySettings to obiekt, który istnieje w pamięci (w programie PowerShell). Określa docelowy schemat szyfrowania dla kolumny. New-SqlColumnEncryptionSettings Nie Nie
Krok 5. Ustaw żądaną konfigurację szyfrowania określoną w tablicy obiektów SqlColumnMasterKeySettings utworzonych w poprzednim kroku. Kolumna zostanie zaszyfrowana, ponownie zaszyfrowana lub odszyfrowana w zależności od określonych ustawień docelowych i bieżącej konfiguracji szyfrowania kolumny. Set-SqlColumnEncryption

Uwaga: ten krok może zająć dużo czasu. Aplikacje nie będą mogły uzyskiwać dostępu do tabel za pośrednictwem całej operacji lub jej części, w zależności od wybranego podejścia (online a offline).
Tak Tak

Szyfrowanie kolumn przy użyciu enklaw VBS

W poniższym przykładzie pokazano ustawienie docelowej konfiguracji szyfrowania dla kilku kolumn. Jeśli którakolwiek kolumna nie jest jeszcze zaszyfrowana, zostanie zaszyfrowana. Jeśli jakakolwiek kolumna jest już zaszyfrowana przy użyciu innego klucza i/lub innego typu szyfrowania, zostanie odszyfrowana, a następnie ponownie zaszyfrowana przy użyciu określonego klucza docelowego/typu. Obecnie enklawy VBS nie obsługują uwierzytelnienia. Parametr EnclaveAttestationProtocol powinien być ustawiony na wartość None, a EnclaveAttestationUrl nie jest wymagana.

# 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

Odszyfrowywanie kolumn — przykład

W poniższym przykładzie pokazano, jak odszyfrować wszystkie kolumny, które są obecnie szyfrowane w bazie danych.

# 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

Szyfrowanie kolumn przy użyciu enklaw SGX

W poniższym przykładzie pokazano ustawienie docelowej konfiguracji szyfrowania dla kilku kolumn. Jeśli którakolwiek kolumna nie jest jeszcze zaszyfrowana, zostanie zaszyfrowana. Jeśli jakakolwiek kolumna jest już zaszyfrowana przy użyciu innego klucza i/lub innego typu szyfrowania, zostanie odszyfrowana, a następnie ponownie zaszyfrowana przy użyciu określonego klucza docelowego/typu. Aby wyzwolić operacje kryptograficzne w miejscu przy użyciu enklawy, wymagane są parametry EnclaveAttestationProtocol i 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

Odszyfrowywanie kolumn — przykład

W poniższym przykładzie pokazano, jak odszyfrować wszystkie kolumny, które są obecnie szyfrowane w bazie danych.

# 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

Następne kroki

Zobacz też