Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada de SQL do Azure
Este artigo fornece as etapas para provisionar chaves para Always Encrypted usando o módulo do SqlServer PowerShell. Você pode usar o PowerShell para provisionar chaves Always Encrypted com e sem separação de funções, oferecendo controle sobre quem tem acesso à criptografia de chaves real no repositório de chaves e quem tem acesso ao banco de dados.
Note
A Microsoft recomenda usar o PowerShell 7 ou superior ao executar scripts do PowerShell para Always Encrypted. O PowerShell 7 fornece suporte multiplataforma aprimorado, melhor desempenho e compatibilidade com a versão mais recente do módulo SqlServer (v22+), que é necessária para muitos cenários do Always Encrypted.
Para obter uma visão geral do gerenciamento de chaves do Always Encrypted, incluindo algumas práticas recomendadas de alto nível, confira Visão geral do gerenciamento de chaves para Always Encrypted. Para obter informações sobre como começar a usar o módulo do SqlServer PowerShell para Always Encrypted, consulte Configurar Always Encrypted usando o PowerShell.
Provisionamento de chave sem separação de função
O método de provisionamento de chave descrito nesta seção não dá suporte à separação de função entre administradores de segurança e DBAs. Algumas das etapas nesta seção combinam operações em chaves físicas com operações em metadados de chave. Portanto, use esse método de provisionamento das chaves se sua organização usar o modelo DevOps ou se o banco de dados estiver hospedado na nuvem e o objetivo principal for restringir os administradores de nuvem (mas não os DBAs locais) de acessar dados confidenciais. Não use esse método se potenciais adversários incluem DBAs ou se os DBAs não devem ter acesso a dados confidenciais.
Antes de executar quaisquer etapas que envolvam o acesso a chaves em texto claro ou ao repositório de chaves (identificado na coluna de Acessa chaves em texto claro/repositório de chaves na tabela a seguir), certifique-se de que o ambiente PowerShell esteja sendo executado num computador seguro, diferente daquele que hospeda seu banco de dados. Para obter mais informações, consulte Considerações de Segurança para o Gerenciamento de Chaves.
| Tarefa | Artigo | Acessa chaves de texto não criptografado/repositório de chaves | Acessar banco de dados |
|---|---|---|---|
| Etapa 1. Crie uma chave mestra de coluna em um repositório de chaves. Observação: O módulo do SqlServer PowerShell não dá suporte a essa etapa. Para realizar essa tarefa da linha de comando, use ferramentas especificas para o repositório de chaves selecionado. |
Criar e armazenar chaves mestras de coluna para Always Encrypted | Sim | Não |
| Etapa 2. Inicie um ambiente do PowerShell e importe o módulo do SqlServer PowerShell. | Configurar Always Encrypted usando o PowerShell | Não | Não |
| Etapa 3. Conecte-se ao servidor e banco de dados. | Conectar a um banco de dados | Não | Sim |
| Etapa 4. Crie um objeto SqlColumnMasterKeySettings contendo informações sobre o local da sua chave mestra de coluna. SqlColumnMasterKeySettings é um objeto que existe na memória (no PowerShell). Use o cmdlet específico para o repositório de chaves. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Não | Não |
| Etapa 5. Crie os metadados da chave mestra de coluna no banco de dados. Nota: Não verificamos a validade das chaves ou certificados usados para gerar a chave mestra de coluna. |
[New-SqlColumnMasterKey](/powershell/sqlserver/sqlserver/vlatest/new-sqlcolumnmasterkey Observação: nos covers, o cmdlet emite a CREATE COLUMN MASTER KEY instrução para criar metadados de chave. |
Não | Sim |
| Etapa 6. Autentique no Azure se a chave mestra de coluna estiver armazenada no Cofre de Chaves do Azure. | Connect-AzAccount | Sim | Não |
| Etapa 7. Obtenha um token de acesso para o Azure Key Vault se sua chave mestra de coluna estiver armazenada no Azure Key Vault. | Get-AzAccessToken | Não | Não |
| Etapa 8. Gere uma nova chave de criptografia de coluna, criptografe-a com a chave mestra de coluna e crie metadados de chave de criptografia de coluna no banco de dados. |
New-SqlColumnEncryptionKey Observação: use uma variação do cmdlet que gera e criptografa internamente uma chave de criptografia de coluna. Nota: Nas capas, o cmdlet emite a CREATE COLUMN ENCRYPTION KEY instrução para criar metadados de chave. |
Sim | Sim |
Repositório de Certificados do Windows sem separação de função (exemplo)
Esse script é um exemplo de ponta a ponta para gerar uma chave mestra de coluna que é um certificado no Repositório de Certificados do Windows, gerando e criptografando uma chave de criptografia de coluna e criando metadados de chave em um banco de dados do 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"
Azure Key Vault sem separação de função (exemplo)
Esse script é um exemplo de ponta a ponta para provisionar e configurar um cofre de chaves do Azure Key Vault, gerar uma chave mestra de coluna no cofre, gerar e criptografar uma chave de criptografia de coluna e criar metadados de chave em um Banco de Dados SQL do Azure.
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 sem separação de função (exemplo)
Esse script é um exemplo de ponta a ponta para gerar uma chave mestra de coluna em um repositório de chaves que implementa a API CNG (Cryptography Next Generation), gerando e criptografando uma chave de criptografia de coluna e criando metadados de chave em um banco de dados do SQL Server.
O exemplo usa o repositório de chaves que usa o Provedor de Armazenamento de Chaves de Software da Microsoft. Você pode optar por modificar o exemplo para usar outro repositório, como o módulo de segurança de hardware. Para fazer isso, você precisará verificar se o KSP (provedor de repositório de chaves) que implementa a CNG para seu dispositivo está instalado corretamente em seu computador. Você precisará substituir Microsoft Software Key Storage Provider pelo nome do KSP do dispositivo.
[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"
Provisionamento de chave com separação de funções
Esta seção fornece as etapas para configurar a criptografia na qual os administradores de segurança não têm acesso ao banco de dados e os administradores de banco de dados não têm acesso às chaves de texto não criptografado ou ao repositório de chaves.
Administrador de segurança
Antes de executar as etapas que envolvem o acesso a chaves de texto sem formatação ou ao repositório de chaves (identificado na coluna Accesses plaintext keys/key store na tabela a seguir), verifique se:
- O ambiente do PowerShell é executado em um computador seguro diferente daquele que hospeda o banco de dados.
- Os DBAs na sua organização não têm acesso ao computador (isso sabotaria o propósito da separação de funções).
Para obter mais informações, consulte Considerações de Segurança para o Gerenciamento de Chaves.
| Tarefa | Artigo | Acessa chaves de texto não criptografado/repositório de chaves | Acessar banco de dados |
|---|---|---|---|
| Etapa 1. Crie uma chave mestra de coluna em um repositório de chaves. Observação: O módulo do SqlServer não dá suporte a essa etapa. Para realizar essa tarefa da linha de comando, você precisa usar ferramentas especificas para o tipo do seu repositório de chaves. |
Criar e armazenar chaves mestras de coluna para Always Encrypted | Sim | Não |
| Etapa 2. Inicie uma sessão do PowerShell e importe o módulo do SqlServer. | Importar o módulo do SqlServer | Não | Não |
| Etapa 3. Crie um objeto SqlColumnMasterKeySettings contendo informações sobre o local da sua chave mestra de coluna. SqlColumnMasterKeySettings é um objeto que existe na memória (no PowerShell). Use o cmdlet específico para o repositório de chaves. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Não | Não |
| Etapa 4. Autentique no Azure se a chave mestra de coluna estiver armazenada no Cofre de Chaves do Azure. | Connect-AzAccount | Sim | Não |
| Etapa 5. Obtenha um token de acesso para o Azure Key Vault se sua chave mestra de coluna estiver armazenada no Azure Key Vault. | Get-AzAccessToken | Não | Não |
| Etapa 6. Gere uma nova chave de criptografia de coluna, criptografe-a com a chave mestra para produzir um valor criptografado da chave de criptografia de coluna. | New-SqlColumnEncryptionKeyEncryptedValue | Sim | Não |
| Etapa 7. Compartilhe o local da nova chave mestra de coluna (o nome do provedor e o caminho principal da chave mestra de coluna) e do valor criptografado da chave de criptografia de coluna para o DBA. | Veja os exemplos no final do artigo. | Não | Não |
Administrador de Banco de Dados (DBA)
Os DBAs usam as informações recebidas do Administrador de Segurança (etapa 7 acima) para criar e gerenciar os metadados de chave Always Encrypted no banco de dados.
| Tarefa | Artigo | Acessa chaves de texto não criptografado | Acessar banco de dados |
|---|---|---|---|
| Etapa 1. Forneça o local da chave mestra de coluna e um valor criptografado da chave de criptografia de coluna para o Administrador de Segurança. | Veja os exemplos no final do artigo. | Não | Não |
| Etapa 2. Inicie um ambiente do PowerShell e importe o módulo do SqlServer. | Configurar Always Encrypted usando o PowerShell | Não | Não |
| Etapa 3. Conecte-se ao seu servidor e um banco de dados. | Conectar a um banco de dados | Não | Sim |
| Etapa 4. Crie um objeto SqlColumnMasterKeySettings contendo informações sobre o local da sua chave mestra de coluna. SqlColumnMasterKeySettings é um objeto que existe na memória. | New-SqlColumnMasterKeySettings | Não | Não |
| Etapa 5. Crie os metadados da chave mestra de coluna no banco de dados. Nota: Não verificamos a validade das chaves ou certificados usados para gerar a chave mestra de coluna. |
New-SqlColumnMasterKey Observação: nos covers, o cmdlet emite a CREATE COLUMN MASTER KEY instrução (Transact-SQL) para criar metadados de chave mestra de coluna. |
Não | Sim |
| Etapa 6. Crie os metadados de chave de criptografia de coluna no banco de dados. | New-SqlColumnEncryptionKey Observação: DBAs usam uma variação do cmdlet que cria apenas os metadados de chave de criptografia de coluna. Nas capas, o cmdlet emite a CREATE COLUMN ENCRYPTION KEY instrução (Transact-SQL) para criar metadados de chave de criptografia de coluna. |
Não | Sim |
Repositório de Certificados do Windows com separação de função (exemplo)
Administrador de segurança
[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'
Administrador de Banco de Dados (DBA)
[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'
Conteúdo relacionado
- Configurar a criptografia de coluna usando o Always Encrypted com o PowerShell
- Girar chaves do Always Encrypted usando o PowerShell
- Desenvolver aplicativos usando o Always Encrypted
- Always Encrypted
- Visão geral do gerenciamento de chaves do Always Encrypted
- Criar e armazenar chaves mestras de coluna para Always Encrypted
- Configurar Always Encrypted usando o PowerShell
- Provisionar chaves Always Encrypted usando o 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)