PowerShell を使って列の暗号化をインプレースで構成する

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

この記事では、( SqlServer PowerShell モジュールで) Set-SqlColumnEncryption コマンドレットを使用して、データベース列にターゲット Always Encrypted 構成を設定する手順を説明します。 Set-SqlColumnEncryption コマンドレットは、ターゲット データベースと選択した列に格納されたデータの両方のスキーマを変更します。 列に格納されたデータは、その列に指定されたターゲットの暗号化設定と現在の暗号化の構成に応じて、暗号化、再暗号化、または復号化できます。 エンクレーブを使用してインプレース暗号化操作をトリガーするには、 Set-SqlColumnEncryption では、構成証明プロトコルと必要に応じて構成証明 URL キーワードを含む接続文字列を使用して作成されたデータベース接続を使用する必要があります。

前提条件

ターゲットの暗号化構成を設定するには、次のことを確認する必要があります。

  • エンクレーブ対応の列暗号化キーがデータベース内に構成されている (列を暗号化または再暗号化している場合)。 詳細については、「セキュリティで保護されたエンクレーブを使用した Always Encrypted のキーの管理」を参照してください。
  • Always Encrypted を有効にし、接続文字列で指定された構成証明プロパティを使用してデータベースに接続しています。
  • PowerShell コマンドレットを実行しているコンピューターから、暗号化、再暗号化、また復号化する各列の列マスター キーにアクセスできること。
  • SqlServer PowerShell モジュール バージョン 22.0.50 以降を使用します。

可用性に関する注意点

インプレース Set-SqlColumnEncryption コマンドレットは、オンライン暗号化をサポートしていません。

オフライン アプローチの場合、ターゲット テーブル (およびターゲット テーブルに関連するすべてのテーブル。たとえば、ターゲット テーブルと外部キー リレーションシップがあるテーブルなど) は、操作中にトランザクションを書き込むことはできません。 外部キー制約のセマンティクス (CHECK または NOCHECK) は、オフライン アプローチの場合は常に保持されます。

暗号化プロセス中にダウンタイムを許容できない場合は、オンライン暗号化をサポートする Transact-SQL で列暗号化をインプレースで構成することをお勧めします。

セキュリティに関する考慮事項

データベース列の暗号化を構成するために使用される 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 いいえ いいえ
手順 5. 前の手順で作成した SqlColumnMasterKeySettings オブジェクトの配列で指定された、目的の暗号化構成を設定します。 指定したターゲットの設定と列の現在の暗号化の構成に応じて、列が暗号化、再暗号化、または復号化されます。 Set-SqlColumnEncryption

注: この手順の実行には時間がかかる場合があります。 アプリケーションでは、選択されたアプローチ (オンラインまたはオフライン) に応じて、操作全体または一部の操作でテーブルにアクセスできなくなります。
はい はい

VBS エンクレーブを使用して列を暗号化する

次の例では、いくつかの列にターゲット暗号化構成を設定しているところを示しています。 まだ暗号化されていない列があれば、暗号化されます。 別のキーや異なる暗号化の種類を使用して既に暗号化されている列がある場合は、復号化した後に、指定したターゲット キー/種類で再暗号化されます。 VBS エンクレーブは現在、構成証明をサポートしていません。 EnclaveAttestationProtocol パラメーターは None に設定する必要があり、EnclaveAttestationUrl は必要ありません。

# 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 = "<servername>.database.windows.net"
$databaseName = "<DatabaseName>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + ";  Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Encrypt the selected columns (or re-encrypt, if they are already encrypted using keys/encrypt types, different than the specified keys/types.
$ces = @() 
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.SSN" -EncryptionType "Randomized" -EncryptionKey "CEK" 
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.Salary" -EncryptionType "Randomized" -EncryptionKey "CEK" 
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory . -EnclaveAttestationProtocol "None" -KeyVaultAccessToken $keyVaultAccessToken

列の復号化 - 例

次の例では、データベースで現在暗号化されているすべての列を復号化する方法を示しています。

# 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>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$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" -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 = "<servername>.database.windows.net"
$databaseName = "<DatabaseName>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + ";  Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Encrypt the selected columns (or re-encrypt, if they are already encrypted using keys/encrypt types, different than the specified keys/types.
$ces = @() 
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.SSN" -EncryptionType "Randomized" -EncryptionKey "CEK" 
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.Salary" -EncryptionType "Randomized" -EncryptionKey "CEK" 
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory . -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>"   -KeyVaultAccessToken $keyVaultAccessToken

列の復号化 - 例

次の例では、データベースで現在暗号化されているすべての列を復号化する方法を示しています。

# 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>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$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

次のステップ

関連項目