PowerShell ile sütun şifrelemeyi yerinde yapılandırma

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Bu makalede, Set-SqlColumnEncryption cmdlet'ini (SqlServer PowerShell modülünde) kullanarak veritabanı sütunları için hedef Always Encrypted yapılandırmasını ayarlama adımları sağlanır. Set-SqlColumnEncryption cmdlet'i hem hedef veritabanının şemasını hem de seçili sütunlarda depolanan verileri değiştirir. Sütunda depolanan veriler, sütunlar için belirtilen hedef şifreleme ayarlarına ve geçerli şifreleme yapılandırmasına bağlı olarak şifrelenebilir, yeniden şifrelenebilir veya şifresi çözülebilir. Bir kapanım kullanarak yerinde şifreleme işlemlerini tetiklemek için Set-SqlColumnEncryption, Kanıtlama Protokolü ve isteğe bağlı olarak Kanıtlama URL'si anahtar sözcükleri içeren bir bağlantı dizesiyle oluşturulan bir veritabanı bağlantısını kullanmalıdır.

Önkoşullar

Hedef şifreleme yapılandırmasını ayarlamak için şunları yapmanız gerekir:

  • veritabanında enclave özellikli bir sütun şifreleme anahtarı yapılandırılır (bir sütunu şifreliyor veya yeniden şifreliyorsanız). Ayrıntılar için bkz. Güvenli bölgelerle Always Encrypted anahtarlarını yönetme.
  • Always Encrypted'ın etkin olduğu veritabanına ve bağlantı dizesinde belirtilen kanıtlama özelliklerine bağlısınız.
  • Şifrelemek, yeniden şifrelemek veya şifresini çözmek istediğiniz her sütunun ana sütununa PowerShell cmdlet'lerini çalıştıran bilgisayardan erişebilirsiniz.
  • SqlServer PowerShell modülü sürüm 22.0.50 veya üzerini kullanırsınız. Yerinde çevrimiçi şifreleme için SqlServer PowerShell modülü sürüm 22.3.0 veya üzerini kullanın.

Uyarı

Microsoft, Always Encrypted PowerShell betiklerini çalıştırırken PowerShell 7 veya üzerini kullanmanızı önerir. PowerShell 7, birçok Always Encrypted senaryosu için gereken gelişmiş platformlar arası destek, daha iyi performans ve SqlServer modülü (v22+) ile en son uyumluluk sağlar.

Güvenlikle İlgili Dikkat Edilmesi Gerekenler

Veritabanı sütunları için şifrelemeyi yapılandırmak için kullanılan Set-SqlColumnEncryption cmdlet'i hem Always Encrypted anahtarlarını hem de veritabanı sütunlarında depolanan verileri işler. Bu nedenle, cmdlet'i güvenli bir bilgisayarda çalıştırmanız önemlidir. Veritabanınız SQL Server üzerindeyse, cmdlet'i, SQL Server örneğinizi barındıran bilgisayardan farklı bir bilgisayardan yürütün. Always Encrypted'ın birincil hedefi, veritabanı sistemi tehlikeye girmiş olsa bile şifrelenmiş hassas verilerin güvenli olmasını sağlamak olduğundan, SQL Server bilgisayarında anahtarları ve/veya hassas verileri işleyen bir PowerShell betiğini yürütmek özelliğin avantajlarını azaltabilir veya alt edebilir.

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 veritabanınıza bağlanma 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 depolanıyorsa Azure'da kimlik doğrulaması yapma Connect-AzAccount Evet Hayır
Adım 4. Azure Key Vaults için erişim belirteci alma. Get-AzAccessToken Hayır Hayır
Adım 5. Şifrelemek, yeniden şifrelemek veya şifresini çözmek istediğiniz her veritabanı sütunu için bir sqlColumnEncryptionSettings nesnesi dizisi oluşturma. SqlColumnMasterKeySettings, bellekte (PowerShell'de) bulunan bir nesnedir. Bir sütun için hedef şifreleme düzenini belirtir. New-SqlColumnEncryptionSettings Hayır Hayır
6. Adım. Önceki adımda oluşturduğunuz SqlColumnMasterKeySettings nesneleri dizisinde belirtilen istenen şifreleme yapılandırmasını ayarlayın. Belirtilen hedef ayarlara ve sütunun geçerli şifreleme yapılandırmasına bağlı olarak bir sütun şifrelenir, yeniden şifrelenir veya şifresi çözülür. SqlSütunŞifrelemeAyarla

Not: Bu adım uzun sürebilir. Uygulamalarınız, yaklaşıma bağlı olarak (çevrimiçi veya çevrimdışı), seçtiğiniz işlemin tamamı veya bir bölümü aracılığıyla tablolara erişemez.
Evet Evet

VBS kuşatmalarını kullanarak sütunları şifreleme

Aşağıdaki örnekte, birkaç sütun için hedef şifreleme yapılandırmasını ayarlama gösterilmektedir. İki sütundan biri henüz şifrelenmemişse şifrelenir. Herhangi bir sütun farklı bir anahtar ve/veya farklı bir şifreleme türü kullanılarak zaten şifrelenmişse, şifresi çözülür ve belirtilen hedef anahtar/türle yeniden şifrelenir. VBS yerleşimleri şu anda doğrulamayı desteklememektedir. EnclaveAttestationProtocol parametresi None olarak ayarlanmalıdır ve EnclaveAttestationUrl gerekli değildir.

# Import modules
Import-Module SqlServer
Import-Module Az.Accounts

# Edit these values.
$serverName = '<your-server>.database.windows.net'
$databaseName = 'ContosoHR'
$cekName = 'CEK'
$subscriptionId = '<your-subscription-id>'

# Columns to encrypt with the CEK.
$columnsToEncrypt = @(
    'dbo.Employees.SSN',
    'dbo.Employees.Salary'
)

# Sign in with Microsoft Entra and select subscription.
Connect-AzAccount
Set-AzContext -SubscriptionId $subscriptionId

# Token needed when CEK uses Azure Key Vault CMK.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl 'https://vault.azure.net').Token

# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr

# Build encryption settings for target columns.
$columnEncryptionSettings = @(
    $columnsToEncrypt | ForEach-Object {
        New-SqlColumnEncryptionSettings -ColumnName $_ -EncryptionType Randomized -EncryptionKey $cekName
    }
)

# Encrypt or re-encrypt the columns.
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $columnEncryptionSettings -EnclaveAttestationProtocol None -LogFileDirectory . -KeyVaultAccessToken $keyVaultAccessToken

Write-Host 'Done.'

Sütunların şifresini çözme - Örnek

Aşağıdaki örnekte, bir veritabanında şu anda şifrelenmiş olan tüm sütunların şifresinin nasıl çözülmüş olduğu gösterilmektedir.

# Import modules
Import-Module SqlServer -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0

#Connect to Azure
Connect-AzAccount

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

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr

# Find all encrypted columns, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$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) {
            $threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name 
            $ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType "Plaintext" 
        }
    }
}

# Decrypt all columns.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -LogFileDirectory . -EnclaveAttestationProtocol "None" -KeyVaultAccessToken $keyVaultAccessToken

SGX güvenli alanlarını kullanarak sütunları şifreleyin

Aşağıdaki örnekte, birkaç sütun için hedef şifreleme yapılandırmasını ayarlama gösterilmektedir. İki sütundan biri henüz şifrelenmemişse şifrelenir. Herhangi bir sütun farklı bir anahtar ve/veya farklı bir şifreleme türü kullanılarak zaten şifrelenmişse, şifresi çözülür ve belirtilen hedef anahtar/türle yeniden şifrelenir. Bir kapanım kullanarak yerinde şifreleme işlemlerini tetikleyebilmek için EnclaveAttestationProtocol ve EnclaveAttestationUrl parametreleri gereklidir.

Important

Always Encrypted with Intel Software Guard Extensions (Intel SGX) enklavları 31 Ekim 2027'de destek sonuna ulaşıyor. Etkilenen veritabanlarını bu tarihten önce taşıyın. 31 Ekim 2027'den sonra, Azure DC serisi hesaplama katmanında kalan herhangi bir veritabanını otomatik olarak desteklenen standart seri (DC olmayan) hesaplama katmanına taşır ve sanallaştırma tabanlı güvenlik (VBS) enklavlarını etkinleştirir. Göç seçenekleri için Always Encrypted with Intel SGX enclaves migration guide'a bakınız.

# Import modules
Import-Module SqlServer
Import-Module Az.Accounts

# Edit these values.
$serverName = '<your-server>.database.windows.net'
$databaseName = 'ContosoHR'
$cekName = 'CEK'
$subscriptionId = '<your-subscription-id>'

# Columns to encrypt with the CEK.
$columnsToEncrypt = @(
    'dbo.Employees.SSN',
    'dbo.Employees.Salary'
)

# Sign in with Microsoft Entra and select subscription.
Connect-AzAccount
Set-AzContext -SubscriptionId $subscriptionId

# Token needed when CEK uses Azure Key Vault CMK.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl 'https://vault.azure.net').Token

# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr

# Build encryption settings for target columns.
$columnEncryptionSettings = @(
    $columnsToEncrypt | ForEach-Object {
        New-SqlColumnEncryptionSettings -ColumnName $_ -EncryptionType Randomized -EncryptionKey $cekName
    }
)
# Encrypt or re-encrypt the columns.
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $columnEncryptionSettings -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>"   -KeyVaultAccessToken $keyVaultAccessToken -LogFileDirectory .

Write-Host 'Done.' 

Sütunların şifresini çözme - Örnek

Aşağıdaki örnekte, bir veritabanında şu anda şifrelenmiş olan tüm sütunların şifresinin nasıl çözülmüş olduğu gösterilmektedir.

# Import modules
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0

#Connect to Azure
Connect-AzAccount

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

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr

# Find all encrypted columns, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$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) {
            $threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name 
            $ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType "Plaintext" 
        }
    }
}

# Decrypt all columns.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -LogFileDirectory . -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>" -KeyVaultAccessToken $keyVaultAccessToken

Sonraki adım