Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Bu makalede, SqlServer PowerShell modülünü kullanarak Always Encrypted anahtarlarını döndürme adımları sağlanır. Always Encrypted için SqlServer PowerShell modülünü kullanmaya başlama hakkında bilgi için bkz. PowerShell kullanarak Always Encrypted'ı yapılandırma.
Always Encrypted anahtarlarını döndürme, mevcut bir anahtarı yeni bir anahtarla değiştirme işlemidir. Anahtarın gizliliği ihlal edildiyse veya kuruluşunuzun şifreleme anahtarlarının düzenli olarak döndürülmesi gereken ilkelerine veya uyumluluk düzenlemelerine uymak için anahtarı döndürmeniz gerekebilir.
Always Encrypted iki tür anahtar kullandığından iki üst düzey anahtar döndürme iş akışı vardır; sütun ana anahtarlarını döndürme ve sütun şifreleme anahtarlarını döndürme.
- Sütun şifreleme anahtarı döndürme - geçerli anahtarla şifrelenmiş verilerin şifresini çözmeyi ve yeni sütun şifreleme anahtarını kullanarak verileri yeniden şifrelemeyi içerir. Sütun şifreleme anahtarını döndürmek hem anahtarlara hem de veritabanına erişim gerektirdiğinden, sütun şifreleme anahtarı döndürme işlemi yalnızca rol ayrımı olmadan gerçekleştirilebilir.
- Sütun ana anahtarı döndürme - geçerli sütun ana anahtarıyla korunan sütun şifreleme anahtarlarının şifresini çözmeyi, yeni sütun ana anahtarını kullanarak bunları yeniden şifrelemeyi ve her iki anahtar türü için de meta verileri güncelleştirmeyi içerir. Sütun ana anahtarı döndürme işlemi rol ayrımı ile veya olmadan tamamlanabilir (SqlServer PowerShell modülü kullanılırken).
Rol Ayrımı Olmadan Sütun Ana Anahtar Döndürme
Bu bölümde açıklanan bir sütun ana anahtarını döndürme yöntemi, Güvenlik Yöneticisi ile DBA arasında rol ayrımını desteklemez. Aşağıdaki adımlardan bazıları, fiziksel anahtarlardaki işlemleri anahtar meta verileriyle birleştirir, bu nedenle bu iş akışı, DevOps modelini kullanan kuruluşlar için veya veritabanınızın bulutta barındırıldığı durumlarda önerilir. Birincil hedef, bulut yöneticilerinin hassas verilere erişimini kısıtlamak (ancak şirket içi veritabanı yöneticileri için bu geçerli değildir). Olası saldırganlar arasında DBA'lar varsa veya DBA'ların hassas verilere erişimi olmaması gerekiyorsa, bu önerilmez.
Görev | Makale | Düz metin anahtarlarına/anahtar deposuna erişir | Veritabanına erişir |
---|---|---|---|
Adım 1. Anahtar deposunda yeni bir sütun ana anahtarı oluşturun. Not: SqlServer PowerShell modülü bu adımı desteklemez. Bu görevi komut satırından gerçekleştirmek için anahtar deponuza özgü araçları kullanmanız gerekir. Anahtar deposu olarak Azure Key Vault kullanılırken, çok kiracılı müşteri tarafından yönetilen anahtar döndürme desteklenmez. Yeni müşteri tarafından yönetilen anahtarın mevcut anahtarla aynı kiracıda olduğundan emin olun. |
Always Encrypted için sütun ana anahtarları oluşturma ve depolama | Evet | Hayır |
Adım 2. PowerShell ortamını başlatma ve SqlServer modülünü içeri aktarma | SqlServer modülünü içeri aktarma | Hayır | Hayır |
Adım 3. Sunucunuza ve veritabanınıza bağlanın. | Veritabanına bağlanma | Hayır | Evet |
Adım 4. Yeni sütun ana anahtarınızın konumu hakkında bilgi içeren bir SqlColumnMasterKeySettings nesnesi oluşturun. SqlColumnMasterKeySettings, bellekte (PowerShell'de) bulunan bir nesnedir. Bunu oluşturmak için anahtar deponuza özgü cmdlet'i kullanmanız gerekir. | New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Hayır | Hayır |
Adım 5. Veritabanınızda yeni sütun ana anahtarınız hakkındaki meta verileri oluşturun. | New-SqlColumnMasterKey Not: Bu cmdlet, kapakların altında, anahtar meta verileri oluşturmak için CREATE COLUMN MASTER KEY (Transact-SQL) deyimini verir. |
Hayır | Evet |
Adım 6. Geçerli sütun ana anahtarınız veya yeni sütun ana anahtarınız bir anahtar kasasında veya Azure Key Vault'ta yönetilen bir HSM'de depolanıyorsa Azure'da kimlik doğrulaması yapma | Connect-AzAccount | Evet | Hayır |
Adım 7. Sütun ana anahtarınız Azure Key Vault'ta depolanıyorsa Azure Key Vault için bir erişim belirteci alın. | Get-AzAccessToken | Hayır | Hayır |
8. Adım. Şu anda eski sütun ana anahtarıyla korunan sütun şifreleme anahtarlarının her birini yeni sütun ana anahtarını kullanarak şifreleyerek döndürmeyi başlatın. Bu adımdan sonra etkilenen her sütun şifreleme anahtarı (eski sütun ana anahtarıyla ilişkili, döndürülüyor), hem eski hem de yeni sütun ana anahtarıyla şifrelenir ve veritabanı meta verilerinde iki şifreli değere sahiptir. | Invoke-SqlColumnMasterKeyRotation | Evet | Evet |
Adım 9. Veritabanında şifrelenmiş sütunları sorgulayan (ve eski sütun ana anahtarıyla korunan) tüm uygulamaların yöneticileriyle eşgüdüm sağlayın; böylece uygulamaların yeni sütun ana anahtarına erişebildiğinden emin olabilirler. | Sütun Ana Anahtarları Oluşturma ve Depolama (Always Encrypted) | Evet | Hayır |
Adım 10. Döndürmeyi tamamla Not: Bu adımı yürütmeden önce, eski sütun ana anahtarıyla korunan şifrelenmiş sütunları sorgulayan tüm uygulamaların yeni sütun ana anahtarını kullanacak şekilde yapılandırıldığından emin olun. Bu adımı erken gerçekleştirirseniz, bu uygulamalardan bazıları verilerin şifresini çözemeyebilir. Eski sütun ana anahtarıyla oluşturulan veritabanından şifrelenmiş değerleri kaldırarak döndürmeyi tamamlayın. Bu, eski sütun ana anahtarı ile koruduğu sütun şifreleme anahtarları arasındaki ilişkiyi kaldırır. |
Complete-SqlColumnMasterKeyRotation | Hayır | Evet |
Adım 10. Meta verileri eski sütun ana anahtarından kaldırın. | Remove-SqlColumnMasterKey | Hayır | Evet |
Not
Döndürmeden sonra eski sütun ana anahtarını kalıcı olarak silmemenizi kesinlikle öneririz. Bunun yerine, eski sütun ana anahtarını geçerli anahtar deposunda tutmalı veya başka bir güvenli yerde arşivlemelisiniz. Veritabanınızı yedekleme dosyasından yeni sütun ana anahtarı yapılandırılmadan önceki bir noktaya geri yüklerseniz, verilere erişmek için eski anahtara ihtiyacınız olur.
Rol Ayrımı Olmadan Sütun Ana Anahtarını Döndürme (Windows Sertifikası Örneği)
Aşağıdaki betik, mevcut bir sütun ana anahtarını (CMK1) yeni bir sütun ana anahtarıyla (CMK2) değiştiren uçtan uca bir örnektir.
# 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; TrustServerCertificate = 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
Rol Ayrımı ile Sütun Ana Anahtarı Döndürme
Bu bölümde açıklanan sütun ana anahtar döndürme iş akışı, Güvenlik Yöneticisi ile DBA arasındaki ayrımı güvence altına alır.
Önemli
Aşağıdaki tabloda (düz metin anahtarlarına veya anahtar deposuna erişen adımlar) Düz metin anahtarlarına/anahtar deposuna=Evet'e eriştiği herhangi bir adımı yürütmeden önce, PowerShell ortamının veritabanınızı barındıran bir bilgisayardan farklı güvenli bir makinede çalıştığından emin olun. Daha fazla bilgi için bkz. Anahtar Yönetimi için Güvenlik Konuları.
Bölüm 1: DBA
DBA, döndürülecek sütun master anahtarına ve mevcut sütun master anahtarıyla ilişkili etkilenen sütun şifreleme anahtarlarına dair meta verileri alır. DBA tüm bu bilgileri bir Güvenlik Yöneticisi ile paylaşır.
Görev | Makale | Düz metin anahtarlarına/anahtar deposuna erişir | Veritabanına erişir |
---|---|---|---|
Adım 1. Bir PowerShell ortamı başlatın ve SqlServer modülünü içeri aktarın. | SqlServer modülünü içeri aktarma | Hayır | Hiç kimse |
Adım 2. Sunucunuza ve bir veritabanına bağlanın. | Veritabanına bağlanma | Hayır | Evet |
Adım 3. Eski sütun ana anahtarı hakkındaki meta verileri alın. | Get-SqlColumnMasterKey | Hayır | Evet |
Adım 4. Şifrelenmiş değerleri de dahil olmak üzere eski sütun ana anahtarı tarafından korunan sütun şifreleme anahtarları hakkındaki meta verileri alın. | Get-SqlColumnEncryptionKey | Hayır | Evet |
Adım 5. Sütun ana anahtarının konumunu (sağlayıcı adı ve sütun ana anahtarının anahtar yolu) ve eski sütun ana anahtarıyla korunan ilgili sütun şifreleme anahtarlarının şifrelenmiş değerlerini paylaşın. | Aşağıdaki örneklere bakın. | Hayır | Hayır |
Bölüm 2: Güvenlik Yöneticisi
Güvenlik Yöneticisi yeni bir sütun ana anahtarı oluşturur, etkilenen sütun şifreleme anahtarlarını yeni sütun ana anahtarıyla yeniden şifreler ve yeni sütun ana anahtarı hakkındaki bilgileri ve etkilenen sütun şifreleme anahtarları için yeni şifrelenmiş değerler kümesini DBA ile paylaşır.
Görev | Makale | Düz metin anahtarlara/anahtar deposuna erişme | Veritabanına erişir |
---|---|---|---|
Adım 1. DBA'nızdan eski sütun ana anahtarının konumunu ve eski sütun ana anahtarıyla korunan ilgili sütun şifreleme anahtarlarının şifrelenmiş değerlerini alın. | YOK Aşağıdaki örneklere bakın. |
Hayır | Hayır |
Adım 2. Anahtar deposunda yeni bir sütun ana anahtarı oluşturun. Not: SqlServer modülü bu adımı desteklemez. Bu görevi bir komut satırından gerçekleştirmek için, anahtar deponuzun türüne özgü araçları kullanmanız gerekir. Anahtar deposu olarak Azure Key Vault kullanılırken, çok kiracılı müşteri tarafından yönetilen anahtar döndürme desteklenmez. Yeni müşteri tarafından yönetilen anahtarın mevcut anahtarla aynı kiracıda olduğundan emin olun. |
Always Encrypted için sütun ana anahtarları oluşturma ve depolama | Evet | Hayır |
Adım 3. Bir PowerShell ortamı başlatın ve SqlServer modülünü içeri aktarın. | SqlServer modülünü içeri aktarma | Hayır | Hayır |
Adım 4. Eski sütun ana anahtarınızın konumu hakkında bilgi içeren bir SqlColumnMasterKeySettings nesnesi oluşturun. SqlColumnMasterKeySettings, bellekte (PowerShell'de) bulunan bir nesnedir. | New-SqlColumnMasterKeySettings | Hayır | Hayır |
Adım 5. Yeni sütun ana anahtarınızın konumu hakkında bilgi içeren bir SqlColumnMasterKeySettings nesnesi oluşturun. SqlColumnMasterKeySettings, bellekte (PowerShell'de) bulunan bir nesnedir. Bunu oluşturmak için anahtar deponuza özgü cmdlet'i kullanmanız gerekir. | New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Hayır | Hayır |
Adım 6. Eski (geçerli) sütun ana anahtarınız veya yeni sütun ana anahtarınız bir anahtar kasasında veya Azure Key Vault'ta yönetilen bir HSM'de depolanıyorsa Azure'da kimlik doğrulaması yapma. | Connect-AzAccount | Evet | Hayır |
Adım 7. Sütun ana anahtarınız Azure Key Vault'ta depolanıyorsa Azure Key Vault için bir erişim belirteci alın. | Get-AzAccessToken | Hayır | Hayır |
8. Adım. Yeni sütun ana anahtarını kullanarak şu anda eski sütun ana anahtarıyla korunan sütun şifreleme anahtarının her değerini yeniden şifreleyin. | New-SqlColumnEncryptionKeyEncryptedValue Not: Bu cmdlet'i çağırırken, hem eski hem de yeni sütun ana anahtarı için SqlColumnMasterKeySettings nesnelerini ve sütun şifreleme anahtarının değerini yeniden şifreleyin. |
Evet | Hayır |
Adım 9. Yeni sütun ana anahtarının konumunu (sağlayıcı adı ve sütun ana anahtarının anahtar yolu) ve sütun şifreleme anahtarlarının yeni şifrelenmiş değerleri kümesini DBA'nızla paylaşın. | Aşağıdaki örneklere bakın. | Hayır | Hayır |
Not
Döndürmeden sonra eski sütun ana anahtarını kalıcı olarak silmemenizi kesinlikle öneririz. Bunun yerine, eski sütun ana anahtarını geçerli anahtar deposunda tutmalı veya başka bir güvenli yerde arşivlemelisiniz. Veritabanınızı yedekleme dosyasından yeni sütun ana anahtarı yapılandırılmadan önceki bir noktaya geri yüklerseniz, verilere erişmek için eski anahtara ihtiyacınız olur.
Bölüm 3: DBA
DBA, yeni sütun ana anahtarı için meta veriler oluşturur ve etkilenen sütun şifreleme anahtarlarının meta verilerini güncelleştirerek yeni şifrelenmiş değerler kümesini ekler. Bu adımda DBA, uygulamanın yeni sütun ana anahtarına erişebildiğinden emin olmak için şifreleme sütunlarını sorgulayan uygulamaların yöneticileriyle de eşgüdüm sağlar. Tüm uygulamalar yeni sütun ana anahtarını kullanacak şekilde ayarlandıktan sonra, DBA eski şifrelenmiş değerler kümesini ve eski sütun ana anahtarı meta verilerini kaldırır.
Görev | Makale | Düz metin anahtarlara/anahtar deposuna erişme | Veritabanına erişir |
---|---|---|---|
Adım 1. Güvenlik Yöneticinizden yeni sütun ana anahtarının konumunu ve eski sütun ana anahtarıyla korunan ilgili sütun şifreleme anahtarlarının yeni şifrelenmiş değerleri kümesini alın. | Aşağıdaki örneklere bakın. | Hayır | Hayır |
Adım 2. Bir PowerShell ortamı başlatın ve SqlServer modülünü içeri aktarın. | SqlServer modülünü içeri aktarma | Hayır | Hayır |
Adım 3. Sunucunuza ve bir veritabanına bağlanın. | Veritabanına bağlanma | Hayır | Evet |
Adım 4. Yeni sütun ana anahtarınızın konumu hakkında bilgi içeren bir SqlColumnMasterKeySettings nesnesi oluşturun. SqlColumnMasterKeySettings, bellekte (PowerShell'de) bulunan bir nesnedir. | New-SqlColumnMasterKeySettings | Hayır | Hayır |
Adım 5. Veritabanınızda yeni sütun ana anahtarınız hakkındaki meta verileri oluşturun. | New-SqlColumnMasterKey Not: Bu cmdlet'in arka planda, anahtar meta verileri oluşturmak için CREATE COLUMN MASTER KEY (Transact-SQL) komutunu çalıştırır. |
Hayır | Evet |
Adım 6. Eski sütun ana anahtarıyla korunan sütun şifreleme anahtarları hakkındaki meta verileri alın. | Get-SqlColumnEncryptionKey | Hayır | Evet |
Adım 7. Etkilenen her sütun şifreleme anahtarının meta verilerine yeni bir şifrelenmiş değer (yeni sütun ana anahtarı kullanılarak oluşturulur) ekleyin. | Add-SqlColumnEncryptionKeyValue | Hayır | Evet |
8. Adım. Veritabanında şifrelenmiş sütunları sorgulayan (ve eski sütun ana anahtarıyla korunan) tüm uygulamaların yöneticileriyle eşgüdüm sağlayın; böylece uygulamaların yeni sütun ana anahtarına erişebildiğinden emin olabilirler. | Sütun Ana Anahtarlarını Oluşturma ve Depolama (Always Encrypted) | Hayır | Hayır |
Adım 9. Eski sütun ana anahtarıyla ilişkili şifrelenmiş değerleri veritabanından kaldırarak döndürme işlemini tamamlayın. Not: Bu adımı yürütmeden önce, eski sütun ana anahtarıyla korunan şifrelenmiş sütunları sorgulayan tüm uygulamaların yeni sütun ana anahtarını kullanacak şekilde yapılandırıldığından emin olun. Bu adımı erken gerçekleştirirseniz, bu uygulamalardan bazıları verilerin şifresini çözemeyebilir. Bu adım, eski sütun ana anahtarı ile koruduğu sütun şifreleme anahtarları arasındaki ilişkiyi kaldırır. |
Complete-SqlColumnMasterKeyRotation Alternatif olarak Remove-SqlColumnEncryptionKeyValue kullanabilirsiniz |
Hayır | Evet |
Adım 10. Eski sütun ana anahtarı meta verilerini veritabanından kaldırma | Remove-SqlColumnMasterKey | Hayır | Evet |
Rol Ayrımı ile Sütun Ana Anahtarını Döndürme (Windows Sertifikası Örneği)
Aşağıdaki betik, Windows Sertifika deposunda sertifika olan yeni bir sütun ana anahtarı oluşturmaya, mevcut (geçerli) bir sütun ana anahtarını döndürerek yeni sütun ana anahtarıyla değiştirmek için uçtan uca bir örnektir. Betik, hedef veritabanının bazı sütun şifreleme anahtarlarını şifreleyen CMK1 adlı (döndürülecek) sütun ana anahtarını içerdiği varsayılır.
Bölüm 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; TrustServerCertificate = 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
}
}
Bölüm 2: Güvenlik Yöneticisi
# 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
Bölüm 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; TrustServerCertificate = 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
Sütun Şifreleme Anahtarını Döndürme
Sütun şifreleme anahtarını döndürmek, tüm sütunlardaki verilerin şifresini çözmeyi, döndürülecek anahtarla şifrelenmesini ve yeni sütun şifreleme anahtarını kullanarak verileri yeniden şifrelemeyi içerir. Bu döndürme iş akışı hem anahtarlara hem de veritabanına erişim gerektirir ve bu nedenle rol ayrımı ile gerçekleştirilemez. Sütun şifreleme anahtarının döndürülmesi, döndürülen anahtarla şifrelenmiş sütunları içeren tablolar büyükse uzun sürebilir. Bu nedenle kuruluşunuzun bir sütun şifreleme anahtarı döndürmesini dikkatle planlaması gerekir.
Çevrimdışı veya çevrimiçi bir yaklaşım kullanarak sütun şifreleme anahtarını döndürebilirsiniz. Önceki yöntem daha hızlı olabilir, ancak uygulamalarınız etkilenen tablolara yazamaz. İkinci yaklaşım büyük olasılıkla daha uzun sürer, ancak etkilenen tabloların uygulamalar tarafından kullanılamadığı zaman aralığını sınırlayabilirsiniz. Daha fazla bilgi için bkz. PowerShell ve Set-SqlColumnEncryptionile Always Encrypted kullanarak sütun şifrelemesini yapılandırma.
Görev | Makale | Düz metin anahtarlarına/anahtar deposuna erişir | Veritabanına erişir |
---|---|---|---|
Adım 1. Bir PowerShell ortamı başlatın ve SqlServer modülünü içeri aktarın. | SqlServer modülünü içeri aktarma | Hayır | Hayır |
Adım 2. Sunucunuza ve bir veritabanına bağlanın. | Veritabanına bağlanma | Hayır | Evet |
Adım 3. Sütun ana anahtarınız (döndürülecek sütun şifreleme anahtarını korumak) Azure Key Vault'ta bir anahtar kasasında veya yönetilen bir HSM'de depolanıyorsa Azure'da kimlik doğrulaması yapma. | Connect-AzAccount | Evet | Hayır |
Adım 4. Sütun ana anahtarınız Azure Key Vault'ta depolanıyorsa Azure Key Vault için bir erişim belirteci alın. | Get-AzAccessToken | Hayır | Hayır |
Adım 5. Yeni bir sütun şifreleme anahtarı oluşturun, bunu sütun ana anahtarıyla şifreleyin ve veritabanında sütun şifreleme anahtarı meta verileri oluşturun. |
New-SqlColumnEncryptionKey Not: Dahili olarak bir sütun şifreleme anahtarı oluşturan ve şifreleyen cmdlet'in bir çeşitlemesi kullanın. Bu cmdlet, anahtar meta verilerini oluşturmak için CREATE COLUMN ENCRYPTION KEY (Transact-SQL) ifadesini kullanır. |
Evet | Evet |
Adım 6. Eski sütun şifreleme anahtarıyla şifrelenmiş tüm sütunları bulun. | SQL Server Yönetim Nesneleri (SMO) Programlama Kılavuzu | Hayır | Evet |
Adım 7. Etkilenen her sütun için bir SqlColumnEncryptionSettings nesnesi oluşturun. SqlColumnEncryptionSettings bellekte (PowerShell'de) bulunan bir nesnedir. Bir sütun için hedef şifreleme düzenini belirtir. Bu durumda, nesne etkilenen sütunun yeni sütun şifreleme anahtarı kullanılarak şifrelenmesi gerektiğini belirtmelidir. | New-SqlColumnEncryptionSettings | Hayır | Hayır |
8. Adım. Yeni sütun şifreleme anahtarını kullanarak 5. adımda tanımlanan sütunları yeniden şifreleyin. | Set-SqlColumnEncryption Not: Bu adım uzun sürebilir. Uygulamalarınız, seçtiğiniz yaklaşıma (çevrimiçi veya çevrimdışı) bağlı olarak tüm işlem veya bir bölümü aracılığıyla tablolara erişemez. |
Evet | Evet |
Adım 9. Eski sütun şifreleme anahtarının meta verilerini kaldırın. | Remove-SqlColumnEncryptionKey | Hayır | Evet |
Örnek - Sütun Şifreleme Anahtarını Döndürme
Aşağıdaki betik, bir sütun şifreleme anahtarını döndürmeyi gösterir. Betik, hedef veritabanında bazı sütunların CEK1 adlı bir sütun şifreleme anahtarıyla şifrelendiğini varsayar. CEK1, döndürülecek olan ve CMK1 adlı bir sütun ana anahtarı kullanılarak korunan bir anahtardır. Sütun ana anahtarı, Azure Key Vault'ta depolanmamaktadır.
# 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; TrustServerCertificate = 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
Sonraki Adımlar
- SQL Server Management Studio ile Always Encrypted kullanarak sütunları sorgulama
- Always Encrypted kullanarak uygulama geliştirme
Ayrıca Bkz.
- Always Encrypted
- Always Encrypted için anahtar yönetimine genel bakış
- PowerShell kullanarak Always Encrypted'ı yapılandırma
- SQL Server Management Studio kullanarak Always Encrypted anahtarlarını döndürme
- CREATE COLUMN MASTER KEY (Transact-SQL)
- DROP COLUMN MASTER KEY (Transact-SQL)
- CREATE COLUMN ENCRYPTION KEY (Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY (Transact-SQL)
- DROP COLUMN ENCRYPTION KEY (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sys.column_encryption_keys (Transact-SQL)