Mengonfigurasi enkripsi kolom di tempat dengan PowerShell

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Artikel ini menyediakan langkah-langkah untuk mengatur konfigurasi Always Encrypted target untuk kolom database menggunakan cmdlet Set-SqlColumnEncryption (dalam modul SqlServer PowerShell). Cmdlet Set-SqlColumnEncryption memodifikasi skema database target dan data yang disimpan di kolom yang dipilih. Data yang disimpan dalam kolom dapat dienkripsi, dienkripsi ulang, atau didekripsi, tergantung pada pengaturan enkripsi target yang ditentukan untuk kolom dan konfigurasi enkripsi saat ini. Untuk memicu operasi kriptografi di tempat menggunakan enklave, Set-SqlColumnEncryption harus menggunakan koneksi database yang dibuat menggunakan string koneksi dengan Protokol Pengesahan dan secara opsional kata kunci URL Pengesahan.

Prasyarat

Untuk mengatur konfigurasi enkripsi target, Anda perlu memastikan:

  • kunci enkripsi kolom yang diaktifkan enklave dikonfigurasi dalam database (jika Anda mengenkripsi atau mengenkripsi ulang kolom). Untuk detailnya, lihat Mengelola kunci untuk Always Encrypted dengan enklave aman.
  • Anda tersambung ke database dengan Always Encrypted diaktifkan dan properti pengesahan yang ditentukan dalam string koneksi.
  • Anda dapat mengakses kunci master kolom untuk setiap kolom yang ingin Anda enkripsi, enkripsi ulang, atau dekripsi, dari komputer yang menjalankan cmdlet PowerShell.
  • Anda menggunakan modul SqlServer PowerShell versi 22.0.50 atau yang lebih baru.

Pertimbangan Ketersediaan

Cmdlet Set-SqlColumnEncryption di tempat tidak mendukung enkripsi online.

Dengan pendekatan offline, tabel target (dan tabel apa pun yang terkait dengan tabel target, misalnya, tabel apa pun yang memiliki hubungan kunci asing dengan tabel) tidak tersedia untuk menulis transaksi selama durasi operasi. Semantik batasan kunci asing (CHECK atau NOCHECK) selalu dipertahankan saat menggunakan pendekatan offline.

Jika Anda tidak mampu membayar waktu henti selama proses enkripsi, sebaiknya gunakan Konfigurasikan enkripsi kolom di tempat dengan Transact-SQL, yang mendukung enkripsi online.

Pertimbangan Keamanan

Cmdlet Set-SqlColumnEncryption, digunakan untuk mengonfigurasi enkripsi untuk kolom database, menangani kunci Always Encrypted dan data yang disimpan dalam kolom database. Oleh karena itu, penting bagi Anda untuk menjalankan cmdlet di komputer yang aman. Jika database Anda berada di SQL Server, jalankan cmdlet dari komputer yang berbeda dari komputer yang menghosting instans SQL Server Anda. Karena tujuan utama Always Encrypted adalah untuk memastikan data sensitif terenkripsi aman bahkan jika sistem database disusupi, menjalankan skrip PowerShell yang memproses kunci dan/atau data sensitif di komputer SQL Server dapat mengurangi atau mengalahkan manfaat fitur.

Tugas Artikel Mengakses kunci teks biasa/penyimpanan kunci Mengakses database
Langkah 1. Mulai lingkungan PowerShell dan impor modul SqlServer. Mengimpor modul SqlServer Tidak Tidak
Langkah 2. Menyambungkan ke server dan database Anda Menyambungkan ke database Tidak Ya
Langkah 3. Autentikasi ke Azure, jika kunci master kolom Anda (melindungi kunci enkripsi kolom, untuk diputar), disimpan di Azure Key Vault Connect-AzAccount Ya Tidak
Langkah 4. Dapatkan token akses untuk Azure Key Vaults. Get-AzAccessToken Tidak Tidak
Langkah 5. Buat array objek SqlColumnEncryptionSettings - satu untuk setiap kolom database, Anda ingin mengenkripsi, mengenkripsi ulang, atau mendekripsi. SqlColumnMasterKeySettings adalah objek yang ada dalam memori (di PowerShell). Ini menentukan skema enkripsi target untuk kolom. New-SqlColumnEncryptionSettings Tidak Tidak
Langkah 5. Atur konfigurasi enkripsi yang diinginkan, yang ditentukan dalam array objek SqlColumnMasterKeySettings, yang Anda buat di langkah sebelumnya. Kolom akan dienkripsi, dienkripsi ulang, atau didekripsi, tergantung pada pengaturan target yang ditentukan dan konfigurasi enkripsi kolom saat ini. Set-SqlColumnEncryption

Catatan: Langkah ini mungkin memakan waktu lama. Aplikasi Anda tidak akan dapat mengakses tabel melalui seluruh operasi atau sebagiannya, tergantung pada pendekatan (online vs. offline), yang Anda pilih.
Ya Ya

Mengenkripsi Kolom menggunakan enklave VBS

Contoh di bawah ini menunjukkan pengaturan konfigurasi enkripsi target untuk beberapa kolom. Jika salah satu kolom belum dienkripsi, kolom tersebut akan dienkripsi. Jika ada kolom yang sudah dienkripsi menggunakan kunci yang berbeda dan/atau jenis enkripsi yang berbeda, kolom tersebut akan didekripsi dan kemudian dienkripsi ulang dengan kunci/jenis target yang ditentukan. Enklave VBS saat ini tidak mendukung pengesahan. Parameter EnclaveAttestationProtocol harus diatur ke Tidak Ada dan EnclaveAttestationUrl tidak diperlukan.

# 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

Kolom Dekripsi - Contoh

Contoh berikut menunjukkan cara mendekripsi semua kolom yang saat ini dienkripsi dalam database.

# 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

Mengenkripsi Kolom menggunakan enklave SGX

Contoh di bawah ini menunjukkan pengaturan konfigurasi enkripsi target untuk beberapa kolom. Jika salah satu kolom belum dienkripsi, kolom tersebut akan dienkripsi. Jika ada kolom yang sudah dienkripsi menggunakan kunci yang berbeda dan/atau jenis enkripsi yang berbeda, kolom tersebut akan didekripsi dan kemudian dienkripsi ulang dengan kunci/jenis target yang ditentukan. Untuk memicu operasi kriptografi di tempat menggunakan enklave, parameter EnclaveAttestationProtocol dan EnclaveAttestationUrl diperlukan.

# 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

Kolom Dekripsi - Contoh

Contoh berikut menunjukkan cara mendekripsi semua kolom yang saat ini dienkripsi dalam database.

# 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

Langkah berikutnya

Baca juga