適用対象:SQL Server
Azure SQL データベース
Azure SQL Managed Instance
この記事では、( SqlServer PowerShell モジュールで) Set-SqlColumnEncryption コマンドレットを使用して、データベース列にターゲット Always Encrypted 構成を設定する手順を説明します。 Set-SqlColumnEncryption コマンドレットは、ターゲット データベースと選択した列に格納されたデータの両方のスキーマを変更します。 列に格納されたデータは、その列に指定されたターゲットの暗号化設定と現在の暗号化の構成に応じて、暗号化、再暗号化、または復号化できます。 エンクレーブを使用してインプレース暗号化操作をトリガーするには、 Set-SqlColumnEncryption では、構成証明プロトコルと必要に応じて構成証明 URL キーワードを含む接続文字列を使用して作成されたデータベース接続を使用する必要があります。
前提条件
ターゲットの暗号化構成を設定するには、次のことを確認する必要があります。
- エンクレーブ対応の列暗号化キーがデータベース内に構成されている (列を暗号化または再暗号化している場合)。 詳細については、「セキュリティで保護されたエンクレーブを使用した Always Encrypted のキーの管理」を参照してください。
- Always Encrypted を有効にし、接続文字列で指定された構成証明プロパティを使用してデータベースに接続しています。
- 暗号化、再暗号化、または復号化する各列について、その列マスター キーに、PowerShell コマンドレットを実行しているコンピューターからアクセスできる必要があります。
- SqlServer PowerShell モジュール バージョン 22.0.50 以降を使用します。 インプレース オンライン暗号化の場合は、SqlServer PowerShell モジュール バージョン 22.3.0 以降を使用します。
Note
Microsoftでは、Always Encrypted PowerShell スクリプトを実行するときに PowerShell 7 以降を使用することをお勧めします。 PowerShell 7 では、多くの Always Encrypted シナリオに必要な、クロスプラットフォームのサポートが強化され、パフォーマンスが向上し、SqlServer モジュール (v22 以降) との最新の互換性が提供されます。
セキュリティに関する考慮事項
データベース列の暗号化を構成するために使用される Set-SqlColumnEncryption コマンドレットは、Always Encrypted キーとデータベース列に格納されているデータの両方を処理します。 したがって、セキュリティで保護されたコンピューターでコマンドレットを実行することが重要です。 データベースが SQL Server にある場合は、SQL Server インスタンスをホストするコンピューターとは異なるコンピューターからコマンドレットを実行します。 Always Encrypted の主な目的は、データベース システムが侵害されても、暗号化された機密データが確実に保護されるようにすることにあるので、SQL Server コンピューター上でキーや機密データを処理する PowerShell スクリプトが実行されると、機能の効果が低下したり無効になったりするおそれがあります。
| タスク | [アーティクル] | 平文のキー/キーストアにアクセスする | データベースへのアクセス |
|---|---|---|---|
| ステップ 1. PowerShell 環境を起動し、Sql Server のモジュールをインポートします。 | SqlServer モジュールのインポート | いいえ | いいえ |
| ステップ 2. サーバーとデータベースに接続します。 | データベースに接続する | いいえ | はい |
| 手順 3. ローテーション対象の列暗号化キーを保護する列マスターキーが Azure Key Vault に格納されている場合は、Azure に認証します。 | Connect-AzAccount | はい | いいえ |
| ステップ 4: Azure Key Vault のアクセス トークンを取得します。 | Get-AzAccessToken | いいえ | いいえ |
| ステップ 5: 暗号化、再暗号化または復号化するデータベースの各列に 1 つずつ SqlColumnEncryptionSettings オブジェクトの配列を構築します。 SqlColumnMasterKeySettings は、メモリ (PowerShell) に存在するオブジェクトです。 列のターゲット暗号化方式を指定します。 | New-SqlColumnEncryptionSettings | いいえ | いいえ |
| ステップ 6. 前の手順で作成した SqlColumnMasterKeySettings オブジェクトの配列で指定された、目的の暗号化構成を設定します。 列は、指定されたターゲット設定と列の現在の暗号化構成に応じて、暗号化、再暗号化、または暗号化解除されます。 |
Set-SqlColumnEncryption メモ: この手順には時間がかかる場合があります。 アプリケーションは、操作全体またはその一部を通じてテーブルにアクセスできません。これは、選択したアプローチ (オンラインとオフライン) に応じて異なります。 |
はい | はい |
VBS エンクレーブを使用して列を暗号化する
次の例では、いくつかの列にターゲット暗号化構成を設定しているところを示しています。 まだ暗号化されていない列があれば、暗号化されます。 別のキーや異なる暗号化の種類を使用して既に暗号化されている列がある場合は、復号化した後に、指定したターゲット キー/種類で再暗号化されます。 VBS エンクレーブは現在、構成証明をサポートしていません。 EnclaveAttestationProtocol パラメーターは None に設定する必要があり、EnclaveAttestationUrl は必要ありません。
# Import modules
Import-Module SqlServer
Import-Module Az.Accounts
# Edit these values.
$serverName = '<your-server>.database.windows.net'
$databaseName = 'ContosoHR'
$cekName = 'CEK'
$subscriptionId = '<your-subscription-id>'
# Columns to encrypt with the CEK.
$columnsToEncrypt = @(
'dbo.Employees.SSN',
'dbo.Employees.Salary'
)
# Sign in with Microsoft Entra and select subscription.
Connect-AzAccount
Set-AzContext -SubscriptionId $subscriptionId
# Token needed when CEK uses Azure Key Vault CMK.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl 'https://vault.azure.net').Token
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Build encryption settings for target columns.
$columnEncryptionSettings = @(
$columnsToEncrypt | ForEach-Object {
New-SqlColumnEncryptionSettings -ColumnName $_ -EncryptionType Randomized -EncryptionKey $cekName
}
)
# Encrypt or re-encrypt the columns.
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $columnEncryptionSettings -EnclaveAttestationProtocol None -LogFileDirectory . -KeyVaultAccessToken $keyVaultAccessToken
Write-Host 'Done.'
列の暗号化解除 - 例
次の例では、データベースで現在暗号化されているすべての列を復号化する方法を示しています。
# Import modules
Import-Module SqlServer -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
#Connect to Azure
Connect-AzAccount
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Find all encrypted columns, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$tables = $database.Tables
for($i=0; $i -lt $tables.Count; $i++){
$columns = $tables[$i].Columns
for($j=0; $j -lt $columns.Count; $j++) {
if($columns[$j].isEncrypted) {
$threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name
$ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType "Plaintext"
}
}
}
# Decrypt all columns.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -LogFileDirectory . -EnclaveAttestationProtocol "None" -KeyVaultAccessToken $keyVaultAccessToken
SGX エンクレーブを使用して列を暗号化する
次の例では、いくつかの列にターゲット暗号化構成を設定しているところを示しています。 まだ暗号化されていない列があれば、暗号化されます。 別のキーや異なる暗号化の種類を使用して既に暗号化されている列がある場合は、復号化した後に、指定したターゲット キー/種類で再暗号化されます。 エンクレーブを使用してインプレース暗号化操作をトリガーするには、EnclaveAttestationProtocol パラメーターと EnclaveAttestationUrl パラメーターが必要です。
# Import modules
Import-Module SqlServer
Import-Module Az.Accounts
# Edit these values.
$serverName = '<your-server>.database.windows.net'
$databaseName = 'ContosoHR'
$cekName = 'CEK'
$subscriptionId = '<your-subscription-id>'
# Columns to encrypt with the CEK.
$columnsToEncrypt = @(
'dbo.Employees.SSN',
'dbo.Employees.Salary'
)
# Sign in with Microsoft Entra and select subscription.
Connect-AzAccount
Set-AzContext -SubscriptionId $subscriptionId
# Token needed when CEK uses Azure Key Vault CMK.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl 'https://vault.azure.net').Token
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Build encryption settings for target columns.
$columnEncryptionSettings = @(
$columnsToEncrypt | ForEach-Object {
New-SqlColumnEncryptionSettings -ColumnName $_ -EncryptionType Randomized -EncryptionKey $cekName
}
)
# Encrypt or re-encrypt the columns.
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $columnEncryptionSettings -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>" -KeyVaultAccessToken $keyVaultAccessToken -LogFileDirectory .
Write-Host 'Done.'
列の暗号化解除 - 例
次の例では、データベースで現在暗号化されているすべての列を復号化する方法を示しています。
# Import modules
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
#Connect to Azure
Connect-AzAccount
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Connect to Azure SQL Database using Entra auth.
$connStr = "Server=tcp:$serverName,1433;Database=$databaseName;Encrypt=True;TrustServerCertificate=False;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr
# Find all encrypted columns, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$tables = $database.Tables
for($i=0; $i -lt $tables.Count; $i++){
$columns = $tables[$i].Columns
for($j=0; $j -lt $columns.Count; $j++) {
if($columns[$j].isEncrypted) {
$threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name
$ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType "Plaintext"
}
}
}
# Decrypt all columns.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -LogFileDirectory . -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>" -KeyVaultAccessToken $keyVaultAccessToken