適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
この記事では、 SqlServer PowerShell モジュールを使用し、Always Encrypted のキーを与える手順について説明します。 PowerShell を使用し、Always Encrypted キーを与えることができますが、そのとき、 役割の分離を指定することも、指定しないこともできます。キー ストアの実際の暗号鍵にアクセスするユーザーとデータベースにアクセスするユーザーを制御できます。
Note
Microsoftでは、Always Encrypted PowerShell スクリプトを実行するときに PowerShell 7 以降を使用することをお勧めします。 PowerShell 7 では、多くの Always Encrypted シナリオに必要な、クロスプラットフォームのサポートが強化され、パフォーマンスが向上し、SqlServer モジュール (v22 以降) との最新の互換性が提供されます。
推奨されるベスト プラクティスを含む (上位)、Always Encrypted のキー管理の概要については、「Always Encrypted のキー管理の概要」を参照してください。 Always Encrypted に SqlServer PowerShell を使用する方法については、「 PowerShell を使用した Always Encrypted の構成」を参照してください。
ロールを分離しないキー プロビジョニング
このセクションで説明するキー プロビジョニング方法では、セキュリティ管理者と DBA の間のロールの分離はサポートされていません。 このセクションの一部の手順では、物理キーに対する操作とキー メタデータに対する操作を組み合わせます。 そのため、組織が DevOps モデルを使用している場合、またはデータベースがクラウドでホストされていて、クラウド管理者 (オンプレミスの DBA ではない) が機密データへのアクセスを制限することが主な目的である場合は、この方法でキーをプロビジョニングします。 潜在的な敵対者に DBA が含まれている場合、または DBA が機密データにアクセスできない場合は、この方法を使用しないでください。
プレーンテキスト キーまたはキー ストア (次の表の 「 プレーンテキスト キー/キー ストアへのアクセス 」列で識別される) へのアクセスを含む手順を実行する前に、PowerShell 環境が、データベースをホストしているコンピューターとは異なるセキュリティで保護されたコンピューター上で実行されていることを確認してください。 詳細については、「 キー管理でのセキュリティに関する考慮事項」を参照してください。
| タスク | [アーティクル] | プレーンテキストのキー/キー ストアへのアクセス | データベースへのアクセス |
|---|---|---|---|
| ステップ 1. キー ストアで列マスター キーを作成します。 注意: SqlServer PowerShell モジュールでは、この手順はサポートされていません。 コマンドラインからこのタスクを実行するには、選択したキー ストアに固有のツールを使用します。 |
Always Encrypted の列マスター キーを作成して保存する | はい | いいえ |
| ステップ 2. PowerShell 環境を起動し、SqlServer の PowerShell モジュールをインポートします。 | PowerShell を使用した Always Encrypted の構成 | いいえ | いいえ |
| 手順 3. サーバーとデータベースに接続します。 | データベースに接続する | いいえ | はい |
| ステップ 4: 列マスター キーの場所に関する情報を含む SqlColumnMasterKeySettings オブジェクトを作成します。 SqlColumnMasterKeySettings は、メモリ (PowerShell) に存在するオブジェクトです。 キー ストアに固有のコマンドレットを使用します。 |
New-SqlAzureKeyVaultColumnMasterKeySettings 新しい-SqlCertificateStoreColumnMasterKeySettings 新しい-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings (SQLのCSPカラムマスターキー設定の新規作成) |
いいえ | いいえ |
| ステップ 5: データベースの列マスター キーに関するメタデータを作成します。 手記: 列マスター キーの生成に使用されるキーまたは証明書の有効性は確認されません。 |
[New-SqlColumnMasterKey](/powershell/sqlserver/sqlserver/vlatest/new-sqlcolumnmasterkey 注: このコマンドレットでは、キー メタデータを作成するために CREATE COLUMN MASTER KEY ステートメントを発行します。 |
いいえ | はい |
| ステップ 6. 列マスター キーが Azure Key Vault に保存されている場合、Azure に対して認証します。 | Connect-AzAccount (接続-AzAccount) | はい | いいえ |
| 手順 7. 列マスター キーが Azure Key Vault に格納されている場合は、Azure Key Vault のアクセス トークンを取得します。 | Get-AzAccessToken の取得 | いいえ | いいえ |
| 手順 8. 新しい列暗号化キーを生成し、それを列マスター キーで暗号化し、データベースで列の暗号化キー メタデータを作成します。 |
新しい SqlColumnEncryptionKey 注: 内部で列の暗号化キーを生成し、暗号化するコマンドレットのバリエーションを使用します。 メモ: このコマンドレットでは、キー メタデータを作成するために CREATE COLUMN ENCRYPTION KEY ステートメントを発行します。 |
はい | はい |
役割を分離しない Windows 証明書ストア (例)
このスクリプトは、Windows 証明書ストアの証明書である列マスター キーを生成し、列の暗号化キーを生成して暗号化し、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 (例)
このスクリプトは、Azure Key Vault でキー コンテナーをプロビジョニングして構成し、そのキー コンテナーで列マスター キーを生成し、列の暗号化キーを生成して暗号化し、Azure SQL データベースでキー メタデータを作成する方法を端から端まで例示しています。
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 (例)
下のスクリプトは、Cryptography Next Generation API (CNG) を実装するキー ストアで列マスター キーを生成し、列の暗号化キーを生成して暗号化し、SQL Server データベースでキー メタデータを作成する方法を端から端まで例示しています。
この例では、Microsoft Software Key Storage Provider を使用するキー ストアを使用します。 ハードウェア セキュリティ モジュールなど、別のストアを使用するように例を変更することもできます。 そのためには、デバイスに CNG を実装するキー ストア プロバイダー (KSP) がコンピューターに適切にインストールされていることを確認する必要があります。
Microsoft Software Key Storage Provider をデバイスの KSP 名に置き換える必要があります。
[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"
役割の分離を指定したキーのプロビジョニング
このセクションでは、セキュリティ管理者がデータベースにアクセスせず、データベース管理者にキー ストアまたはプレーンテキスト キーへのアクセス許可を与えない暗号化を構成するための手順について説明します。
セキュリティ管理者
プレーンテキスト キーまたはキー ストア (次の表のプレーンテキスト キー/キー ストア列にアクセスする列で識別される) へのアクセス を含む手順を実行する前に、次の点を確認してください。
- データベースをホストしているコンピューターとは別の安全なコンピューターで PowerShell 環境が実行されています。
- 組織の DBA に、コンピューターにアクセスする許可が与えられていません (アクセスできると、役割の分離の目的が達成されません)。
詳細については、「 キー管理でのセキュリティに関する考慮事項」を参照してください。
| タスク | [アーティクル] | プレーンテキストのキー/キー ストアへのアクセス | データベースへのアクセス |
|---|---|---|---|
| ステップ 1. キー ストアで列マスター キーを作成します。 注意: SqlServer モジュールでは、この手順はサポートされていません。 コマンドラインからこのタスクを実行するには、キー ストアの種類に固有のツールを使用する必要があります。 |
Always Encrypted の列マスター キーを作成して保存する | はい | いいえ |
| ステップ 2. PowerShell セッションを起動し、SqlServer のモジュールをインポートします。 | SqlServer モジュールのインポート | いいえ | いいえ |
| 手順 3. 列マスター キーの場所に関する情報を含む SqlColumnMasterKeySettings オブジェクトを作成します。 SqlColumnMasterKeySettings は、メモリ (PowerShell) に存在するオブジェクトです。 キー ストアに固有のコマンドレットを使用します。 |
New-SqlAzureKeyVaultColumnMasterKeySettings 新しい-SqlCertificateStoreColumnMasterKeySettings 新しい-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings (SQLのCSPカラムマスターキー設定の新規作成) |
いいえ | いいえ |
| ステップ 4: 列マスター キーが Azure Key Vault に保存されている場合、Azure に対して認証します。 | Connect-AzAccount (接続-AzAccount) | はい | いいえ |
| ステップ 5: 列マスター キーが Azure Key Vault に格納されている場合は、Azure Key Vault のアクセス トークンを取得します。 | Get-AzAccessToken の取得 | いいえ | いいえ |
| ステップ 6. 列暗号化キーを生成し、それを列マスター キーで暗号化して列の暗号化キーの値を暗号化します。 | 新しい SqlColumnEncryptionKeyEncryptedValue | はい | いいえ |
| 手順 7. 列マスター キーの場所 (プロバイダー名と列マスター キーのキー パス) と列暗号化キーの暗号化値を DBA に提供します。 | 記事の最後にある例を参照してください。 | いいえ | いいえ |
DBA
DBA は、セキュリティ管理者から受け取った (上記の手順 7) 情報を利用し、データベースの Always Encrypted キー メタデータを作成し、管理します。
| タスク | [アーティクル] | プレーンテキストのキーへのアクセス | データベースへのアクセス |
|---|---|---|---|
| ステップ 1. 列の暗号化キーの場所と列の暗号化キーの暗号化された値をセキュリティ管理者から取得します。 | 記事の最後にある例を参照してください。 | いいえ | いいえ |
| ステップ 2. PowerShell 環境を起動し、Sql Server のモジュールをインポートします。 | PowerShell を使用した Always Encrypted の構成 | いいえ | いいえ |
| 手順 3. サーバーとデータベースに接続します。 | データベースに接続する | いいえ | はい |
| ステップ 4: 列マスター キーの場所に関する情報を含む SqlColumnMasterKeySettings オブジェクトを作成します。 SqlColumnMasterKeySettings は、メモリに存在するオブジェクトです。 | New-SqlColumnMasterKeySettings | いいえ | いいえ |
| ステップ 5: データベースの列マスター キーに関するメタデータを作成します。 手記: 列マスター キーの生成に使用されるキーまたは証明書の有効性は確認されません。 |
新しい-SqlColumnMasterKey 注: このコマンドレットでは、列マスター キー メタデータを作成するために、CREATE COLUMN MASTER KEY (Transact-SQL) ステートメントを発行します。 |
いいえ | はい |
| ステップ 6. データベースで列の暗号化キー メタデータを作成します。 | New-SqlColumnEncryptionKey 注: DBA は、列の暗号化キー メタデータのみを作成するコマンドレットのバリエーションを使用します。 このコマンドレットでは、列暗号化キーのメタデータを作成するために、CREATE COLUMN ENCRYPTION KEY (Transact-SQL) ステートメントを発行します。 |
いいえ | はい |
役割を分離した Windows 証明書ストア (例)
セキュリティ管理者
[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'
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'
関連コンテンツ
- PowerShell での Always Encrypted を使用した列暗号化の構成
- PowerShell を使用して Always Encrypted キーをローテーションする
- Always Encrypted を使用したアプリケーションの開発
- 常に暗号化
- Always Encrypted のキー管理の概要
- Always Encrypted の列マスター キーを作成して保存する
- PowerShell を使用した Always Encrypted の構成
- SQL Server Management Studio を使用して Always Encrypted キーをプロビジョニングする
- 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)