Konfigurieren von Always Encrypted mithilfe von PowerShell

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Das SqlServer PowerShell-Modul stellt Cmdlets zum Konfigurieren von Always Encrypted sowohl in Azure SQL-Datenbank als auch in SQL Server bereit.

Sicherheitsüberlegungen bei der Verwendung von PowerShell zum Konfigurieren von Always Encrypted

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 oder sensible Daten auf dem SQL Server-Computer verarbeitet, die Vorteile der Funktion einschränken oder zunichte machen. Weitere sicherheitsbezogene Empfehlungen finden Sie unter "Sicherheitsüberlegungen für die Schlüsselverwaltung".

Sie können PowerShell verwenden, um Always Encrypted-Schlüssel mit oder ohne Rollentrennung zu verwalten und so Kontrolle darüber zu erhalten, wer Zugriff auf die tatsächlichen Verschlüsselungsschlüssel im Schlüsselspeicher und auf die Datenbank erhält.

Weitere Empfehlungen finden Sie unter Sicherheitsüberlegungen für die Schlüsselverwaltung.

Voraussetzungen

Installieren Sie das SqlServer PowerShell-Modulversion 22.0.50 oder höher auf einem sicheren Computer, der NICHT der Hostcomputer Ihrer SQL Server-Instanz ist. Das Modul kann direkt aus der PowerShell Gallery installiert werden. In den Downloadanweisungen finden Sie weitere Informationen.

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.

Importieren des SqlServer-Moduls

So laden Sie das SqlServer-Modul:

  1. Verwenden Sie das Cmdlet Set-ExecutionPolicy , um die entsprechende Skriptausführungsrichtlinie festzulegen.
  2. Verwenden Sie das Cmdlet Import-Module zum Importieren des SqlServer-Moduls.

In diesem Beispiel wird das SqlServer-Modul geladen.

# Import the SQL Server Module.  
Import-Module "SqlServer" -MinimumVersion 22.0.50

Herstellen einer Verbindung mit einer Datenbank

Einige der Always Encrypted-Cmdlets arbeiten mit Daten oder Metadaten in der Datenbank und erfordern, dass Sie zuerst eine Verbindung mit der Datenbank herstellen. Es werden zwei Methoden empfohlen, um bei der Konfiguration von Always Encrypted mithilfe des SqlServer-Moduls eine Verbindung mit einer Datenbank herzustellen:

  1. Stellen Sie mithilfe des Cmdlets Get-SqlDatabase eine Verbindung her.
  2. Stellen Sie mithilfe des SQL Server PowerShell-Anbieters eine Verbindung her.

Verwenden von „Get-SqlDatabase“

Mit dem Cmdlet Get-SqlDatabase können Sie eine Verbindung mit einer Datenbank in SQL Server oder in Azure SQL-Datenbank herstellen. Das Cmdlet gibt ein Datenbankobjekt zurück, das Sie mithilfe des InputObject-Parameters eines Cmdlets übergeben können, das die Verbindung mit der Datenbank herstellt.

Verwenden von SQL Server PowerShell

# Import the SqlServer module
Import-Module "SqlServer" -MinimumVersion 22.0.50

# Connect to your database
# Set the valid server name, database name and authentication keywords in the connection string
$serverName = "<Azure SQL server name>.database.windows.net"
$databaseName = "<database name>"
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Interactive"

try {
	$database = Get-SqlDatabase -ConnectionString $connStr -Encrypt Mandatory -ErrorAction Stop
}
catch {
	Write-Error "Failed to connect. Verify server name, database name, Azure SQL firewall access, and Microsoft Entra permissions."
	throw
}

# List column master keys for the specified database.
Get-SqlColumnMasterKey -InputObject $database

Alternativ können Sie Pipes verwenden:

$database | Get-SqlColumnMasterKey

Verwenden eines SQL Server PowerShell-Anbieters

Der SQL Server PowerShell-Anbieter macht die Hierarchie von SQL Server-Objekten in Pfaden auf eine Weise verfügbar, die der Verwendung von Dateisystempfaden ähnelt. Sie können mit SQL Server PowerShell in den Pfaden navigieren, indem Sie Windows PowerShell-Aliase ähnlich den Befehlen verwenden, die Sie normalerweise zum Navigieren in den Dateisystempfaden verwenden. Nachdem Sie zur Zielinstanz und zur Datenbank navigiert sind, gelten die nachfolgenden Cmdlets für diese Datenbank, wie im folgenden Beispiel gezeigt.

Hinweis

Diese Methode zum Herstellen einer Verbindung mit einer Datenbank funktioniert nur für SQL Server (sie wird in der Azure SQL-Datenbank nicht unterstützt).

# Import the SqlServer module.
Import-Module "SqlServer" -MinimumVersion 22.0.50
# Navigate to the database in the remote instance.
cd SQLSERVER:\SQL\servercomputer\DEFAULT\Databases\yourdatabase
# List column master keys in the above database.
Get-SqlColumnMasterKey

Alternativ können Sie einen Datenbankpfad mithilfe des allgemeinen Path -Parameters angeben, statt zur Datenbank zu navigieren.

# Import the SqlServer module.
Import-Module "SqlServer" -MinimumVersion 22.0.50
# List column master keys for the specified database.
Get-SqlColumnMasterKey -Path SQLSERVER:\SQL\servercomputer\DEFAULT\Databases\yourdatabase

Immer verschlüsselte Aufgaben mit PowerShell

Referenz zu Always Encrypted-Cmdlets

Die folgenden PowerShell-Cmdlets sind für Always Encrypted verfügbar:

CMDLET Beschreibung
Add-SqlAzureAuthenticationContext Führt die Azure-Authentifizierung aus und ruft ein Authentifizierungstoken ab.
Add-SqlColumnEncryptionKeyValue Fügt einen neuen verschlüsselten Wert für ein vorhandenes Spaltenverschlüsselungsschlüssel-Objekt in der Datenbank hinzu.
Complete-SqlColumnMasterKeyRotation Schließt die Rotation eines Spaltenhauptschlüssels ab.
Get-SqlColumnEncryptionKey Gibt alle in der Datenbank definierten Spaltenverschlüsselungsschlüssel-Objekte zurück, oder gibt ein Spaltenverschlüsselungsschlüssel-Objekt mit dem angegebenen Namen zurück.
Get-SqlColumnMasterKey Gibt die in der Datenbank definierten Spaltenhauptschlüssel-Objekte zurück, oder gibt ein Spaltenhauptschlüssel-Objekt mit dem angegebenen Namen zurück.
Invoke-SqlColumnMasterKeyRotation Startet die Rotation eines Spalten-Masterschlüssels.
New-SqlAzureKeyVaultColumnMasterKeySettings Erstellt ein SqlColumnMasterKeySettings-Objekt, das einen asymmetrischen Schlüssel beschreibt, der in Azure Key Vault gespeichert ist.
New-SqlCngColumnMasterKeySettings Erstellt ein SqlColumnMasterKeySettings-Objekt, das einen asymmetrischen Schlüssel beschreibt, der in einem Schlüsselspeicher gespeichert ist, der die Cryptography Next Generation-API (CNG) unterstützt.
New-SqlColumnEncryptionKey Erstellt ein neues Spaltenverschlüsselungsschlüssel-Objekt in der Datenbank
New-SqlColumnEncryptionKeyEncryptedValue Erstellt den verschlüsselten Wert eines Spaltenverschlüsselungsschlüssels.
New-SqlColumnEncryptionSettings Erstellt ein SqlColumnEncryptionSettings-Objekt, das Informationen zur Verschlüsselung einer einzelnen Spalte kapselt, einschließlich CEK und Verschlüsselungstyp.
New-SqlColumnMasterKey Erstellt ein Spaltenhauptschlüssel-Objekt in der Datenbank
New-SqlColumnMasterKeySettings Erstellt ein SqlColumnMasterKeySettings-Objekt für einen Spaltenhauptschlüssel mit dem angegebenen Anbieter und Schlüsselpfad
New-SqlCspColumnMasterKeySettings Erstellt ein SqlColumnMasterKeySettings-Objekt, das einen asymmetrischen Schlüssel beschreibt, das in einem Schlüsselspeicher mit einem Kryptografiedienstanbieter (cryptography service provider; CSP) gespeichert ist, der die Kryptografie-API (CAPI) unterstützt.
Remove-SqlColumnEncryptionKey Entfernt das Spaltenverschlüsselungsschlüssel-Objekt aus der Datenbank.
Remove-SqlColumnEncryptionKeyValue Entfernt einen verschlüsselten Wert für ein vorhandenes Spaltenverschlüsselungsschlüssel-Objekt aus der Datenbank.
Remove-SqlColumnMasterKey Entfernt das Spaltenhauptschlüssel-Objekt aus der Datenbank.
Set-SqlColumnEncryption Verschlüsselt, entschlüsselt oder verschlüsselt angegebene Spalten in der Datenbank erneut.