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
Verwaltete Azure SQL-Instanz
Dieser Artikel enthält die Schritte zum Bereitstellen von Schlüsseln für Always Encrypted mithilfe des SqlServer PowerShell-Moduls. Sie können PowerShell verwenden, um Always Encrypted-Schlüssel sowohl mit als auch ohne Rollentrennung bereitzustellen, wodurch Sie kontrollieren können, wer Zugriff auf die tatsächlichen Verschlüsselungsschlüssel im Schlüsselspeicher hat und wer auf die Datenbank zugreifen kann.
Eine Übersicht über die Always Encrypted-Schlüsselverwaltung, einschließlich einiger empfehlungen für bewährte Methoden auf hoher Ebene, finden Sie unter Übersicht über die Schlüsselverwaltung für Always Encrypted. Informationen dazu, wie Sie mit der Verwendung des SqlServer PowerShell-Moduls für Always Encrypted beginnen, finden Sie unter Configure Always Encrypted using PowerShell.
Schlüsselbereitstellung ohne Rollentrennung
Die in diesem Abschnitt beschriebene Schlüsselbereitstellungsmethode unterstützt keine Rollentrennung zwischen Sicherheitsadministratoren und Datenbankadministratoren (DBAs). Einige der Schritte in diesem Abschnitt kombinieren Vorgänge für physische Schlüssel mit Vorgängen für Schlüsselmetadaten. Daher wird diese Bereitstellungsmethode für Organisationen empfohlen, die das DevOps-Modell verwenden, oder für Fälle, in denen die Datenbank in der Cloud gehostet wird und das primäre Ziel ist, Cloudadministratoren (nicht jedoch lokalen DBAs) den Zugriff auf sensible Daten zu verweigern. Die Methode wird nicht empfohlen, wenn DBAs zu potenziellen Angreifern gehören oder wenn DBAs nicht über Zugriff auf sensible Daten verfügen sollen.
Stellen Sie vor dem Ausführen von Schritten, die den Zugriff auf Klartext-Schlüssel oder den Schlüsselspeicher beinhalten (in der Spalte Zugriffe auf Klartext-Schlüssel/Schlüsselspeicher in der folgenden Tabelle angegeben), sicher, dass die PowerShell-Umgebung auf einem sicheren Computer ausgeführt wird, der sich von dem Computer unterscheidet, auf dem Ihre Datenbank gehostet wird. Weitere Informationen finden Sie unter Sicherheitsüberlegungen für die Schlüsselverwaltung.
Aufgabe | Artikel | Greift auf Klartextschlüssel und -schlüsselspeicher zu | Greift auf Datenbank zu |
---|---|---|---|
Schritt 1. Erstellen Sie einen Spaltenhauptschlüssel in einem Schlüsselspeicher. Anmerkung: Das SqlServer PowerShell-Modul unterstützt diesen Schritt nicht. Verwenden Sie die Tools, die für Ihren gewählten Schlüsselspeicher spezifisch sind, um diese Aufgabe über eine Befehlszeile durchzuführen. |
Erstellen und Speichern von Spaltenmasterschlüsseln für Always Encrypted | Ja | Nein |
Schritt 2. Starten Sie eine PowerShell-Umgebung, und importieren Sie das SqlServer PowerShell-Modul. | Konfigurieren von "Immer verschlüsselt" mithilfe von PowerShell | Nein | Nein |
Schritt 3. Stellen Sie eine Verbindung mit Ihrem Server und Ihrer Datenbank her. | Herstellen einer Verbindung mit einer Datenbank | Nein | Ja |
Schritt 4. Erstellen Sie ein SqlColumnMasterKeySettings - Objekt, das Informationen zum Speicherort des Spaltenmasterschlüssels enthält. SqlColumnMasterKeySettings ist ein Objekt, das im Arbeitsspeicher (in PowerShell) vorhanden ist. Verwenden Sie das Cmdlet, das für Ihren Schlüsselspeicher spezifisch ist. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Nein | Nein |
Schritt 5. Erstellen Sie die Metadaten über den Spaltenhauptschlüssel in Ihrer Datenbank. Anmerkung: Wir überprüfen nicht die Gültigkeit der Schlüssel oder Zertifikate, die zum Generieren des Spaltenmasterschlüssels verwendet werden. |
[New-SqlColumnMasterKey](/powershell/sqlserver/sqlserver/vlatest/new-sqlcolumnmasterkey Hinweis: Unter den Covern gibt das Cmdlet die CREATE COLUMN MASTER KEY-Anweisung aus, um Schlüsselmetadaten zu erstellen. |
Nein | Ja |
Schritt 6. Authentifizieren Sie sich bei Azure, wenn Ihr Spaltenhauptschlüssel in Azure Key Vault gespeichert ist. | Connect-AzAccount | Ja | Nein |
Schritt 7. Rufen Sie ein Zugriffstoken für Azure Key Vaults ab, wenn Ihr Spaltenhauptschlüssel in Azure Key Vault gespeichert ist. | Get-AzAccessToken | Nein | Nein |
Schritt 8: Generieren Sie einen neuen Spaltenverschlüsselungsschlüssel, verschlüsseln Sie ihn mit dem Spaltenhauptschlüssel, und erstellen Sie Spaltenverschlüsselungsschlüssel-Metadaten in der Datenbank. |
New-SqlColumnEncryptionKey Anmerkung: Verwenden Sie eine Variante des Cmdlets, das intern einen Spaltenverschlüsselungsschlüssel generiert und verschlüsselt. Anmerkung: Unter den Deckeln gibt das Cmdlet die CREATE COLUMN ENCRYPTION KEY-Anweisung aus, um Schlüsselmetadaten zu erstellen. |
Ja | Ja |
Windows-Zertifikatspeicher ohne Rollentrennung (Beispiel)
Dieses Skript ist ein End-to-End-Beispiel für das Generieren eines Spaltenhauptschlüssels, der ein Zertifikat im Windows-Zertifikatspeicher darstellt, einen Spaltenverschlüsselungsschlüssel generiert und verschlüsselt und Schlüsselmetadaten in einer SQL Server-Datenbank erstellt.
# Create a column master key in Windows Certificate Store.
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation Cert:CurrentUser\My -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage DataEncipherment -KeySpec KeyExchange
# 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 column master key.
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint
# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings
# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database.
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName
Azure Key Vault ohne Rollentrennung (Beispiel)
Dieses Skript ist ein umfassendes Beispiel für das Bereitstellen und Konfigurieren eines Schlüsseltresors im Azure Key Vault, für das Generieren eines Spaltenhauptschlüssels im Tresor, für das Generieren und Verschlüsseln eines Spaltenhauptschlüssels und für das Erstellen von Schlüsselmetadaten in einer Azure SQL-Datenbank-Instanz.
# Create a column master key in Azure Key Vault.
Import-Module Az
Connect-AzAccount
$SubscriptionId = "<Azure SubscriptionId>"
$resourceGroup = "<resource group name>"
$azureLocation = "<datacenter location>"
$akvName = "<key vault name>"
$akvKeyName = "<key name>"
$azureCtx = Set-AzConteXt -SubscriptionId $SubscriptionId # Sets the context for the below cmdlets to the specified subscription.
New-AzResourceGroup -Name $resourceGroup -Location $azureLocation # Creates a new resource group - skip, if your desired group already exists.
New-AzKeyVault -VaultName $akvName -ResourceGroupName $resourceGroup -Location $azureLocation # Creates a new key vault - skip if your vault already exists.
Set-AzKeyVaultAccessPolicy -VaultName $akvName -ResourceGroupName $resourceGroup -PermissionsToKeys get, create, delete, list, wrapKey,unwrapKey, sign, verify -UserPrincipalName $azureCtx.Account
$akvKey = Add-AzKeyVaultKey -VaultName $akvName -Name $akvKeyName -Destination "Software"
# Connect to your database (Azure SQL database).
Import-Module "SqlServer"
$serverName = "<Azure SQL server name>.database.windows.net"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Authentication = Active Directory Integrated; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr
# Create a SqlColumnMasterKeySettings object for your column master key.
$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyURL $akvKey.Key.Kid
# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings -KeyVaultAccessToken $keyVaultAccessToken
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database.
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName -KeyVaultAccessToken $keyVaultAccessToken
CNG/KSP ohne Rollentrennung (Beispiel)
Das Skript unten ist ein End-to-End-Beispiel für das Generieren eines Spaltenhauptschlüssels in einem Schlüsselspeicher, der die Cryptography Next Generation API (CNG) implementiert, für das Generieren und Verschlüsseln eines Spaltenhauptschlüssels und für das Erstellen von Schlüsselmetadaten in einer SQL Server-Datenbank.
Im Beispiel wird der Schlüsselspeicher verwendet, der den Microsoft Software Key Storage Provider verwendet. Sie können das Beispiel ändern, um einen anderen Speicher zu verwenden, z. B. Ihr Hardwaresicherheitsmodul. Dazu müssen Sie sicherstellen, dass der Schlüsselspeicheranbieter (KSP), der CNG für Ihr Gerät implementiert, ordnungsgemäß auf dem Computer installiert ist. Sie müssen Microsoft Software Key Storage Provider
durch den KSP-Namen Ihres Geräts ersetzen.
# Create a column master key in a key store that has a CNG provider, a.k.a key store provider (KSP).
$cngProviderName = "Microsoft Software Key Storage Provider" # If you have an HSM, you can use a KSP for your HSM instead of a Microsoft KSP
$cngAlgorithmName = "RSA"
$cngKeySize = 2048 # Recommended key size for Always Encrypted column master keys
$cngKeyName = "AlwaysEncryptedKey" # Name identifying your new key in the KSP
$cngProvider = New-Object System.Security.Cryptography.CngProvider($cngProviderName)
$cngKeyParams = New-Object System.Security.Cryptography.CngKeyCreationParameters
$cngKeyParams.provider = $cngProvider
$cngKeyParams.KeyCreationOptions = [System.Security.Cryptography.CngKeyCreationOptions]::OverwriteExistingKey
$keySizeProperty = New-Object System.Security.Cryptography.CngProperty("Length", [System.BitConverter]::GetBytes($cngKeySize), [System.Security.Cryptography.CngPropertyOptions]::None);
$cngKeyParams.Parameters.Add($keySizeProperty)
$cngAlgorithm = New-Object System.Security.Cryptography.CngAlgorithm($cngAlgorithmName)
$cngKey = [System.Security.Cryptography.CngKey]::Create($cngAlgorithm, $cngKeyName, $cngKeyParams)
# 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 column master key.
$cmkSettings = New-SqlCngColumnMasterKeySettings -CngProviderName $cngProviderName -KeyName $cngKeyName
# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings
# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database.
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName
Schlüsselbereitstellung mit Rollentrennung
Dieser Abschnitt enthält die Schritte zum Konfigurieren einer Verschlüsselung, mit der Sicherheitsadministratoren nicht über Zugriff auf die Datenbank verfügen, und Datenbankadministratoren nicht über Zugriff auf den Schlüsselspeicher oder Nur-Text-Schlüssel verfügen.
Sicherheitsadministrator
Bevor Sie Schritte ausführen, die den Zugriff auf Nur-Text-Schlüssel oder den Schlüsselspeicher (in der Spalte "Nur-Text-Schlüssel/Schlüsselspeicher" in Accesses in der folgenden Tabelle angegeben) beinhalten, stellen Sie sicher, dass:
- Die PowerShell-Umgebung wird auf einem sicheren Computer ausgeführt, der nicht der Computer ist, auf dem Ihre Datenbank gehostet wird.
- Datenbankadministratoren in Ihrer Organisation haben keinen Zugriff auf die Maschine (was den Zweck der Rollentrennung zunichte machen würde).
Weitere Informationen finden Sie unter Sicherheitsüberlegungen für die Schlüsselverwaltung.
Aufgabe | Artikel | Greift auf Klartextschlüssel und -schlüsselspeicher zu | Greift auf Datenbank zu |
---|---|---|---|
Schritt 1. Erstellen Sie einen Spaltenhauptschlüssel in einem Schlüsselspeicher. Anmerkung: Das SqlServer-Modul unterstützt diesen Schritt nicht. Sie müssen die Tools Verwenden, die für den Typ Ihres Schlüsselspeichers spezifisch sind, um diese Aufgabe mithilfe einer Befehlszeile durchzuführen. |
Erstellen und Speichern von Spaltenmasterschlüsseln für Always Encrypted | Ja | Nein |
Schritt 2. Starten Sie eine PowerShell-Sitzung, und importieren Sie das SqlServer-Modul. | Importieren des SqlServer-Moduls | Nein | Nein |
Schritt 3. Erstellen Sie ein SqlColumnMasterKeySettings - Objekt, das Informationen zum Speicherort des Spaltenmasterschlüssels enthält. SqlColumnMasterKeySettings ist ein Objekt, das im Arbeitsspeicher (in PowerShell) vorhanden ist. Verwenden Sie das Cmdlet, das für Ihren Schlüsselspeicher spezifisch ist. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Nein | Nein |
Schritt 4. Authentifizieren Sie sich bei Azure, wenn Ihr Spaltenhauptschlüssel in Azure Key Vault gespeichert ist. | Connect-AzAccount | Ja | Nein |
Schritt 5. Rufen Sie ein Zugriffstoken für Azure Key Vaults ab, wenn Ihr Spaltenhauptschlüssel in Azure Key Vault gespeichert ist. | Get-AzAccessToken | Nein | Nein |
Schritt 6. Generieren Sie einen Spaltenverschlüsselungsschlüssel, und verschlüsseln Sie ihn mit dem Spaltenhauptschlüssel, um einen verschlüsselten Wert des Spaltenverschlüsselungsschlüssels zu erstellen. | New-SqlColumnEncryptionKeyEncryptedValue | Ja | Nein |
Schritt 7. Stellen Sie den Speicherort des Spaltenhauptschlüssels (den Anbieternamen und einen Schlüsselpfad des Spaltenhauptschlüssels) und einen verschlüsselten Wert des Spaltenverschlüsselungsschlüssels für den DBA bereit. | Sehen Sie sich die Beispiele am Ende des Artikels an. | Nein | Nein |
DBA
Datenbankadministratoren (DBAs) verwenden die Informationen, die sie vom Sicherheitsadministrator (Schritt 7 oben) empfangen, um die Always Encrypted-Schlüsselmetadaten in der Datenbank zu erstellen und zu verwalten.
Aufgabe | Artikel | Greift auf Klartextschlüssel zu | Greift auf Datenbank zu |
---|---|---|---|
Schritt 1. Rufen Sie den Speicherort des Spaltenhauptschlüssels und des verschlüsselten Werts des Spaltenverschlüsselungsschlüssels von Ihrem Sicherheitsadministrator ab. | Sehen Sie sich die Beispiele am Ende des Artikels an. | Nein | Nein |
Schritt 2. Starten Sie eine PowerShell-Umgebung, und importieren Sie das SqlServer-Modul. | Konfigurieren von "Immer verschlüsselt" mithilfe von PowerShell | Nein | Nein |
Schritt 3. Stellen Sie eine Verbindung mit Ihrem Server und Ihrer Datenbank her. | Herstellen einer Verbindung mit einer Datenbank | Nein | Ja |
Schritt 4. Erstellen Sie ein SqlColumnMasterKeySettings-Objekt, dass Informationen über den Speicherort Ihres Spaltenhauptschlüssels enthält. SqlColumnMasterKeySettings ist ein Objekt, das im Arbeitsspeicher vorhanden ist. | New-SqlColumnMasterKeySettings | Nein | Nein |
Schritt 5. Erstellen Sie die Metadaten über den Spaltenhauptschlüssel in Ihrer Datenbank. Anmerkung: Wir überprüfen nicht die Gültigkeit der Schlüssel oder Zertifikate, die zum Generieren des Spaltenmasterschlüssels verwendet werden. |
New-SqlColumnMasterKey Hinweis: Unter den Deckeln gibt das Cmdlet die CREATE COLUMN MASTER KEY (Transact-SQL) -Anweisung aus, um Spaltenmasterschlüsselmetadaten zu erstellen. |
Nein | Ja |
Schritt 6. Erstellen Sie die Spaltenverschlüsselungsschlüssel-Metadaten in der Datenbank. | New-SqlColumnEncryptionKey Anmerkung: DBAs verwenden eine Variation des Cmdlets, das nur Spaltenverschlüsselungsschlüsselmetadaten erstellt. Im Hintergrund führt das Cmdlet die CREATE COLUMN ENCRYPTION KEY (Transact-SQL)-Anweisung aus, um Metadaten für den Spaltenverschlüsselungsschlüssel zu erstellen. |
Nein | Ja |
Windows-Zertifikatspeicher mit Rollentrennung (Beispiel)
Sicherheitsadministrator
# Create a 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 column master key.
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint
# Generate a column encryption key, encrypt it with the column master key to produce an encrypted value of the column encryption key.
$encryptedValue = New-SqlColumnEncryptionKeyEncryptedValue -TargetColumnMasterKeySettings $cmkSettings
# Share the location of the column master key and an encrypted value of the column encryption key with a DBA, via a CSV file on a share drive
$keyDataFile = "Z:\keydata.txt"
"KeyStoreProviderName, KeyPath, EncryptedValue" > $keyDataFile
$cmkSettings.KeyStoreProviderName + ", " + $cmkSettings.KeyPath + ", " + $encryptedValue >> $keyDataFile
# Read the key data back to verify
$keyData = Import-Csv $keyDataFile
$keyData.KeyStoreProviderName
$keyData.KeyPath
$keyData.EncryptedValue
DBA
# Obtain the location of the column master key and the encrypted value of the column encryption key from your Security Administrator, via a CSV file on a share drive.
$keyDataFile = "Z:\keydata.txt"
$keyData = Import-Csv $keyDataFile
# Import the SqlServer module
Import-Module "SqlServer"
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True; TrustServerCertificate = True"
$database = Get-SqlDatabase -ConnectionString $connStr
# Create a SqlColumnMasterKeySettings object for your column master key.
$cmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $keyData.KeyStoreProviderName -KeyPath $keyData.KeyPath
# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings
# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database.
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName -EncryptedValue $keyData.EncryptedValue
Verwandte Inhalte
- Konfigurieren der Spaltenverschlüsselung mit Always Encrypted with PowerShell
- Rotieren von Always Encrypted-Schlüsseln mithilfe von PowerShell
- Entwickeln von Anwendungen mit Always Encrypted
- Immer verschlüsselt
- Übersicht über die Schlüsselverwaltung für Always Encrypted
- Erstellen und Speichern von Spaltenmasterschlüsseln für Always Encrypted
- Konfigurieren von "Immer verschlüsselt" mithilfe von PowerShell
- Bereitstellen von immer verschlüsselten Schlüsseln mit SQL Server Management Studio
- SPALTENMASTERSCHLÜSSEL ERSTELLEN (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)