Ketentuan tombol Always Encrypted menggunakan PowerShell

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Artikel ini menyediakan langkah-langkah untuk menyediakan kunci untuk Always Encrypted menggunakan modul SqlServer PowerShell. Anda dapat menggunakan PowerShell untuk menyediakan kunci Always Encrypted baik dengan dan tanpa pemisahan peran, memberikan kontrol atas siapa yang memiliki akses ke kunci enkripsi aktual di penyimpanan kunci, dan siapa yang memiliki akses ke database.

Untuk gambaran umum manajemen kunci Always Encrypted, termasuk beberapa rekomendasi praktik terbaik tingkat tinggi, lihat Gambaran Umum manajemen kunci untuk Always Encrypted. Untuk informasi tentang cara mulai menggunakan modul SqlServer PowerShell untuk Always Encrypted, lihat Mengonfigurasi Always Encrypted menggunakan PowerShell.

Provisi Kunci tanpa Pemisahan Peran

Metode provisi utama 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. Oleh karena itu, metode penyediaan kunci ini direkomendasikan untuk organisasi yang menggunakan model DevOps, atau jika database dihosting di cloud dan tujuan utamanya adalah membatasi administrator cloud (tetapi bukan DBA lokal) agar tidak mengakses data sensitif. Tidak disarankan jika calon iklan menyertakan DBA, atau jika DBA tidak boleh memiliki akses ke data sensitif.

Sebelum menjalankan langkah apa pun yang melibatkan akses ke kunci teks biasa atau penyimpanan kunci (diidentifikasi di kolom Kunci teks biasa/penyimpanan kunci Accesses dalam tabel di bawah), 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.

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

Catatan: Modul SqlServer PowerShell tidak mendukung langkah ini. Untuk menyelesaikan tugas ini dari baris perintah, gunakan alat yang khusus untuk penyimpanan kunci yang Anda pilih.
Membuat dan menyimpan kunci master kolom untuk Always Encrypted Ya Tidak
Langkah 2. Mulai lingkungan PowerShell dan impor modul PowerShell SqlServer. Mengonfigurasi Always Encrypted menggunakan PowerShell 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 Anda. SqlColumnMasterKeySettings adalah objek yang ada dalam memori (di PowerShell). Gunakan 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 di database Anda. New-SqlColumnMasterKey

Catatan: di bawah sampul, cmdlet mengeluarkan pernyataan CREATE COLUMN MASTER KEY (Transact-SQL) untuk membuat metadata kunci.
Tidak Ya
Langkah 6. Autentikasi ke Azure, jika kunci master kolom Anda disimpan 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. 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.

Catatan: Di bawah sampul, cmdlet mengeluarkan pernyataan CREATE COLUMN ENCRYPTION KEY (Transact-SQL) untuk membuat metadata kunci.
Ya Ya

Penyimpanan Sertifikat Windows tanpa Pemisahan Peran (Contoh)

Skrip ini adalah contoh end-to-end untuk membuat kunci master kolom yang merupakan sertifikat di Penyimpanan Sertifikat Windows, menghasilkan dan mengenkripsi kunci enkripsi kolom, dan membuat metadata kunci dalam database SQL Server.

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

# 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 column master key. 
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings


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

Azure Key Vault tanpa Pemisahan Peran (Contoh)

Skrip ini adalah contoh end-to-end untuk menyediakan dan mengonfigurasi brankas kunci di Azure Key Vault, menghasilkan kunci master kolom di vault, menghasilkan dan mengenkripsi kunci enkripsi kolom, dan membuat metadata kunci dalam database Azure SQL.

# Create a column master key in Azure Key Vault.
Import-Module Az
Connect-AzAccount
$SubscriptionId = "<Azure SubscriptionId>"
$resourceGroup = "<resource group name>"
$azureLocation = "<datacenter location>"
$akvName = "<key vault name>"
$akvKeyName = "<key name>"
$azureCtx = Set-AzConteXt -SubscriptionId $SubscriptionId # Sets the context for the below cmdlets to the specified subscription.
New-AzResourceGroup -Name $resourceGroup -Location $azureLocation # Creates a new resource group - skip, if your desired group already exists.
New-AzKeyVault -VaultName $akvName -ResourceGroupName $resourceGroup -Location $azureLocation # Creates a new key vault - skip if your vault already exists.
Set-AzKeyVaultAccessPolicy -VaultName $akvName -ResourceGroupName $resourceGroup -PermissionsToKeys get, create, delete, list, wrapKey,unwrapKey, sign, verify -UserPrincipalName $azureCtx.Account
$akvKey = Add-AzKeyVaultKey -VaultName $akvName -Name $akvKeyName -Destination "Software"

# Connect to your database (Azure SQL database).
Import-Module "SqlServer"

$serverName = "<Azure SQL server name>.database.windows.net"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Authentication = Active Directory Integrated"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your column master key. 
$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyURL $akvKey.Key.Kid

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings -KeyVaultAccessToken $keyVaultAccessToken

# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token 

# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database. 
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName -KeyVaultAccessToken $keyVaultAccessToken

CNG/KSP tanpa Pemisahan Peran (Contoh)

Skrip di bawah ini adalah contoh end-to-end untuk menghasilkan kunci master kolom di penyimpanan kunci yang mengimplementasikan Cryptography Next Generation API (CNG), menghasilkan dan mengenkripsi kunci enkripsi kolom, dan membuat metadata kunci dalam database SQL Server.

Contoh memanfaatkan penyimpanan kunci yang menggunakan Penyedia Penyimpanan Kunci Perangkat Lunak Microsoft. Anda dapat memilih untuk mengubah contoh untuk menggunakan penyimpanan lain, seperti modul keamanan perangkat keras Anda. Untuk itu, Anda harus memastikan penyedia penyimpanan kunci (KSP) yang mengimplementasikan CNG untuk perangkat Anda diinstal dan benar di komputer Anda. Anda harus mengganti Microsoft Software Key Storage Provider dengan nama KSP perangkat Anda.

# Create a column master key in a key store that has a CNG provider, a.k.a key store provider (KSP).
$cngProviderName = "Microsoft Software Key Storage Provider" # If you have an HSM, you can use a KSP for your HSM instead of a Microsoft KSP
$cngAlgorithmName = "RSA"
$cngKeySize = 2048 # Recommended key size for Always Encrypted column master keys
$cngKeyName = "AlwaysEncryptedKey" # Name identifying your new key in the KSP
$cngProvider = New-Object System.Security.Cryptography.CngProvider($cngProviderName)
$cngKeyParams = New-Object System.Security.Cryptography.CngKeyCreationParameters
$cngKeyParams.provider = $cngProvider
$cngKeyParams.KeyCreationOptions = [System.Security.Cryptography.CngKeyCreationOptions]::OverwriteExistingKey
$keySizeProperty = New-Object System.Security.Cryptography.CngProperty("Length", [System.BitConverter]::GetBytes($cngKeySize), [System.Security.Cryptography.CngPropertyOptions]::None);
$cngKeyParams.Parameters.Add($keySizeProperty)
$cngAlgorithm = New-Object System.Security.Cryptography.CngAlgorithm($cngAlgorithmName)
$cngKey = [System.Security.Cryptography.CngKey]::Create($cngAlgorithm, $cngKeyName, $cngKeyParams)

# 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 column master key. 
$cmkSettings = New-SqlCngColumnMasterKeySettings -CngProviderName $cngProviderName -KeyName $cngKeyName

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings

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

Provisi Kunci Dengan Pemisahan Peran

Bagian ini menyediakan langkah-langkah untuk mengonfigurasi enkripsi di mana administrator keamanan tidak memiliki akses ke database, dan administrator database tidak memiliki akses ke penyimpanan kunci atau kunci teks biasa.

Administrator Keamanan

Sebelum menjalankan langkah apa pun yang melibatkan akses ke kunci teks biasa atau penyimpanan kunci (diidentifikasi di kolom Kunci teks biasa/penyimpanan kunci Accesses dalam tabel di bawah), pastikan bahwa:

  1. Lingkungan PowerShell berjalan pada komputer aman yang berbeda dari komputer yang menghosting database Anda.
  2. DBA di organisasi Anda tidak memiliki akses ke komputer (yang akan mengalahkan tujuan pemisahan peran).

Untuk informasi selengkapnya, lihat Pertimbangan Keamanan untuk Manajemen Kunci.

Tugas Artikel Mengakses kunci teks biasa/penyimpanan kunci Mengakses database
Langkah 1. Buat kunci master kolom 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 2. Mulai sesi PowerShell dan impor modul SqlServer. Mengimpor modul SqlServer Tidak Tidak
Langkah 3. Buat objek SqlColumnMasterKeySettings yang berisi informasi tentang lokasi kunci master kolom Anda. SqlColumnMasterKeySettings adalah objek yang ada dalam memori (di PowerShell). Gunakan cmdlet yang khusus untuk penyimpanan kunci Anda. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Tidak Tidak
Langkah 4. Autentikasi ke Azure, jika kunci master kolom Anda disimpan di Azure Key Vault. Connect-AzAccount Ya Tidak
Langkah 5. Dapatkan token akses untuk Azure Key Vaults, jika kunci master kolom Anda disimpan di Azure Key Vault. Get-AzAccessToken Tidak Tidak
Langkah 6. Buat kunci enkripsi kolom, enkripsi dengan kunci master kolom untuk menghasilkan nilai terenkripsi kunci enkripsi kolom. New-SqlColumnEncryptionKeyEncryptedValue Ya Tidak
Langkah 7. Berikan lokasi kunci master kolom (nama penyedia dan jalur kunci kunci kunci master kolom) dan nilai terenkripsi dari kunci enkripsi kolom ke DBA. Lihat contoh di bawah ini. Tidak Tidak

DBA

DBA menggunakan informasi yang mereka terima dari Admin Keamanan (langkah 7 di atas) untuk membuat dan mengelola metadata kunci Always Encrypted dalam database.

Tugas Artikel Mengakses kunci teks biasa Mengakses database
Langkah 1. Dapatkan lokasi kunci master kolom dan nilai terenkripsi kunci enkripsi kolom dari Administrator Keamanan Anda. Lihat contoh di bawah ini. Tidak Tidak
Langkah 2. Mulai lingkungan PowerShell dan impor modul SqlServer. Mengonfigurasi Always Encrypted menggunakan PowerShell 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 Anda. SqlColumnMasterKeySettings adalah objek yang ada dalam memori. New-SqlColumnMasterKeySettings Tidak Tidak
Langkah 5. Membuat metadata tentang kunci master kolom di database Anda New-SqlColumnMasterKey
Catatan: di bawah sampul, cmdlet mengeluarkan pernyataan CREATE COLUMN MASTER KEY (Transact-SQL) untuk membuat metadata kunci master kolom.
Tidak Ya
Langkah 6. Buat metadata kunci enkripsi kolom dalam database. New-SqlColumnEncryptionKey
Catatan: DBA menggunakan variasi cmdlet yang hanya membuat metadata kunci enkripsi kolom.
Di bawah sampul, cmdlet mengeluarkan pernyataan CREATE COLUMN ENCRYPTION KEY (Transact-SQL) untuk membuat metadata kunci enkripsi kolom.
Tidak Ya

Penyimpanan Sertifikat Windows dengan Pemisahan Peran (Contoh)

Administrator Keamanan

# Create a 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 column master key. 
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint

# Generate a column encryption key, encrypt it with the column master key to produce an encrypted value of the column encryption key.
$encryptedValue = New-SqlColumnEncryptionKeyEncryptedValue -TargetColumnMasterKeySettings $cmkSettings

# Share the location of the column master key and an encrypted value of the column encryption key with a DBA, via a CSV file on a share drive
$keyDataFile = "Z:\keydata.txt"
"KeyStoreProviderName, KeyPath, EncryptedValue" > $keyDataFile
$cmkSettings.KeyStoreProviderName + ", " + $cmkSettings.KeyPath + ", " + $encryptedValue >> $keyDataFile

# Read the key data back to verify
$keyData = Import-Csv $keyDataFile
$keyData.KeyStoreProviderName
$keyData.KeyPath
$keyData.EncryptedValue 

DBA

# Obtain the location of the column master key and the encrypted value of the column encryption key from your Security Administrator, via a CSV file on a share drive.
$keyDataFile = "Z:\keydata.txt"
$keyData = Import-Csv $keyDataFile

# Import the SqlServer module
Import-Module "SqlServer"

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Create a SqlColumnMasterKeySettings object for your column master key. 
$cmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $keyData.KeyStoreProviderName -KeyPath $keyData.KeyPath

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings

# Generate a  column encryption key, encrypt it with the column master key and create column encryption key metadata in the database. 
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName -EncryptedValue $keyData.EncryptedValue

Langkah berikutnya

Lihat Juga