Ketentuan tombol Always Encrypted menggunakan PowerShell
Berlaku untuk: SQL ServerAzure SQL Database Azure 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:
- Lingkungan PowerShell berjalan pada komputer aman yang berbeda dari komputer yang menghosting database Anda.
- 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. | 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. | 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
- Mengonfigurasi enkripsi kolom menggunakan Always Encrypted dengan PowerShell
- Memutar kunci Always Encrypted menggunakan PowerShell
- Mengembangkan aplikasi menggunakan Always Encrypted
Lihat Juga
- Always Encrypted
- Ringkasan manajemen kunci untuk Always Encrypted
- Membuat dan menyimpan kunci master kolom untuk Always Encrypted
- Mengonfigurasi Always Encrypted menggunakan PowerShell
- Menyediakan kunci Always Encrypted menggunakan SQL Server Management Studio
- BUAT KUNCI MASTER KOLOM (Transact-SQL)
- JATUHKAN KUNCI MASTER KOLOM (Transact-SQL)
- BUAT KUNCI ENKRIPSI KOLOM (Transact-SQL)
- UBAH KUNCI ENKRIPSI KOLOM (Transact-SQL)
- JATUHKAN KUNCI ENKRIPSI KOLOM (Transact-SQL)
- sys.column_master_keys (T-SQL)
- sys.column_encryption_keys (T-SQL)