Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure 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ż
- Always Encrypted z bezpiecznymi enklawami
- Zarządzanie kluczami dla funkcji Always Encrypted przy użyciu bezpiecznych enklaw
- Konfigurowanie szyfrowania kolumn bezpośrednio przy użyciu języka Transact-SQL
- Konfigurowanie szyfrowania kolumn na miejscu przy użyciu pakietu DAC
- Konfigurowanie bezpośredniego szyfrowania kolumn za pomocą kreatora Always Encrypted w programie SSMS