Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Dit artikel bevat de stappen voor het inrichten van sleutels voor Always Encrypted met behulp van de SqlServer PowerShell-module. U kunt PowerShell gebruiken om Always Encrypted-sleutels in te richten met zowel met als zonder rolscheiding, waarmee u bepaalt wie toegang heeft tot de werkelijke versleutelingssleutels in het sleutelarchief en wie toegang heeft tot de database.
Zie Overzicht van sleutelbeheer voor Always Encrypted-voor een overzicht van Always Encrypted-sleutelbeheer, waaronder enkele aanbevelingen op hoog niveau. Zie Always Encrypted configureren met behulp van PowerShellvoor meer informatie over het gebruik van de SqlServer PowerShell PowerShell-module voor Always Encrypted.
Sleutelinrichting zonder rolscheiding
De belangrijkste inrichtingsmethode die in deze sectie wordt beschreven, biedt geen ondersteuning voor rolscheiding tussen beveiligingsbeheerders en DBA's. Sommige van de onderstaande stappen combineren bewerkingen op fysieke sleutels met bewerkingen op sleutelmetagegevens. Daarom wordt deze methode voor het inrichten van de sleutels aanbevolen voor organisaties die het DevOps-model gebruiken, of als de database wordt gehost in de cloud en het primaire doel is om cloudbeheerders (maar niet on-premises DBA's) toegang te geven tot gevoelige gegevens. Het wordt niet aanbevolen als potentiële aanvallers DBA's bevatten of als DBA's geen toegang moeten hebben tot gevoelige gegevens.
Voordat u eventuele stappen uitvoert waarbij toegang wordt verkregen tot tekst zonder opmaak of het sleutelarchief (geïdentificeerd in de Accesses plaintext keys/key store kolom in de onderstaande tabel), moet u ervoor zorgen dat de PowerShell-omgeving wordt uitgevoerd op een beveiligde computer die verschilt van een computer die als host fungeert voor uw database. Zie Beveiligingsoverwegingen voor sleutelbeheervoor meer informatie.
Taak | Artikel | Toegang tot platte-tekst sleutels/sleutelopslag | Toegang tot database |
---|---|---|---|
Stap 1. Maak een kolomhoofdsleutel in een sleutelarchief. Opmerking: de SqlServer PowerShell-module biedt geen ondersteuning voor deze stap. Als u deze taak vanaf een opdrachtregel wilt uitvoeren, gebruikt u de hulpprogramma's die specifiek zijn voor het geselecteerde sleutelarchief. |
kolomhoofdsleutels maken en opslaan voor Always Encrypted- | Ja | Nee |
Stap 2. Start een PowerShell-omgeving en importeer de SqlServer PowerShell-module. | Always Encrypted configureren met behulp van PowerShell | Nee | Nee |
Stap 3. Maak verbinding met uw server en database. | Verbinding maken met een database | Nee | Ja |
Stap 4. Maak een SqlColumnMasterKeySettings-object met informatie over de locatie van de hoofdsleutel van de kolom. SqlColumnMasterKeySettings is een object dat zich in het geheugen bevindt (in PowerShell). Gebruik de cmdlet die specifiek is voor uw sleutelarchief. |
New-SqlAzureKeyVaultColumnMasterKeySettings Nieuwe-SQLCertificaatOpslagKolomHoofdsleutelInstellingen New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Nee | Nee |
Stap 5. Maak de metagegevens over de kolomhoofdsleutel in uw database. |
New-SqlColumnMasterKey Opmerking: achter de schermen voert de cmdlet de CREATE COLUMN MASTER KEY (Transact-SQL) instructie uit om sleutelmetagegevens te maken. |
Nee | Ja |
Stap 6. Verifieer bij Azure als uw kolomhoofdsleutel is opgeslagen in Azure Key Vault. | Connect-AzAccount | Ja | Nee |
Stap 7. Verkrijg een toegangstoken voor Azure Key Vaults als uw kolomhoofdsleutel is opgeslagen in Azure Key Vault. | Get-AzAccessToken | Nee | Nee |
Stap 8. Genereer een nieuwe kolomversleutelingssleutel, versleutel deze met de kolomhoofdsleutel en maak metagegevens van kolomversleutelingssleutels in de database. |
New-SqlColumnEncryptionKey Opmerking: Gebruik een variant van de cmdlet die intern een kolomversleutelingssleutel genereert en versleutelt. Opmerking: Achter de schermen voert de cmdlet de CREATE COLUMN ENCRYPTION KEY (Transact-SQL) verklaring uit om sleutelmetagegevens te maken. |
Ja | Ja |
Windows-certificaatarchief zonder functiescheiding (voorbeeld)
Dit script is een end-to-end-voorbeeld voor het genereren van een kolomhoofdsleutel die een certificaat is in het Windows-certificaatarchief, het genereren en versleutelen van een kolomversleutelingssleutel en het maken van sleutelmetagegevens in een SQL Server-database.
# 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 zonder rolscheiding (voorbeeld)
Dit script is een end-to-end-voorbeeld voor het inrichten en configureren van een sleutelkluis in Azure Key Vault, het genereren van een kolomhoofdsleutel in de kluis, het genereren en versleutelen van een kolomversleutelingssleutel en het maken van sleutelmetagegevens in een Azure SQL-database.
# 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 zonder rolscheiding (voorbeeld)
Het onderstaande script is een end-to-end-voorbeeld voor het genereren van een kolomhoofdsleutel in een sleutelarchief dat CNG (Cryptography Next Generation API) implementeert, een kolomversleutelingssleutel genereert en versleutelt en sleutelmetagegevens maakt in een SQL Server-database.
In het voorbeeld wordt gebruikgemaakt van het sleutelarchief dat gebruikmaakt van Microsoft Software Key Storage Provider. U kunt ervoor kiezen om het voorbeeld te wijzigen om een andere opslag te gebruiken, zoals bijvoorbeeld uw hardwarebeveiligingsmodule. Hiervoor moet u ervoor zorgen dat de sleutelarchiefprovider (KSP) die CNG implementeert voor uw apparaat, correct op uw computer is geïnstalleerd. U moet Microsoft Software Key Storage Provider
vervangen door de KSP-naam van uw apparaat.
# 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
Sleutelbeheer met rolscheiding
Deze sectie bevat de stappen voor het configureren van versleuteling waarbij beveiligingsbeheerders geen toegang hebben tot de database en databasebeheerders geen toegang hebben tot het sleutelarchief of niet-versleutelde sleutels.
Beveiligingsbeheerder
Voordat u stappen uitvoert waarbij toegang tot niet-opgemaakte tekstsleutels of het sleutelarchief is vereist (geïdentificeerd in de Accesses plaintext keys/key store kolom in de onderstaande tabel), moet u ervoor zorgen dat:
- De PowerShell-omgeving wordt uitgevoerd op een beveiligde computer die verschilt van een computer die als host fungeert voor uw database.
- Databasebeheerders in uw organisatie hebben geen toegang tot de machine (dat zou het doel van rolscheiding tenietdoen).
Zie Beveiligingsoverwegingen voor sleutelbeheervoor meer informatie.
Taak | Artikel | Toegang tot platte-tekst sleutels/sleutelopslag | Toegang tot database |
---|---|---|---|
Stap 1. Maak een kolomhoofdsleutel in een sleutelopslag. Opmerking: de SqlServer-module biedt geen ondersteuning voor deze stap. Als u deze taak vanaf een opdrachtregel wilt uitvoeren, moet u de hulpprogramma's gebruiken die specifiek zijn voor het type sleutelarchief. |
kolomhoofdsleutels maken en opslaan voor Always Encrypted- | Ja | Nee |
Stap 2. Start een PowerShell-sessie en importeer de SqlServer-module. | Importeer de SqlServer-module | Nee | Nee |
Stap 3. Maak een SqlColumnMasterKeySettings-object met informatie over de locatie van de hoofdsleutel van de kolom. SqlColumnMasterKeySettings is een object dat zich in het geheugen bevindt (in PowerShell). Gebruik de cmdlet die specifiek is voor uw sleutelarchief. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings Nieuwe SQL-CspKolomMasterKeyInstellingen |
Nee | Nee |
Stap 4. Verifieer bij Azure als uw kolomhoofdsleutel is opgeslagen in Azure Key Vault. | Connect-AzAccount | Ja | Nee |
Stap 5. Verkrijg een toegangstoken voor Azure Key Vaults als uw kolomhoofdsleutel is opgeslagen in Azure Key Vault. | Get-AzAccessToken | Nee | Nee |
Stap 6. Genereer een kolomversleutelingssleutel, versleutel deze met de kolomhoofdsleutel om een versleutelde waarde van de kolomversleutelingssleutel te produceren. | New-SqlColumnEncryptionKeyEncryptedValue | Ja | Nee |
Stap 7. Geef de locatie op van de kolomhoofdsleutel (de providernaam en een sleutelpad van de kolomhoofdsleutel) en een versleutelde waarde van de kolomversleutelingssleutel naar de DBA. | Zie de onderstaande voorbeelden. | Nee | Nee |
Databasebeheerder
DBA's gebruiken de informatie die ze ontvangen van de beveiligingsbeheerder (stap 7 hierboven) om de metagegevens van de Always Encrypted-sleutel in de database te maken en te beheren.
Taak | Artikel | Toegang tot gegevenssleutels in platte tekst | Toegang tot database |
---|---|---|---|
Stap 1. Haal de locatie op van de kolomhoofdsleutel en de versleutelde waarde van de kolomversleutelingssleutel van uw beveiligingsbeheerder. | Zie de onderstaande voorbeelden. | Nee | Nee |
Stap 2. Start een PowerShell-omgeving en importeer de SqlServer-module. | Always Encrypted configureren met behulp van PowerShell | Nee | Nee |
Stap 3. Maak verbinding met uw server en een database. | Verbinding maken met een database | Nee | Ja |
Stap 4. Maak een SqlColumnMasterKeySettings-object dat informatie bevat over de locatie van uw kolomhoofdsleutel. SqlColumnMasterKeySettings is een object dat zich in het geheugen bevindt. | New-SqlColumnMasterKeySettings | Nee | Nee |
Stap 5. De metagegevens over de kolomhoofdsleutel in uw database maken |
New-SqlColumnMasterKey Opmerking: onder de covers geeft de cmdlet de CREATE COLUMN MASTER KEY (Transact-SQL) instructie uit om metagegevens van de kolomhoofdsleutel te maken. |
Nee | Ja |
Stap 6. Maak de metagegevens van de kolomversleutelingssleutel in de database. | New-SqlColumnEncryptionKey Opmerking: DBA's gebruiken een variant van de cmdlet waarmee alleen metagegevens van kolomversleutelingssleutels worden gemaakt. Onder de dekking geeft de cmdlet de CREATE COLUMN ENCRYPTION KEY (Transact-SQL) instructie voor het maken van metagegevens van kolomversleutelingssleutels. |
Nee | Ja |
Windows-certificaatarchief met functiescheiding (voorbeeld)
Beveiligingsbeheerder
# 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
Databasebeheerder
# 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
Volgende stappen
- Kolomversleuteling configureren met Always Encrypted met PowerShell
- Always Encrypted-sleutels roteren met behulp van PowerShell
- Toepassingen ontwikkelen met Always Encrypted
Zie ook
- Altijd Versleuteld
- Overzicht van sleutelbeheer voor Always Encrypted-
- kolomhoofdsleutels maken en opslaan voor Always Encrypted-
- Always Encrypted configureren met behulp van PowerShell
- Always Encrypted-sleutels inrichten met behulp van SQL Server Management Studio
- MAAK KOLON MEESTERSLEUTEL (Transact-SQL)
- DROP COLUMN MASTER KEY (Transact-SQL)
- CREATE COLUMN ENCRYPTION KEY (Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY (Transact-SQL)
- DROP COLUMN ENCRYPTIE SLEUTEL (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sys.column_encryption_keys (Transact-SQL)