Putar tombol Always Encrypted menggunakan PowerShell

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Artikel ini menyediakan langkah-langkah untuk memutar kunci untuk Always Encrypted menggunakan modul SqlServer PowerShell. Untuk informasi tentang cara mulai menggunakan modul SqlServer PowerShell untuk Always Encrypted, lihat Mengonfigurasi Always Encrypted menggunakan PowerShell.

Memutar Kunci Always Encrypted adalah proses mengganti kunci yang ada dengan yang baru. Anda mungkin perlu memutar kunci jika telah disusupi, atau untuk mematuhi kebijakan organisasi Anda atau peraturan kepatuhan yang mengamanatkan kunci kriptografi harus diputar secara teratur.

Always Encrypted menggunakan dua jenis kunci, sehingga ada dua alur kerja rotasi kunci tingkat tinggi; memutar kunci master kolom, dan memutar kunci enkripsi kolom.

  • Rotasi kunci enkripsi kolom - melibatkan dekripsi data yang dienkripsi dengan kunci saat ini, dan mengenkripsi ulang data menggunakan kunci enkripsi kolom baru. Karena memutar kunci enkripsi kolom memerlukan akses ke kunci dan database, rotasi kunci enkripsi kolom hanya dapat dilakukan tanpa pemisahan peran.
  • Rotasi kunci master kolom - melibatkan dekripsi kunci enkripsi kolom yang dilindungi dengan kunci master kolom saat ini, mengenkripsi ulang menggunakan kunci master kolom baru, dan memperbarui metadata untuk kedua jenis kunci. Rotasi kunci master kolom dapat diselesaikan dengan atau tanpa pemisahan peran (saat menggunakan modul PowerShell SqlServer).

Rotasi Kunci Master Kolom tanpa Pemisahan Peran

Metode memutar kunci master kolom yang dijelaskan di bagian ini tidak mendukung pemisahan peran antara Administrator Keamanan dan DBA. Beberapa langkah di bawah ini menggabungkan operasi pada kunci fisik dengan operasi pada metadata kunci sehingga alur kerja ini direkomendasikan untuk organisasi yang menggunakan model DevOps, atau ketika database Anda dihosting di cloud dan tujuan utamanya adalah membatasi administrator cloud (tetapi bukan DBA lokal) agar tidak mengakses data sensitif. Tidak disarankan jika potensi iklan menyertakan DBA, atau jika DBA tidak boleh memiliki akses ke data sensitif.

Tugas Artikel Mengakses kunci teks biasa/keystore Mengakses database
Langkah 1. Buat kunci master kolom baru di penyimpanan kunci.

Catatan: Modul SqlServer PowerShell tidak mendukung langkah ini. Untuk menyelesaikan tugas ini dari baris perintah, Anda perlu menggunakan alat yang khusus untuk penyimpanan kunci Anda.
Membuat dan menyimpan kunci master kolom untuk Always Encrypted Ya Tidak
Langkah 2. Memulai lingkungan PowerShell dan mengimpor modul SqlServer Mengimpor modul SqlServer Tidak Tidak
Langkah 3. Sambungkan ke server dan database Anda. Menyambungkan ke database Tidak Ya
Langkah 4. Buat objek SqlColumnMasterKeySettings yang berisi informasi tentang lokasi kunci master kolom baru Anda. SqlColumnMasterKeySettings adalah objek yang ada dalam memori (di PowerShell). Untuk membuatnya, Anda perlu menggunakan cmdlet yang khusus untuk penyimpanan kunci Anda. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Tidak Tidak
Langkah 5. Buat metadata tentang kunci master kolom baru Anda di database Anda. New-SqlColumnMasterKey

Catatan: di bawah sampul, cmdlet ini mengeluarkan pernyataan CREATE COLUMN MASTER KEY (Transact-SQL) untuk membuat metadata kunci.
Tidak Ya
Langkah 6. Autentikasi ke Azure, jika kunci master kolom Anda saat ini atau kunci master kolom baru Anda disimpan di brankas kunci atau HSM terkelola di Azure Key Vault Connect-AzAccount Ya Tidak
Langkah 7. Dapatkan token akses untuk Azure Key Vaults, jika kunci master kolom Anda disimpan di Azure Key Vault. Get-AzAccessToken Tidak Tidak
Langkah 8. Mulai rotasi, dengan mengenkripsi masing-masing kunci enkripsi kolom, yang saat ini dilindungi dengan kunci master kolom lama, menggunakan kunci master kolom baru. Setelah langkah ini, setiap kunci enkripsi kolom yang terkena dampak (terkait dengan kunci master kolom lama, sedang diputar), dienkripsi dengan kunci master kolom lama dan baru, dan memiliki dua nilai terenkripsi dalam metadata database. Invoke-SqlColumnMasterKeyRotation Ya Ya
Langkah 9. Berkoordinasi dengan administrator semua aplikasi yang mengkueri kolom terenkripsi dalam database (dan dilindungi dengan kunci master kolom lama), sehingga mereka dapat memastikan aplikasi dapat mengakses kunci master kolom baru. Membuat dan Menyimpan Kunci Master Kolom (Always Encrypted) Ya Tidak
Langkah 10. Menyelesaikan rotasi

Catatan: sebelum menjalankan langkah ini, pastikan semua aplikasi yang mengkueri kolom terenkripsi yang dilindungi dengan kunci master kolom lama, telah dikonfigurasi untuk menggunakan kunci master kolom baru. Jika Anda melakukan langkah ini sebelum waktunya, beberapa aplikasi tersebut mungkin tidak dapat mendekripsi data. Selesaikan rotasi dengan menghapus nilai terenkripsi dari database yang dibuat dengan kunci master kolom lama. Ini menghapus hubungan antara kunci master kolom lama dan kunci enkripsi kolom yang dilindunginya.
Complete-SqlColumnMasterKeyRotation Tidak Ya
Langkah 10. Hapus metadata dari kunci master kolom lama. Remove-SqlColumnMasterKey Tidak Ya

Catatan

Sangat disarankan agar Anda tidak menghapus kunci master kolom lama secara permanen setelah rotasi. Sebagai gantinya, Anda harus menyimpan kunci master kolom lama di penyimpanan kuncinya saat ini atau mengarsipkannya di tempat aman lainnya. Jika Anda memulihkan database dari file cadangan ke titik waktu sebelum kunci master kolom baru dikonfigurasi, Anda akan memerlukan kunci lama untuk mengakses data.

Memutar Kunci Master Kolom tanpa Pemisahan Peran (Contoh Sertifikat Windows)

Skrip di bawah ini adalah contoh end-to-end yang menggantikan kunci master kolom (CMK1) yang ada dengan kunci master kolom baru (CMK2).

# Create a new column master key in Windows Certificate Store.
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation Cert:CurrentUser\My -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage KeyEncipherment -KeySpec KeyExchange -KeyLength 2048

# Import the SqlServer module
Import-Module "SqlServer"

# 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

# Create a SqlColumnMasterKeySettings object for your new column master key. 
$newCmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint

# Create metadata for your new column master key in the database.
$newCmkName = "CMK2"
New-SqlColumnMasterKey -Name $newCmkName -InputObject $database -ColumnMasterKeySettings $newCmkSettings

# Initiate the rotation from the current column master key to the new column master key.
$oldCmkName = "CMK1"
Invoke-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName -TargetColumnMasterKeyName $newCmkName -InputObject $database

# Complete the rotation of the old column master key.
Complete-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName  -InputObject $database

# Remove the old column master key metadata.
Remove-SqlColumnMasterKey -Name $oldCmkName -InputObject $database

Rotasi Kunci Master Kolom dengan Pemisahan Peran

Alur kerja rotasi kunci master kolom yang dijelaskan di bagian ini memastikan pemisahan antara Administrator Keamanan dan DBA.

Penting

Sebelum menjalankan langkah apa pun di mana Mengakses kunci teks biasa/keystore=Ya dalam tabel di bawah ini (langkah-langkah yang mengakses kunci teks biasa atau penyimpanan kunci), pastikan bahwa lingkungan PowerShell berjalan pada komputer aman yang berbeda dari komputer yang menghosting database Anda. Untuk informasi selengkapnya, lihat Pertimbangan Keamanan untuk Manajemen Kunci.

Bagian 1: DBA

DBA mengambil metadata tentang kunci master kolom yang akan diputar, dan tentang kunci enkripsi kolom yang terkena dampak, yang terkait dengan kunci master kolom saat ini. DBA berbagi semua informasi ini dengan Administrator Keamanan.

Tugas Artikel Mengakses kunci teks biasa/keystore Mengakses database
Langkah 1. Mulai lingkungan PowerShell dan impor modul SqlServer. Mengimpor modul SqlServer Tidak Tidak ada
Langkah 2. Sambungkan ke server Anda dan database. Menyambungkan ke database Tidak Ya
Langkah 3. Ambil metadata tentang kunci master kolom lama. Get-SqlColumnMasterKey Tidak Ya
Langkah 4. Ambil metadata tentang kunci enkripsi kolom, yang dilindungi oleh kunci master kolom lama, termasuk nilai terenkripsinya. Get-SqlColumnEncryptionKey Tidak Ya
Langkah 5. Bagikan lokasi kunci master kolom (nama penyedia dan jalur kunci kunci kunci master kolom) dan nilai terenkripsi dari kunci enkripsi kolom yang sesuai, dilindungi dengan kunci master kolom lama. Lihat contoh di bawah ini. Tidak Tidak

Bagian 2: Administrator Keamanan

Administrator Keamanan menghasilkan kunci master kolom baru, mengenkripsi ulang kunci enkripsi kolom yang terkena dampak dengan kunci master kolom baru, dan berbagi informasi tentang kunci master kolom baru serta kumpulan nilai terenkripsi baru untuk kunci enkripsi kolom yang terkena dampak, dengan DBA.

Tugas Artikel Mengakses kunci teks biasa/keystore Mengakses database
Langkah 1. Dapatkan lokasi kunci master kolom lama dan nilai terenkripsi dari kunci enkripsi kolom yang sesuai, dilindungi dengan kunci master kolom lama, dari DBA Anda. T/A
Lihat contoh di bawah ini.
Tidak Tidak
Langkah 2. Buat kunci master kolom baru di penyimpanan kunci.

Catatan: Modul SqlServer tidak mendukung langkah ini. Untuk menyelesaikan tugas ini dari baris perintah, Anda perlu menggunakan alat yang spesifik dengan jenis penyimpanan kunci Anda.
Membuat dan menyimpan kunci master kolom untuk Always Encrypted Ya Tidak
Langkah 3. Mulai lingkungan PowerShell dan impor modul SqlServer. Mengimpor modul SqlServer Tidak Tidak
Langkah 4. Buat objek SqlColumnMasterKeySettings yang berisi informasi tentang lokasi kunci master kolom lama Anda. SqlColumnMasterKeySettings adalah objek yang ada dalam memori (di PowerShell). New-SqlColumnMasterKeySettings Tidak Tidak
Langkah 5. Buat objek SqlColumnMasterKeySettings yang berisi informasi tentang lokasi kunci master kolom baru Anda. SqlColumnMasterKeySettings adalah objek yang ada dalam memori (di PowerShell). Untuk membuatnya, Anda perlu menggunakan cmdlet yang khusus untuk penyimpanan kunci Anda. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Tidak Tidak
Langkah 6. Autentikasi ke Azure, jika kunci master kolom lama (saat ini) atau kunci master kolom baru Anda disimpan dalam brankas kunci atau HSM terkelola di Azure Key Vault. Connect-AzAccount Ya Tidak
Langkah 7. Dapatkan token akses untuk Azure Key Vaults, jika kunci master kolom Anda disimpan di Azure Key Vault. Get-AzAccessToken Tidak Tidak
Langkah 8. Enkripsi ulang setiap nilai kunci enkripsi kolom, yang saat ini dilindungi dengan kunci master kolom lama, menggunakan kunci master kolom baru. New-SqlColumnEncryptionKeyEncryptedValue

Catatan: Saat memanggil cmdlet ini, teruskan objek SqlColumnMasterKeySettings untuk kunci master kolom lama dan baru, bersama dengan nilai kunci enkripsi kolom, untuk dienkripsi ulang.
Ya Tidak
Langkah 9. Bagikan lokasi kunci master kolom baru (nama penyedia dan jalur kunci kunci kunci master kolom) dan kumpulan nilai terenkripsi baru dari kunci enkripsi kolom, dengan DBA Anda. Lihat contoh di bawah ini. Tidak Tidak

Catatan

Sangat disarankan agar Anda tidak menghapus kunci master kolom lama secara permanen setelah rotasi. Sebagai gantinya, Anda harus menyimpan kunci master kolom lama di penyimpanan kuncinya saat ini atau mengarsipkannya di tempat aman lainnya. Jika Anda memulihkan database dari file cadangan ke titik waktu sebelum kunci master kolom baru dikonfigurasi, Anda akan memerlukan kunci lama untuk mengakses data.

Bagian 3: DBA

DBA membuat metadata untuk kunci master kolom baru dan memperbarui metadata kunci enkripsi kolom yang terkena dampak, untuk menambahkan kumpulan nilai terenkripsi baru. Dalam langkah ini, DBA juga berkoordinasi dengan administrator aplikasi yang mengkueri kolom enkripsi, yang memastikan aplikasi dapat mengakses kunci master kolom baru. Setelah semua aplikasi disiapkan untuk menggunakan kunci master kolom baru, DBA menghapus set lama nilai terenkripsi dan metadata kunci master kolom lama.

Tugas Artikel Mengakses kunci teks biasa/keystore Mengakses database
Langkah 1. Dapatkan lokasi kunci master kolom baru dan kumpulan nilai terenkripsi baru dari kunci enkripsi kolom terkait, yang dilindungi dengan kunci master kolom lama, dari Administrator Keamanan Anda. Lihat contoh di bawah ini. Tidak Tidak
Langkah 2. Mulai lingkungan PowerShell dan impor modul SqlServer. Mengimpor modul SqlServer Tidak Tidak
Langkah 3. Sambungkan ke server Anda dan database. Menyambungkan ke database Tidak Ya
Langkah 4. Buat objek SqlColumnMasterKeySettings yang berisi informasi tentang lokasi kunci master kolom baru Anda. SqlColumnMasterKeySettings adalah objek yang ada dalam memori (di PowerShell). New-SqlColumnMasterKeySettings Tidak Tidak
Langkah 5. Buat metadata tentang kunci master kolom baru Anda di database Anda. New-SqlColumnMasterKey

Catatan: Di bawah sampul cmdlet ini mengeluarkan pernyataan CREATE COLUMN MASTER KEY (Transact-SQL) untuk membuat metadata kunci.
Tidak Ya
Langkah 6. Ambil metadata tentang kunci enkripsi kolom, yang dilindungi oleh kunci master kolom lama. Get-SqlColumnEncryptionKey Tidak Ya
Langkah 7. Tambahkan nilai terenkripsi baru (diproduksi menggunakan kunci master kolom baru) ke metadata untuk setiap kunci enkripsi kolom yang terkena dampak. Add-SqlColumnEncryptionKeyValue Tidak Ya
Langkah 8. Berkoordinasi dengan administrator semua aplikasi yang mengkueri kolom terenkripsi dalam database (dan dilindungi dengan kunci master kolom lama), sehingga mereka dapat memastikan aplikasi dapat mengakses kunci master kolom baru. Membuat dan Menyimpan Kunci Master Kolom (Always Encrypted) Tidak Tidak
Langkah 9. Selesaikan rotasi, dengan menghapus nilai terenkripsi yang terkait dengan kunci master kolom lama dari database.

Catatan: Sebelum menjalankan langkah ini, pastikan semua aplikasi yang mengkueri kolom terenkripsi yang dilindungi dengan kunci master kolom lama, telah dikonfigurasi untuk menggunakan kunci master kolom baru. Jika Anda melakukan langkah ini sebelum waktunya, beberapa aplikasi tersebut mungkin tidak dapat mendekripsi data.

Langkah ini menghapus hubungan antara kunci master kolom lama dan kunci enkripsi kolom yang dilindunginya.
Complete-SqlColumnMasterKeyRotation

Atau, Anda dapat menggunakan Remove-SqlColumnEncryptionKeyValue
Tidak Ya
Langkah 10. Menghapus metadata kunci master kolom lama dari database Remove-SqlColumnMasterKey Tidak Ya

Memutar Kunci Master Kolom dengan Pemisahan Peran (Contoh Sertifikat Windows)

Skrip di bawah ini adalah contoh end-to-end untuk menghasilkan kunci master kolom baru yang merupakan sertifikat di penyimpanan Sertifikat Windows, memutar kunci master kolom (saat ini) yang ada, untuk menggantinya dengan kunci master kolom baru. Skrip mengasumsikan, database target berisi kunci master kolom, bernama CMK1 (untuk diputar), yang mengenkripsi beberapa kunci enkripsi kolom.

Bagian 1: DBA

# Import the SqlServer module.
Import-Module "SqlServer"

# 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

# Retrieve the data about the old column master key, which needs to be rotated.
$oldCmkName = "CMK1"
$oldCmk = Get-SqlColumnMasterKey -Name $oldCmkName -InputObject $database


# Share the location of the old column master key with a Security Administrator, via a CSV file on a share drive.
$oldCmkDataFile = "Z:\oldcmkdata.txt"
"KeyStoreProviderName, KeyPath" > $oldCmkDataFile
$oldCmk.KeyStoreProviderName +", " + $oldCmk.KeyPath >> $oldCmkDataFile


# Find column encryption keys associated with the old column master key and provide the encrypted values of column encryption keys to the Security Administrator, via a CSV file on a share drive.
$ceks = Get-SqlColumnEncryptionKey -InputObject $database
$oldCekValuesFile = "Z:\oldcekvalues.txt"
"CEKName, CEKEncryptedValue" > $oldCekValuesFile 
for($i=0; $i -lt $ceks.Length; $i++){
    if($ceks[$i].ColumnEncryptionKeyValues.Length -eq 2) {
        # This column encryption has 2 encrypted values - let's check, if it is associated with the old column master key.
        if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName -or $ceks[$i].ColumnEncryptionKeyValues[1].ColumnMasterKeyName -eq $oldCmkName) {
            Write-Host $ceks[$i].Name "already has 2 encrypted values and therefore" $oldCmkName + "cannot be rotated"
            exit 1
        }
    }
    if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName) {# This column encryption key has 1 encrypted value that was produced using the old column master key
        # Save the name and the encrypted value of the column encryption key in the file.
        $encryptedValue =  "0x" + -join ($ceks[$i].ColumnEncryptionKeyValues[0].EncryptedValue |  foreach {$_.ToString("X2") } )
        $ceks[$i].Name + "," + $encryptedValue >> $oldCekValuesFile
    }
} 

Bagian 2: Administrator Keamanan

# Obtain the location of the old column master key and the encrypted values of the corresponding column encryption keys, from your DBA, via a CSV file on a share drive.
$oldCmkDataFile = "Z:\oldcmkdata.txt"
$oldCmkData = Import-Csv $oldCmkDataFile
$oldCekValuesFile = "Z:\oldcekvalues.txt"
$oldCekValues = @(Import-Csv $oldCekValuesFile)

# Create a new column master key in Windows Certificate Store.
$storeLocation = "CurrentUser"
$certPath = "Cert:\" + $storeLocation + "\My"
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation $certPath -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage DataEncipherment -KeySpec KeyExchange

# Import the SqlServer module.
Import-Module "SqlServer"

# Create a SqlColumnMasterKeySettings object for your old column master key. 
$oldCmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $oldCmkData.KeyStoreProviderName -KeyPath $oldCmkData.KeyPath

# Create a SqlColumnMasterKeySettings object for your new column master key. 
$newCmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation $storeLocation -Thumbprint $cert.Thumbprint


# Prepare a CSV file, you will use to share the encrypted values of column encryption keys, produced using the new column master key.
$newCekValuesFile = "Z:\newcekvalues.txt"
"CEKName, CEKEncryptedValue" > $newCekValuesFile

# Re-encrypt each value with the new column master key and save the new encrypted value in the file.
for($i=0; $i -lt $oldCekValues.Count; $i++){
    # Re-encrypt each value with the new CMK
    $newValue = New-SqlColumnEncryptionKeyEncryptedValue -TargetColumnMasterKeySettings $newCmkSettings -ColumnMasterKeySettings $oldCmkSettings -EncryptedValue $oldCekValues[$i].CEKEncryptedValue
    $oldCekValues[$i].CEKName + ", " + $newValue >> $newCekValuesFile
}

# Share the new column master key data with your DBA, via a CSV file.
$newCmkDataFile = $home + "\newcmkdata.txt"
"KeyStoreProviderName, KeyPath" > $newCmkDataFile
$newCmkSettings.KeyStoreProviderName +", " + $newCmkSettings.KeyPath >> $newCmkDataFile

Bagian 3: DBA

# Obtain the location of the new column master key and the new encrypted values of the corresponding column encryption keys, from your Security Administrator, via a CSV file on a share drive.
$newCmkDataFile = "Z:\newcmkdata.txt"
$newCmkData = Import-Csv $newCmkDataFile
$newCekValuesFile = "Z:\newcekvalues.txt"
$newCekValues = @(Import-Csv $newCekValuesFile)

# Import the SqlServer module.
Import-Module "SqlServer"

# 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

# Create a SqlColumnMasterKeySettings object for your new column master key. 
$newCmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $newCmkData.KeyStoreProviderName -KeyPath $newCmkData.KeyPath
# Create metadata for the new column master key in the database.
$newCmkName = "CMK2"
New-SqlColumnMasterKey -Name $newCmkName -InputObject $database -ColumnMasterKeySettings $newCmkSettings


# Get all CEK objects
$oldCmkName = "CMK1"
$ceks = Get-SqlColumnEncryptionKey -InputObject $database
for($i=0; $i -lt $ceks.Length; $i++){
    if($ceks[$i].ColumnEncryptionKeyValues.Length -eq 2) {# This column encryption key has 2 encrypted values. Let's check, if it is associated with the old CMK.
        if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName -or $ceks[$i].ColumnEncryptionKeyValues[1].ColumnMasterKeyName -eq $oldCmkName) {
            Write-Host $ceks[$i].Name "already has 2 encrypted values and therefore" $oldCmkName + "cannot be rotated"
            exit 1
        }
    }
    if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName) {
        # Find the corresponding new encrypted value, received from the Security Administrator.
        $newValueRow = ($newCekValues| Where-Object {$_.CEKName -eq $ceks[$i].Name }[0])
        # Update the column encryption key metadata object by adding the new encrypted value
        Add-SqlColumnEncryptionKeyValue -ColumnMasterKeyName $newCmkName -Name $ceks[$i].Name -EncryptedValue $newValueRow.CEKEncryptedValue -InputObject $database 
    }
}

# Complete the rotation of the current column master key.
Complete-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName  -InputObject $database

# Remove the old column master key.
Remove-SqlColumnMasterKey -Name $oldCmkName -InputObject $database

Memutar Kunci Enkripsi Kolom

Memutar kunci enkripsi kolom melibatkan dekripsi data di semua kolom, dienkripsi dengan kunci yang akan diputar, dan mengenkripsi ulang data menggunakan kunci enkripsi kolom baru. Alur kerja rotasi ini memerlukan akses ke kunci dan database, dan karenanya tidak dapat dilakukan dengan pemisahan peran. Memutar kunci enkripsi kolom dapat memakan waktu lama, jika tabel yang berisi kolom yang dienkripsi dengan kunci, sedang diputar, berukuran besar. Oleh karena itu, organisasi Anda perlu merencanakan rotasi kunci enkripsi kolom dengan hati-hati.

Anda dapat memutar kunci enkripsi kolom menggunakan pendekatan offline atau online. Metode sebelumnya cenderung lebih cepat, tetapi aplikasi Anda tidak dapat menulis ke tabel yang terkena dampak. Pendekatan terakhir kemungkinan akan memakan waktu lebih lama, tetapi Anda dapat membatasi interval waktu, di mana tabel yang terkena dampak tidak tersedia untuk aplikasi. Untuk informasi selengkapnya, lihat Mengonfigurasi enkripsi kolom menggunakan Always Encrypted dengan PowerShell dan Set-SqlColumnEncryption.

Tugas Artikel Mengakses kunci teks biasa/keystore Mengakses database
Langkah 1. Mulai lingkungan PowerShell dan impor modul SqlServer. Mengimpor modul SqlServer Tidak Tidak
Langkah 2. Sambungkan ke server Anda dan database. Menyambungkan ke database Tidak Ya
Langkah 3. Autentikasi ke Azure, jika kunci master kolom Anda (melindungi kunci enkripsi kolom, yang akan diputar), disimpan dalam brankas kunci atau HSM terkelola di Azure Key Vault. Connect-AzAccount Ya Tidak
Langkah 4. Dapatkan token akses untuk Azure Key Vaults, jika kunci master kolom Anda disimpan di Azure Key Vault. Get-AzAccessToken Tidak Tidak
Langkah 5. Buat kunci enkripsi kolom baru, enkripsikan dengan kunci master kolom dan buat metadata kunci enkripsi kolom dalam database. New-SqlColumnEncryptionKey

Catatan: Gunakan variasi cmdlet yang secara internal menghasilkan dan mengenkripsi kunci enkripsi kolom.
Di bawah mencakup cmdlet ini mengeluarkan pernyataan CREATE COLUMN ENCRYPTION KEY (Transact-SQL) untuk membuat metadata kunci.
Ya Ya
Langkah 6. Temukan semua kolom yang dienkripsi dengan kunci enkripsi kolom lama. Panduan Pemrograman Objek Manajemen SQL Server (SMO) Tidak Ya
Langkah 7. Buat objek SqlColumnEncryptionSettings untuk setiap kolom yang terkena dampak. SqlColumnEncryptionSettings adalah objek yang ada dalam memori (di PowerShell). Ini menentukan skema enkripsi target untuk kolom. Dalam hal ini, objek harus menentukan kolom yang terkena dampak harus dienkripsi menggunakan kunci enkripsi kolom baru. New-SqlColumnEncryptionSettings Tidak Tidak
Langkah 8. Enkripsi ulang kolom, yang diidentifikasi di langkah 5, menggunakan kunci enkripsi kolom baru. 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
Langkah 9. Hapus metadata untuk kunci enkripsi kolom lama. Remove-SqlColumnEncryptionKey Tidak Ya

Contoh - Memutar Kunci Enkripsi Kolom

Skrip di bawah ini menunjukkan memutar kunci enkripsi kolom. Skrip mengasumsikan, database target berisi beberapa kolom yang dienkripsi dengan kunci enkripsi kolom, bernama CEK1 (untuk diputar), yang dilindungi menggunakan kunci master kolom, bernama CMK1 (kunci master kolom tidak disimpan di Azure Key Vault).

# Import the SqlServer module.
Import-Module "SqlServer"

# 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

# Generate a new column encryption key, encrypt it with the column master key and create column encryption key metadata in the database. 
$cmkName = "CMK1"
$newCekName = "CEK2"
New-SqlColumnEncryptionKey -Name $newCekName -InputObject $database -ColumnMasterKey $cmkName 


# Find all columns encrypted with the old column encryption key, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$oldCekName = "CEK1"
$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 -and $columns[$j].ColumnEncryptionKeyName -eq $oldCekName) {
            $threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name 
            $ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType $columns[$j].EncryptionType -EncryptionKey $newCekName
        }
     }
}

# Re-encrypt all columns, currently encrypted with the old column encryption key, using the new column encryption key.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -UseOnlineApproach -MaxDowntimeInSeconds 120 -LogFileDirectory .

# Remove the old column encryption key metadata.
Remove-SqlColumnEncryptionKey -Name $oldCekName -InputObject $database

Langkah berikutnya

Lihat Juga