Aracılığıyla paylaş


PowerShell kullanarak Always Encrypted anahtarlarını döndürme

Şunlar için geçerlidir:SQL ServerAzure 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

Ayrıca Bkz.