Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Ten artykuł zawiera kroki aprowizowania kluczy dla funkcji Always Encrypted przy użyciu modułu SqlServer programu PowerShell. Za pomocą programu PowerShell można aprowizować klucze Always Encrypted zarówno z separacją ról, jak i bez, zapewniając kontrolę nad tym, kto ma dostęp do rzeczywistych kluczy szyfrowania w magazynie kluczy i kto ma dostęp do bazy danych.
Note
Microsoft zaleca używanie programu PowerShell 7 lub nowszego podczas uruchamiania skryptów programu PowerShell Always Encrypted. Program PowerShell 7 zapewnia ulepszoną obsługę międzyplatformową, lepszą wydajność i najnowszą zgodność z modułem SqlServer (wersja 22 lub nowsza), która jest wymagana w wielu scenariuszach funkcji Always Encrypted.
Aby zapoznać się z omówieniem zarządzania kluczami Always Encrypted, w tym zaleceniami dotyczącymi najlepszych rozwiązań wysokiego poziomu, zobacz Omówienie zarządzania kluczami dla usługi Always Encrypted. Aby uzyskać informacje na temat rozpoczynania korzystania z modułu SqlServer PowerShell dla funkcji Always Encrypted, zobacz Configure Always Encrypted using PowerShell.
Dostarczanie kluczy bez podziału ról
Kluczowa metoda aprowizacji opisana w tej sekcji nie obsługuje separacji ról między administratorami zabezpieczeń i administratorami baz danych. Niektóre kroki w tej sekcji łączą operacje na kluczach fizycznych z operacjami na metadanych klucza. W związku z tym należy użyć tej metody aprowizacji kluczy, jeśli organizacja korzysta z modelu DevOps lub jeśli baza danych jest hostowana w chmurze, a głównym celem jest ograniczenie administratorów chmury (ale nie lokalnych administratorów baz danych) z uzyskiwania dostępu do poufnych danych. Nie używaj tej metody, jeśli potencjalni przeciwnicy obejmują administratorów baz danych lub jeśli administratorzy baz danych nie powinni mieć dostępu do poufnych danych.
Przed wykonaniem kroków obejmujących dostęp do kluczy w postaci zwykłego tekstu lub magazynu kluczy (zidentyfikowanego w kolumnie Accesses plaintext keys/key store w poniższej tabeli) upewnij się, że środowisko programu PowerShell działa na bezpiecznej maszynie innej niż komputer hostujący bazę danych. Aby uzyskać więcej informacji, zobacz Zagadnienia dotyczące zabezpieczeń dotyczące zarządzania kluczami.
| Zadanie | Artykuł | Uzyskuje dostęp do kluczy w postaci zwykłego tekstu/magazynu kluczy | Uzyskuje dostęp do bazy danych |
|---|---|---|---|
| Krok 1. Utwórz klucz główny dla kolumny w magazynie kluczy. Uwaga: moduł SqlServer PowerShell nie obsługuje tego kroku. Aby wykonać to zadanie z poziomu wiersza polecenia, użyj narzędzi specyficznych dla wybranego magazynu kluczy. |
Tworzenie kluczy głównych kolumn i ich przechowywanie dla Always Encrypted | Tak | Nie |
| Krok 2. Uruchom środowisko programu PowerShell i zaimportuj moduł SqlServer PowerShell. | konfigurowanie funkcji Always Encrypted przy użyciu programu PowerShell | Nie | Nie |
| Krok 3. Nawiąż połączenie z serwerem i bazą danych. | Nawiązywanie połączenia z bazą danych | Nie | Tak |
| Krok 4. Utwórz obiekt SqlColumnMasterKeySettings zawierający informacje o lokalizacji klucza głównego kolumny. SqlColumnMasterKeySettings to obiekt, który istnieje w pamięci (w programie PowerShell). Użyj polecenia cmdlet odpowiedniego dla magazynu kluczy. |
new-SqlAzureKeyVaultColumnMasterKeySettings Nowe-UstawieniaKluczaGłównegoKolumnSqlCertStore New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Nie | Nie |
| Krok 5. Utwórz metadane dotyczące klucza głównego kolumny w bazie danych. Nuta: Nie weryfikujemy ważności kluczy ani certyfikatów używanych do generowania klucza głównego kolumny. |
[New-SqlColumnMasterKey](/powershell/sqlserver/sqlserver/vlatest/new-sqlcolumnmasterkey Uwaga: wewnętrznie polecenie cmdlet wykonuje instrukcję CREATE COLUMN MASTER KEY w celu utworzenia metadanych klucza. |
Nie | Tak |
| Krok 6. Uwierzytelnij się w Azure, jeśli klucz główny kolumny jest przechowywany w Azure Key Vault. | Connect-AzAccount | Tak | Nie |
| Krok 7. Uzyskaj token dostępu do Azure Key Vault, jeśli Twój klucz główny kolumny jest przechowywany w Azure Key Vault. | Get-AzAccessToken | Nie | Nie |
| Krok 8. Wygeneruj nowy klucz szyfrowania kolumny, zaszyfruj go przy użyciu klucza głównego kolumny i utwórz metadane klucza szyfrowania kolumny w bazie danych. |
new-SqlColumnEncryptionKey Uwaga: Użyj odmiany polecenia cmdlet, które wewnętrznie generuje i szyfruje klucz szyfrowania kolumny. Uwaga: W tle polecenie cmdlet wykonuje instrukcję CREATE COLUMN ENCRYPTION KEY w celu utworzenia metadanych klucza. |
Tak | Tak |
Magazyn certyfikatów systemu Windows bez separacji ról (przykład)
Ten skrypt jest kompleksowym przykładem generowania klucza głównego kolumny jako certyfikatu w magazynie certyfikatów systemu Windows, generowania i szyfrowania klucza szyfrowania kolumn oraz tworzenia metadanych klucza w bazie danych programu SQL Server.
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$DatabaseName = '<database name>',
[Parameter(Mandatory = $false)]
[string]$ServerName = "<server name>",
[Parameter(Mandatory = $false)]
[string]$CertificateSubject = "AlwaysEncryptedCert",
[Parameter(Mandatory = $false)]
[string]$CmkName = "CMK",
[Parameter(Mandatory = $false)]
[string]$CekName = "CEK"
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
Import-Module SqlServer -MinimumVersion 22.0.50 -ErrorAction Stop
Write-Host "[AE] Locating certificate '$CertificateSubject' in CurrentUser\\My"
$cert = Get-ChildItem -Path Cert:CurrentUser\My |
Where-Object { $_.Subject -eq "CN=$CertificateSubject" } |
Sort-Object NotAfter -Descending |
Select-Object -First 1
if (-not $cert) {
Write-Host "[AE] Certificate not found. Creating self-signed certificate."
$cert = New-SelfSignedCertificate `
-Subject $CertificateSubject `
-CertStoreLocation Cert:CurrentUser\My `
-KeyExportPolicy Exportable `
-Type DocumentEncryptionCert `
-KeyUsage DataEncipherment `
-KeySpec KeyExchange
}
Write-Host "[AE] Connecting to SQL Server '$ServerName' / Database '$DatabaseName'"
$connStr = "Server=$ServerName;Database=$DatabaseName;Integrated Security=True;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30"
try {
$database = Get-SqlDatabase -ConnectionString $connStr -ErrorAction Stop
}
catch {
Write-Error "Failed to connect to '$ServerName' database '$DatabaseName'. Verify instance name SQL2025, database existence, and local permissions."
throw
}
Write-Host "[AE] Creating CMK settings from certificate thumbprint"
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint
Write-Host "[AE] Ensuring CMK '$CmkName' exists"
$existingCmk = Get-SqlColumnMasterKey -InputObject $database | Where-Object { $_.Name -eq $CmkName }
if (-not $existingCmk) {
New-SqlColumnMasterKey -Name $CmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings | Out-Null
}
Write-Host "[AE] Ensuring CEK '$CekName' exists"
$existingCek = Get-SqlColumnEncryptionKey -InputObject $database | Where-Object { $_.Name -eq $CekName }
if (-not $existingCek) {
New-SqlColumnEncryptionKey -Name $CekName -InputObject $database -ColumnMasterKey $CmkName | Out-Null
}
Write-Host "Completed successfully"
Usługa Azure Key Vault bez separacji ról (przykład)
Ten skrypt jest kompleksowym przykładem udostępniania i konfigurowania magazynu kluczy w Azure Key Vault, generowania klucza głównego kolumny w magazynie, generowania i szyfrowania klucza szyfrowania kolumn oraz tworzenia metadanych klucza w Azure SQL Database.
param(
[Parameter(Mandatory = $true)] [string]$SubscriptionId,
[Parameter(Mandatory = $true)] [string]$ResourceGroupName,
[Parameter(Mandatory = $true)] [string]$AzureLocation,
[Parameter(Mandatory = $true)] [string]$KeyVaultName,
[Parameter(Mandatory = $true)] [string]$KeyName,
[Parameter(Mandatory = $true)] [string]$ServerName,
[Parameter(Mandatory = $true)] [string]$DatabaseName,
[string]$CmkName = "CMK",
[string]$CekName = "CEK",
[bool]$AssignRbacToCurrentPrincipal = $true
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
Import-Module Az.Accounts -ErrorAction Stop
Import-Module Az.Resources -ErrorAction Stop
Import-Module Az.KeyVault -ErrorAction Stop
Import-Module SqlServer -ErrorAction Stop
function Get-CurrentPrincipalObjectId {
param([string]$AccountId)
$userSignedIn = Get-AzADUser -SignedIn -ErrorAction SilentlyContinue
if ($userSignedIn) { return $userSignedIn.Id }
$user = Get-AzADUser -UserPrincipalName $AccountId -ErrorAction SilentlyContinue
if ($user) { return $user.Id }
$sp = Get-AzADServicePrincipal -DisplayName $AccountId -ErrorAction SilentlyContinue | Select-Object -First 1
if ($sp) { return $sp.Id }
throw "Could not resolve Microsoft Entra object id for account '$AccountId'."
}
try {
Write-Host "[AE] Signing in and selecting subscription"
Connect-AzAccount | Out-Null
$ctx = Set-AzContext -SubscriptionId $SubscriptionId
Write-Host "[AE] Ensuring resource group exists"
$resourceGroup = Get-AzResourceGroup -Name $ResourceGroupName -ErrorAction SilentlyContinue
if (-not $resourceGroup) {
$resourceGroup = New-AzResourceGroup -Name $ResourceGroupName -Location $AzureLocation
}
Write-Host "[AE] Ensuring key vault exists (RBAC mode)"
$vault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -ErrorAction SilentlyContinue
if (-not $vault) {
$vault = New-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -Location $AzureLocation -EnableRbacAuthorization
}
if (-not $vault.EnableRbacAuthorization) {
throw "Key Vault '$KeyVaultName' is not using RBAC authorization. Enable RBAC authorization on the vault before running this script."
}
if ($AssignRbacToCurrentPrincipal) {
Write-Host "[AE] Ensuring RBAC role assignment"
$principalSignInName = $ctx.Account.Id
$roleName = "Key Vault Crypto Officer"
$existingRole = Get-AzRoleAssignment -SignInName $principalSignInName -Scope $vault.ResourceId -RoleDefinitionName $roleName -ErrorAction SilentlyContinue
if (-not $existingRole) {
New-AzRoleAssignment -SignInName $principalSignInName -Scope $vault.ResourceId -RoleDefinitionName $roleName | Out-Null
}
}
Write-Host "[AE] Ensuring column master key material exists in Key Vault"
$akvKey = Get-AzKeyVaultKey -VaultName $KeyVaultName -Name $KeyName -ErrorAction SilentlyContinue
if (-not $akvKey) {
$akvKey = Add-AzKeyVaultKey -VaultName $KeyVaultName -Name $KeyName -Destination "Software"
}
Write-Host "[AE] Connecting to Azure SQL and creating metadata"
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl "https://vault.azure.net").Token
$connStr = "Server=tcp:$ServerName.database.windows.net,1433;Database=$DatabaseName;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr -Encrypt Mandatory
$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyUrl $akvKey.Key.Kid
$existingCmk = Get-SqlColumnMasterKey -InputObject $database | Where-Object { $_.Name -eq $CmkName }
if (-not $existingCmk) {
New-SqlColumnMasterKey -Name $CmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings | Out-Null
}
$existingCek = Get-SqlColumnEncryptionKey -InputObject $database | Where-Object { $_.Name -eq $CekName }
if (-not $existingCek) {
New-SqlColumnEncryptionKey -Name $CekName -InputObject $database -ColumnMasterKey $CmkName -KeyVaultAccessToken $keyVaultAccessToken | Out-Null
}
Write-Host "Completed successfully"
}
catch {
Write-Error "Script failed: $($_.Exception.Message)"
throw
}
CNG/KSP bez separacji ról (przykład)
Poniższy skrypt to kompleksowy przykład generowania klucza głównego kolumny w repozytorium kluczy, które implementuje interfejs API kryptografii nowej generacji (CNG), generowania i szyfrowania klucza szyfrowania kolumny oraz tworzenia metadanych kluczy w bazie danych programu SQL Server.
W przykładzie użyto magazynu kluczy, który korzysta z dostawcy magazynu kluczy Microsoft Software Key Storage Provider. Możesz zmodyfikować przykład, aby używał innego magazynu, takiego jak sprzętowy moduł zabezpieczeń. W tym celu należy upewnić się, że dostawca magazynu kluczy (KSP), który implementuje CNG dla Twojego urządzenia, jest zainstalowany i działa prawidłowo na maszynie. Musisz zastąpić Microsoft Software Key Storage Provider nazwą KSP dla Twojego urządzenia.
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$ServerName = "<server name>",
[Parameter(Mandatory = $true)]
[string]$DatabaseName = "<database name>",
[Parameter(Mandatory = $false)]
[string]$CngKeyName = "AlwaysEncryptedKey",
[Parameter(Mandatory = $false)]
[string]$CmkName = "CMK",
[Parameter(Mandatory = $false)]
[string]$CekName = "CEK"
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
# Local key store provider and key settings.
$cngProviderName = "Microsoft Software Key Storage Provider"
$cngAlgorithmName = "RSA"
$cngKeySize = 2048
Import-Module SqlServer -ErrorAction Stop
Write-Host "[AE] Creating local CNG key '$CngKeyName'"
$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)
[System.Security.Cryptography.CngKey]::Create($cngAlgorithm, $CngKeyName, $cngKeyParams) | Out-Null
Write-Host "[AE] Connecting to $ServerName / $DatabaseName"
$connStr = "Server=$ServerName;Database=$DatabaseName;Integrated Security=True;Encrypt=True;TrustServerCertificate=True"
$database = Get-SqlDatabase -ConnectionString $connStr
Write-Host "[AE] Preparing column master key settings"
$cmkSettings = New-SqlCngColumnMasterKeySettings -CngProviderName $cngProviderName -KeyName $CngKeyName
Write-Host "[AE] Ensuring CMK exists"
$existingCmk = Get-SqlColumnMasterKey -InputObject $database | Where-Object { $_.Name -eq $CmkName }
if (-not $existingCmk) {
New-SqlColumnMasterKey -Name $CmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings | Out-Null
}
Write-Host "[AE] Ensuring CEK exists"
$existingCek = Get-SqlColumnEncryptionKey -InputObject $database | Where-Object { $_.Name -eq $CekName }
if (-not $existingCek) {
New-SqlColumnEncryptionKey -Name $CekName -InputObject $database -ColumnMasterKey $CmkName | Out-Null
}
Write-Host "Completed successfully"
Udostępnianie kluczy z separacją ról
Ta sekcja zawiera kroki konfigurowania szyfrowania, w którym administratorzy zabezpieczeń nie mają dostępu do bazy danych, a administratorzy baz danych nie mają dostępu do magazynu kluczy ani kluczy w postaci zwykłego tekstu.
administrator zabezpieczeń
Przed wykonaniem jakichkolwiek kroków obejmujących dostęp do kluczy w postaci zwykłego tekstu lub magazynu kluczy (zidentyfikowanego w kolumnie Accesses plaintext keys/key store w poniższej tabeli) upewnij się, że:
- Środowisko programu PowerShell działa na bezpiecznej maszynie innej niż komputer hostujący bazę danych.
- Administratorzy baz danych w organizacji nie mają dostępu do maszyny, co zaprzeczyłoby celowi separacji ról.
Aby uzyskać więcej informacji, zobacz Zagadnienia dotyczące zabezpieczeń dotyczące zarządzania kluczami.
| Zadanie | Artykuł | Uzyskuje dostęp do kluczy w postaci zwykłego tekstu/magazynu kluczy | Uzyskuje dostęp do bazy danych |
|---|---|---|---|
| Krok 1. Utwórz klucz główny dla kolumny w magazynie kluczy. Uwaga: moduł SqlServer nie obsługuje tego kroku. Aby wykonać to zadanie z poziomu wiersza polecenia, należy użyć narzędzi specyficznych dla typu magazynu kluczy. |
Tworzenie kluczy głównych kolumn i ich przechowywanie dla Always Encrypted | Tak | Nie |
| Krok 2. Uruchom sesję programu PowerShell i zaimportuj moduł SqlServer. | Importowanie modułu SqlServer | Nie | Nie |
| Krok 3. Utwórz obiekt SqlColumnMasterKeySettings zawierający informacje o lokalizacji klucza głównego kolumny. SqlColumnMasterKeySettings jest obiektem, który istnieje w pamięci (w programie PowerShell). Użyj polecenia cmdlet odpowiedniego dla magazynu kluczy. |
new-SqlAzureKeyVaultColumnMasterKeySettings Nowe-UstawieniaKluczaGłównegoKolumnSqlCertStore New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Nie | Nie |
| Krok 4. Uwierzytelnij się w Azure, jeśli klucz główny kolumny jest przechowywany w Azure Key Vault. | Connect-AzAccount | Tak | Nie |
| Krok 5. Uzyskaj token dostępu do Azure Key Vault, jeśli Twój klucz główny kolumny jest przechowywany w Azure Key Vault. | Get-AzAccessToken | Nie | Nie |
| Krok 6. Wygeneruj klucz szyfrowania kolumny, zaszyfruj go przy użyciu klucza głównego kolumny, aby wygenerować zaszyfrowaną wartość klucza szyfrowania kolumny. | new-SqlColumnEncryptionKeyEncryptedValue | Tak | Nie |
| Krok 7. Podaj lokalizację klucza głównego kolumny (nazwę dostawcy i ścieżkę klucza głównego kolumny) oraz zaszyfrowaną wartość klucza szyfrowania kolumny administratorowi bazy danych. | Zobacz przykłady na końcu artykułu. | Nie | Nie |
Administrator Baz Danych
Administratorzy baz danych używają informacji, które otrzymują od administratora zabezpieczeń (krok 7 powyżej), aby utworzyć metadane klucza Always Encrypted w bazie danych i zarządzać nimi.
| Zadanie | Artykuł | Uzyskuje dostęp do kluczy w postaci zwykłego tekstu | Uzyskuje dostęp do bazy danych |
|---|---|---|---|
| Krok 1. Uzyskaj lokalizację klucza głównego kolumny i zaszyfrowaną wartość klucza szyfrowania kolumny od Administratora Bezpieczeństwa. | Zobacz przykłady na końcu artykułu. | Nie | Nie |
| Krok 2. Uruchom środowisko programu PowerShell i zaimportuj moduł SqlServer. | konfigurowanie funkcji Always Encrypted przy użyciu programu PowerShell | Nie | Nie |
| Krok 3. Nawiąż połączenie z serwerem i bazą danych. | Nawiązywanie połączenia z bazą danych | Nie | Tak |
| Krok 4. Utwórz obiekt SqlColumnMasterKeySettings zawierający informacje o lokalizacji klucza głównego kolumny. SqlColumnMasterKeySettings to obiekt, który istnieje w pamięci. | Nowe-UstawieniaGłównegoKluczaKolumnySql | Nie | Nie |
| Krok 5. Utwórz metadane dotyczące klucza głównego kolumny w bazie danych. Nuta: Nie weryfikujemy ważności kluczy ani certyfikatów używanych do generowania klucza głównego kolumny. |
new-SqlColumnMasterKey Uwaga: w obszarze okładek polecenie cmdlet wystawia instrukcję CREATE COLUMN MASTER KEY (Transact-SQL) w celu utworzenia metadanych klucza głównego kolumny. |
Nie | Tak |
| Krok 6. Utwórz metadane klucza szyfrowania kolumny w bazie danych. | New-SqlColumnEncryptionKey Uwaga: Administratorzy baz danych używają odmiany polecenia cmdlet, które tworzy tylko metadane klucza szyfrowania kolumny. W tle polecenie cmdlet wykonuje instrukcję CREATE COLUMN ENCRYPTION KEY (Transact-SQL) w celu utworzenia metadanych klucza szyfrowania kolumn. |
Nie | Tak |
Magazyn certyfikatów systemu Windows z separacją ról (przykład)
administrator zabezpieczeń
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$ServerName = '<server name>',
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$DatabaseName = '<database name>',
[Parameter(Mandatory = $false)]
[string]$CertificateSubject = 'AlwaysEncryptedCert',
[Parameter(Mandatory = $false)]
[string]$CmkName = 'CMK1',
[Parameter(Mandatory = $false)]
[string]$CekName = 'CEK1',
[Parameter(Mandatory = $false)]
[string]$ExportKeyDataPath = 'C:\temp\keydata.txt'
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
Import-Module SqlServer -MinimumVersion 22.0.50 -ErrorAction Stop
Write-Host "[AE] Finding certificate '$CertificateSubject' in CurrentUser\\My"
$cert = Get-ChildItem -Path 'Cert:CurrentUser\My' |
Where-Object { $_.Subject -eq "CN=$CertificateSubject" } |
Sort-Object NotAfter -Descending |
Select-Object -First 1
if (-not $cert) {
Write-Host '[AE] Certificate not found. Creating a new self-signed certificate.'
$cert = New-SelfSignedCertificate `
-Subject $CertificateSubject `
-CertStoreLocation 'Cert:CurrentUser\My' `
-KeyExportPolicy Exportable `
-Type DocumentEncryptionCert `
-KeyUsage DataEncipherment `
-KeySpec KeyExchange
}
Write-Host "[AE] Connecting to SQL Server '$ServerName' / Database '$DatabaseName'"
$connStr = "Server=$ServerName;Database=$DatabaseName;Integrated Security=True;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30"
try {
$database = Get-SqlDatabase -ConnectionString $connStr -ErrorAction Stop
}
catch {
Write-Error "Failed to connect to '$ServerName' / '$DatabaseName'. Verify instance name, database, and local permissions."
throw
}
Write-Host '[AE] Building CMK settings from certificate'
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation 'CurrentUser' -Thumbprint $cert.Thumbprint
Write-Host "[AE] Ensuring CMK '$CmkName' exists"
$existingCmk = Get-SqlColumnMasterKey -InputObject $database | Where-Object { $_.Name -eq $CmkName }
if (-not $existingCmk) {
New-SqlColumnMasterKey -Name $CmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings | Out-Null
}
Write-Host "[AE] Ensuring CEK '$CekName' exists"
$existingCek = Get-SqlColumnEncryptionKey -InputObject $database | Where-Object { $_.Name -eq $CekName }
if (-not $existingCek) {
New-SqlColumnEncryptionKey -Name $CekName -InputObject $database -ColumnMasterKey $CmkName | Out-Null
}
if ($ExportKeyDataPath) {
Write-Host "[AE] Exporting key metadata to '$ExportKeyDataPath'"
$encryptedValue = New-SqlColumnEncryptionKeyEncryptedValue -TargetColumnMasterKeySettings $cmkSettings
"KeyStoreProviderName,KeyPath,EncryptedValue" | Set-Content -Path $ExportKeyDataPath -Encoding UTF8
"$($cmkSettings.KeyStoreProviderName),$($cmkSettings.KeyPath),$encryptedValue" | Add-Content -Path $ExportKeyDataPath -Encoding UTF8
}
Write-Host 'Completed successfully'
Administrator Baz Danych
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$ServerName = 'localhost\SQL2025',
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$DatabaseName = 'AdventureWorks2025',
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$KeyDataFile = 'C:\temp\keydata.txt',
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$CmkName = 'CMK1',
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$CekName = 'CEK1'
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
Import-Module SqlServer -MinimumVersion 22.0.50 -ErrorAction Stop
if (-not (Test-Path -Path $KeyDataFile -PathType Leaf)) {
throw "Key data file not found: $KeyDataFile"
}
Write-Host "[AE] Loading key metadata from '$KeyDataFile'"
$keyData = Import-Csv -Path $KeyDataFile
if (-not $keyData) {
throw "Key data file '$KeyDataFile' is empty."
}
$keyDataRow = $keyData | Select-Object -First 1
if (-not $keyDataRow.KeyStoreProviderName -or -not $keyDataRow.KeyPath -or -not $keyDataRow.EncryptedValue) {
throw "Key data file must include non-empty columns: KeyStoreProviderName, KeyPath, EncryptedValue."
}
Write-Host "[AE] Connecting to SQL Server '$ServerName' / Database '$DatabaseName'"
$connStr = "Server=$ServerName;Database=$DatabaseName;Integrated Security=True;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30"
try {
$database = Get-SqlDatabase -ConnectionString $connStr -ErrorAction Stop
}
catch {
Write-Error "Failed to connect to '$ServerName' / '$DatabaseName'. Verify instance name, database, and local permissions."
throw
}
Write-Host "[AE] Building CMK settings for provider '$($keyDataRow.KeyStoreProviderName)'"
$cmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $keyDataRow.KeyStoreProviderName -KeyPath $keyDataRow.KeyPath
Write-Host "[AE] Ensuring CMK '$CmkName' exists"
$existingCmk = Get-SqlColumnMasterKey -InputObject $database | Where-Object { $_.Name -eq $CmkName }
if (-not $existingCmk) {
New-SqlColumnMasterKey -Name $CmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings | Out-Null
}
Write-Host "[AE] Ensuring CEK '$CekName' exists"
$existingCek = Get-SqlColumnEncryptionKey -InputObject $database | Where-Object { $_.Name -eq $CekName }
if (-not $existingCek) {
New-SqlColumnEncryptionKey -Name $CekName -InputObject $database -ColumnMasterKey $CmkName -EncryptedValue $keyDataRow.EncryptedValue | Out-Null
}
Write-Host 'Completed successfully'
Treści powiązane
- Konfigurowanie szyfrowania kolumn przy użyciu funkcji Always Encrypted przy użyciu programu PowerShell
- obracanie kluczy Always Encrypted przy użyciu programu PowerShell
- Tworzenie aplikacji przy użyciu usługi Always Encrypted
- Zawsze szyfrowane
- Omówienie zarządzania kluczami dla usługi Always Encrypted
- Tworzenie kluczy głównych kolumn i ich przechowywanie dla Always Encrypted
- konfigurowanie funkcji Always Encrypted przy użyciu programu PowerShell
- Aprowizuj klucze Always Encrypted przy użyciu programu SQL Server Management Studio
- CREATE COLUMN MASTER KEY (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)