Megosztás a következőn keresztül:


Always Encrypted-kulcsok kiépítése a PowerShell használatával

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példány

Ez a cikk az Always Encrypted kulcsainak az SqlServer PowerShell-modullal történő kiépítésének lépéseit ismerteti. A PowerShell használatával az Always Encrypted kulcsokat létrehozhatja mind szerepkör-elkülönítéssel, mind szerepkör-elkülönítés nélkül, szabályozva, hogy ki férhet hozzá a kulcstárolóban lévő tényleges titkosítási kulcsokhoz, és ki férhet hozzá az adatbázishoz.

Az Always Encrypted kulcskezelésének áttekintéséért, beleértve néhány magas szintű ajánlott eljárásra vonatkozó javaslatot, tekintse meg az Always Encrypted kulcskezelésének áttekintését. Az Always Encryptedhez készült SqlServer PowerShell-modul használatának megkezdéséről további információt az Always Encrypted konfigurálása a PowerShell használatával című témakörben talál.

Kulcskiosztás szerepkör-elkülönítés nélkül

Az ebben a szakaszban ismertetett kulcskiépítési módszer nem támogatja a biztonsági rendszergazdák és a dbA-k közötti szerepkör-elkülönítést. A szakasz néhány lépése a fizikai kulcsokon végzett műveleteket kombinálja a kulcs metaadatain végzett műveletekkel. Ezért a kulcsok kiépítésének ez a módszere a DevOps-modellt használó szervezetek számára ajánlott, vagy ha az adatbázis a felhőben van üzemeltetve, és az elsődleges cél a felhőgazdák (de nem a helyszíni ADATBÁZIS-k) hozzáférésének korlátozása a bizalmas adatokhoz. Nem ajánlott, ha a lehetséges támadók adatbázis-kezelőket is tartalmaznak, vagy ha a adatbázis-kezelőknek nem szabad hozzáféréssel rendelkezniük a bizalmas adatokhoz.

Az egyszerű szöveges kulcsokhoz vagy a kulcstárolóhoz való hozzáféréssel járó lépések futtatása előtt (amelyet az Accesses egyszerű szöveges kulcsok/kulcstároló oszlopban talál a következő táblázatban) győződjön meg arról, hogy a PowerShell-környezet egy olyan biztonságos gépen fut, amely eltér az adatbázist futtató számítógéptől. További információ: A kulcskezelés biztonsági szempontjai.

Feladat Cikk Egyszerű szöveges kulcsok/kulcstárolók elérése Adatbázis elérése
1. lépés. Hozzon létre egy oszlop főkulcsát egy kulcstárolóban.

Jegyzet: Az SqlServer PowerShell-modul nem támogatja ezt a lépést. Ha parancssorból szeretné elvégezni ezt a feladatot, használja a kiválasztott kulcstárolóhoz tartozó eszközöket.
Oszlop főkulcsainak létrehozása és tárolása az Always Encryptedhez Igen Nem
2. lépés. Indítsa el a PowerShell-környezetet, és importálja az SqlServer PowerShell-modult. Always Encrypted konfigurálása a PowerShell használatával Nem Nem
3. lépés. Csatlakozzon a kiszolgálóhoz és az adatbázishoz. Csatlakozás adatbázishoz Nem Igen
4. lépés. Hozzon létre egy SqlColumnMasterKeySettings objektumot, amely információkat tartalmaz az oszlop főkulcsának helyéről. Az SqlColumnMasterKeySettings egy olyan objektum, amely a memóriában (a PowerShellben) létezik. Használja a kulcstárolóra jellemző parancsmagot. Új-SqlAzureKeyVaultOszlopFőKulcsBeállítások

Új-SqlTanúsítványTárolóOszlopFőkulcsBeállítások

Új-SqlCngOszlopMesterKulcsBeállítások

Új-SqlCspOszlopMesterKulcsBeállítások
Nem Nem
5. lépés. Hozza létre az oszlop főkulcsának metaadatait az adatbázisban.

Jegyzet: Nem ellenőrizzük az oszlop főkulcsának létrehozásához használt kulcsok vagy tanúsítványok érvényességét.
[New-SqlColumnMasterKey](/powershell/sqlserver/sqlserver/vlatest/new-sqlcolumnmasterkey

Megjegyzés: A borítók alatt a parancsmag a CREATE COLUMN MASTER KEY utasítást bocsátja ki a kulcs metaadatainak létrehozásához.
Nem Igen
6. lépés. Hitelesítés az Azure-ban, ha az oszlop főkulcsa az Azure Key Vaultban van tárolva. Connect-AzAccount Igen Nem
7. lépés. Szerezze be az Azure kulcstárak hozzáférési tokenjét, ha az oszlop főkulcsa az Azure kulcstárban van tárolva. Get-AzAccessToken Nem Nem
8. lépés. Hozzon létre egy új oszloptitkosítási kulcsot, titkosítsa az oszlop főkulcsával, és hozzon létre oszloptitkosítási kulcs metaadatait az adatbázisban. New-SqlColumnEncryptionKey

Jegyzet: Használja a parancsmag egy olyan változatát, amely belsőleg létrehoz és titkosít egy oszloptitkosítási kulcsot.

Jegyzet: A borítók alatt a parancsmag kiadja a CREATE COLUMN ENCRYPTION KEY utasítást a kulcs metaadatainak létrehozásához.
Igen Igen

Windows Tanúsítványtár szerepkör-elkülönítés nélkül (példa)

Ez a szkript egy végponttól végpontig példa egy olyan oszlop főkulcsának létrehozására, amely egy tanúsítvány a Windows Tanúsítványtárolóban, oszloptitkosítási kulcs létrehozására és titkosítására, valamint kulcs metaadatok létrehozására egy SQL Server-adatbázisban.

# 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 szerepkör-elkülönítés nélkül (példa)

Ez a szkript egy végpontok közötti példa egy kulcstartó kiépítésére és konfigurálására az Azure Key Vaultban, egy oszlop-főkulcs létrehozása a tárolóban, oszloptitkosítási kulcs létrehozása és titkosítása, valamint kulcs metaadatainak létrehozása egy Azure SQL-adatbázisban.

# 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 szerepkör szétválasztása nélkül (példa)

Az alábbi szkript egy végpontok közötti példa egy oszlop főkulcsának létrehozására egy kulcstárban, amely implementálja a titkosítási next generation API-t (CNG), létrehoz és titkosít egy oszloptitkosítási kulcsot, és kulcs metaadatokat hoz létre egy SQL Server-adatbázisban.

A példa a Microsoft Szoftverkulcstár-szolgáltatót használó kulcstárolót használja. Módosíthatja a példát úgy, hogy egy másik tárolót használjon, például a hardveres biztonsági modult. Ehhez meg kell győződnie arról, hogy a CNG-t az eszközön megvalósító kulcstároló-szolgáltató (KSP) telepítve van és megfelelően működik a gépen. A Microsoft Software Key Storage Provider-t le kell cserélnie az eszköz KSP-nevével.

# 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

Kulcskiosztás szerepkör-elkülönítéssel

Ez a szakasz a titkosítás konfigurálását ismerteti, ha a biztonsági rendszergazdák nem férnek hozzá az adatbázishoz, és az adatbázisgazdák nem férnek hozzá a kulcstárolóhoz vagy az egyszerű szöveges kulcsokhoz.

Biztonsági rendszergazda

Az egyszerű szöveges kulcsokhoz vagy a kulcstárolóhoz való hozzáféréssel járó lépések futtatása előtt (a következő táblázat Accesses egyszerű szöveges kulcsainak/kulcstároló oszlopában azonosítva) győződjön meg arról, hogy:

  • A PowerShell-környezet egy olyan biztonságos gépen fut, amely eltér az adatbázist futtató számítógéptől.
  • A szervezet adatbázis-rendszergazdái nem férnek hozzá a géphez (ez a szerepkör-elkülönítés célját nem tenné lehetővé).

További információ: A kulcskezelés biztonsági szempontjai.

Feladat Cikk Egyszerű szöveges kulcsok/kulcstárolók elérése Adatbázis elérése
1. lépés. Hozzon létre egy oszlop főkulcsát egy kulcstárolóban.

Jegyzet: Az SqlServer modul nem támogatja ezt a lépést. Ha parancssorból szeretné elvégezni ezt a feladatot, a kulcstároló típusának megfelelő eszközöket kell használnia.
Oszlop főkulcsainak létrehozása és tárolása az Always Encryptedhez Igen Nem
2. lépés. Indítsa el a PowerShell-munkamenetet, és importálja az SqlServer modult. Az SqlServer modul importálása Nem Nem
3. lépés. Hozzon létre egy SqlColumnMasterKeySettings objektumot, amely információkat tartalmaz az oszlop főkulcsának helyéről. Az SqlColumnMasterKeySettings egy olyan objektum, amely a memóriában (a PowerShellben) létezik. Használja a kulcstárolóra jellemző parancsmagot. Új-SqlAzureKeyVaultOszlopFőKulcsBeállítások

Új-SqlTanúsítványTárolóOszlopFőkulcsBeállítások

Új-SqlCngOszlopMesterKulcsBeállítások

Új-SqlCspOszlopMesterKulcsBeállítások
Nem Nem
4. lépés. Hitelesítés az Azure-ban, ha az oszlop főkulcsa az Azure Key Vaultban van tárolva. Connect-AzAccount Igen Nem
5. lépés. Szerezze be az Azure kulcstárak hozzáférési tokenjét, ha az oszlop főkulcsa az Azure kulcstárban van tárolva. Get-AzAccessToken Nem Nem
6. lépés. Hozzon létre egy oszloptitkosítási kulcsot, majd titkosítsa azt az oszlopmester-kulccsal, hogy létrejöjjön az oszloptitkosítási kulcs titkosított értéke. New-SqlColumnEncryptionKeyEncryptedValue Igen Nem
7. lépés. Adja meg az oszlop főkulcsának helyét (a szolgáltató nevét és az oszlop főkulcsának elérési útját), valamint az oszloptitkosítási kulcs titkosított értékét a DBA-nak. Tekintse meg a példákat a cikk végén. Nem Nem

DBA

A adatbázisgazdák a biztonsági rendszergazdától kapott információkat (a fenti 7. lépés) használják az Always Encrypted kulcs metaadatainak létrehozására és kezelésére az adatbázisban.

Feladat Cikk Egyszerű szöveges kulcsok elérése Adatbázis elérése
1. lépés. Szerezze be az oszlop főkulcsának helyét és az oszloptitkosítási kulcs titkosított értékét a biztonsági rendszergazdától. Tekintse meg a példákat a cikk végén. Nem Nem
2. lépés. Indítsa el a PowerShell-környezetet, és importálja az SqlServer modult. Always Encrypted konfigurálása a PowerShell használatával Nem Nem
3. lépés. Csatlakozzon a kiszolgálóhoz és egy adatbázishoz. Csatlakozás adatbázishoz Nem Igen
4. lépés. Hozzon létre egy SqlColumnMasterKeySettings objektumot, amely információkat tartalmaz az oszlop főkulcsának helyéről. Az SqlColumnMasterKeySettings egy olyan objektum, amely a memóriában létezik. Új-SqlOszlopfőkulcsBeállítások Nem Nem
5. lépés. Hozza létre az oszlop főkulcsának metaadatait az adatbázisban.

Jegyzet: Nem ellenőrizzük az oszlop főkulcsának létrehozásához használt kulcsok vagy tanúsítványok érvényességét.
New-SqlColumnMasterKey
Megjegyzés: A fedőlap alatt a parancsmag a CREATE COLUMN MASTER KEY (Transact-SQL) utasítást bocsátja ki az oszlop főkulcs metaadatainak létrehozásához.
Nem Igen
6. lépés. Hozza létre az oszloptitkosítási kulcs metaadatait az adatbázisban. Új-SQLOszlopTitkosításiKulcs
Jegyzet: A dbA-k a parancsmag egy olyan változatát használják, amely csak oszloptitkosítási kulcs metaadatait hozza létre.
A borítók alatt a parancsmag kiadja a CREATE COLUMN ENCRYPTION KEY (Transact-SQL) utasítást az oszloptitkosítási kulcs metaadatainak létrehozásához.
Nem Igen

Windows Tanúsítványtároló szerepkör-elkülönítéssel (példa)

Biztonsági rendszergazda

# 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