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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk