Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Dieser Artikel enthält die Schritte zum Festlegen der Always Encrypted-Zielkonfiguration für Datenbankspalten mithilfe des Cmdlet Set-SqlColumnEncryption (im PowerShell-Modul SqlServer ). Das Cmdlet Set-SqlColumnEncryption ändert sowohl das Schema der Zieldatenbank sowie die in den ausgewählten Spalten gespeicherten Daten. Die in einer Spalte gespeicherten Daten können verschlüsselt, erneut verschlüsselt oder entschlüsselt werden, je nachdem, welche Zielverschlüsselungseinstellungen für die Spalten angegeben wurden und wie die aktuelle Verschlüsselungskonfiguration aussieht. Um in-situ-kryptografische Vorgänge mithilfe einer Enklave auszulösen, muss Set-SqlColumnEncryption eine Datenbankverbindung verwenden, die mit einer Verbindungszeichenfolge mit dem Nachweisprotokoll und optional den Schlüsselwörtern der Nachweis-URL erstellt wurde.
Voraussetzungen
Stellen Sie Folgendes sicher, um die Zielverschlüsselungskonfiguration festzulegen:
- ein Enklave-aktivierter Spaltenverschlüsselungsschlüssel ist in der Datenbank konfiguriert (wenn Sie eine Spalte ver- oder entschlüsseln). Weitere Einzelheiten finden Sie unter Verwalten von Schlüsseln für Always Encrypted mit Secure Enclaves.
- Sie sind mit der Datenbank verbunden, wobei Always Encrypted aktiviert ist, und die in der Verbindungszeichenfolge angegebenen Nachweiseigenschaften.
- Sie müssen von dem Computer aus, auf dem die PowerShell-Cmdlets ausgeführt werden, Zugriff auf den Spaltenhauptschlüssel jeder Spalte haben, die Sie verschlüsseln, erneut verschlüsseln oder entschlüsseln möchten.
- Sie verwenden SqlServer PowerShell-Modul, Version 22.0.50 oder höher. Verwenden Sie für die direkte Onlineverschlüsselung die SqlServer PowerShell-Modulversion 22.3.0 oder höher.
Hinweis
Microsoft empfiehlt die Verwendung von PowerShell 7 oder höher beim Ausführen von Always Encrypted PowerShell-Skripts. PowerShell 7 bietet eine verbesserte plattformübergreifende Unterstützung, bessere Leistung und die neueste Kompatibilität mit dem SqlServer-Modul (v22+), die für viele Always Encrypted-Szenarien erforderlich ist.
Sicherheitshinweise
Das Cmdlet Set-SqlColumnEncryption , das zum Konfigurieren der Verschlüsselung von Datenbankspalten verwendet wird, verarbeitet sowohl Always Encrypted-Schlüssel als auch die in Datenbankspalten gespeicherten Daten. Es ist daher wichtig, das Cmdlet auf einem sicheren Computer auszuführen. Wenn sich Ihre Datenbank in SQL Server befindet, führen Sie das Cmdlet auf einem anderen Computer als dem Computer aus, der die SQL Server-Instanz hostet. Der primäre Zweck von Always Encrypted ist, sicherzustellen, dass verschlüsselte sensible Daten sicher sind, wenn das Datenbanksystem kompromittiert wird. Daher kann das Ausführen eines PowerShell-Skripts, das Schlüssel und/oder sensible Daten auf dem SQL Server-Computer verarbeitet, die Vorteile der Funktion einschränken oder zunichte machen.
| Aufgabe | Artikel | Greift auf Klartextschlüssel/-schlüsselspeicher zu | Greift auf Datenbank zu |
|---|---|---|---|
| Schritt 1. Starten Sie eine PowerShell-Umgebung, und importieren Sie das SqlServer-Modul. | Importieren des SqlServer-Moduls | No | No |
| Schritt 2. Stellen Sie eine Verbindung mit Ihrem Server und Ihrer Datenbank her. | Herstellen einer Verbindung mit einer Datenbank | No | Ja |
| Schritt 3. Authentifizieren Sie sich bei Azure, wenn Ihr Spaltenhauptschlüssel (der den Spaltenverschlüsselungsschlüssel schützt, der rotiert werden soll) in Azure Key Vault gespeichert ist. | Connect-AzAccount | Ja | No |
| Schritt 4. Rufen Sie ein Zugriffstoken für Azure Key Vaults ab. | Get-AzAccessToken | No | No |
| Schritt 5. Erstellen Sie ein Array von SqlColumnEncryptionSettings-Objekten – eines für jede Datenbankspalte, die Sie verschlüsseln, erneut verschlüsseln oder entschlüsseln möchten. SqlColumnMasterKeySettings ist ein Objekt, das im Arbeitsspeicher (in PowerShell) vorhanden ist. Es gibt das Zielverschlüsselungsschema für eine Spalte an. | New-SqlColumnEncryptionSettings | No | No |
| Schritt 6: Legen Sie die gewünschte Verschlüsselungskonfiguration fest, die in dem Array von SqlColumnMasterKeySettings-Objekten angegeben ist, das Sie im vorherigen Schritt erstellt haben. Eine Spalte wird je nach den angegebenen Zieleinstellungen und der aktuellen Verschlüsselungskonfiguration der Spalte verschlüsselt, erneut verschlüsselt oder entschlüsselt. |
Set-SqlColumnEncryption Hinweis: Dieser Schritt kann lange dauern. Ihre Anwendungen können je nach Ansatz (online oder offline) nicht über den gesamten Vorgang oder einen Teil davon auf die Tabellen zugreifen. |
Ja | Ja |
Verschlüsseln von Spalten mithilfe von VBS-Enklaven
Das folgende Beispiel veranschaulicht das Festlegen der Zielverschlüsselungskonfiguration für einige Spalten. Wenn eine der Spalten noch nicht verschlüsselt ist, wird sie verschlüsselt. Wenn eine Spalte bereits mit einem anderen Schlüssel und/oder einem anderen Verschlüsselungstyp verschlüsselt ist, wird Sie entschlüsselt und dann mit dem angegebenen Zielschlüssel/-typ erneut verschlüsselt. VBS-Enklaven unterstützen derzeit keinen Nachweis. Der Parameter "EnclaveAttestationProtocol" sollte auf None festgelegt werden, und die EnclaveAttestationUrl ist nicht erforderlich.
# 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.'
Entschlüsseln von Spalten – Beispiel
Das folgende Beispiel zeigt, wie alle Spalten, die derzeit in einer Datenbank verschlüsselt sind, entschlüsselt werden können.
# 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
Verschlüsseln von Spalten mithilfe von SGX-Enklaven
Das folgende Beispiel veranschaulicht das Festlegen der Zielverschlüsselungskonfiguration für einige Spalten. Wenn eine der Spalten noch nicht verschlüsselt ist, wird sie verschlüsselt. Wenn eine Spalte bereits mit einem anderen Schlüssel und/oder einem anderen Verschlüsselungstyp verschlüsselt ist, wird Sie entschlüsselt und dann mit dem angegebenen Zielschlüssel/-typ erneut verschlüsselt. Zum Auslösen von kryptografischen Vorgängen an Ort und Stelle unter Verwendung einer Enklave sind die Parameter EnclaveAttestationProtocol und EnclaveAttestationUrl erforderlich.
# 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.'
Entschlüsseln von Spalten – Beispiel
Das folgende Beispiel zeigt, wie alle Spalten, die derzeit in einer Datenbank verschlüsselt sind, entschlüsselt werden können.
# 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
Nächste Schritte
Siehe auch
- Always Encrypted mit Secure Enclaves
- Verwalten von Schlüsseln für Always Encrypted mit Secure Enclaves
- Direkte Konfiguration der Spaltenverschlüsselung mit Transact-SQL
- Direktes Konfigurieren der Spaltenverschlüsselung mit einem DAC-Paket
- Direktes Konfigurieren der Spaltenverschlüsselung mit dem Always Encrypted-Assistenten in SSMS