エンクレーブ対応キーをプロビジョニングする

適用対象: SQL Server 2019 (15.x) 以降 - Windows のみ Azure SQL Database

この記事では、セキュリティで保護されたエンクレーブが設定された Always Encrypted に使用されるサーバー側のセキュリティで保護されたエンクレーブ内での計算をサポートするエンクレーブ対応キーをプロビジョニングする方法について説明します。

Always Encrypted キーの管理に関する一般的なガイドラインとプロセスが、エンクレーブ対応キーをプロビジョニングするときも適用されます。 この記事では、セキュリティで保護されたエンクレーブが設定された Always Encrypted に固有の詳細について説明します。

SQL Server Management Studio または PowerShell を使用してエンクレーブ対応列マスター キーをプロビジョニングするには、新しいキーでエンクレーブ計算がサポートされていることを確認します。 これにより、ツール (SSMS または PowerShell) によって、データベースで列マスター キーのメタデータに ENCLAVE_COMPUTATIONS を設定する CREATE COLUMN MASTER KEY ステートメントが生成されます。 詳細については、「CREATE COLUMN MASTER KEY (Transact-SQL)」を参照してください。

また、ツールでは、列マスター キーを使用して列マスター プロパティがデジタル署名され、データベース メタデータに署名が格納されます。 署名により、ENCLAVE_COMPUTATIONS の設定での悪意のある改ざんが防止されます。 SQL クライアント ドライバーは、エンクレーブの使用を許可する前に署名を検証します。 これにより、セキュリティ管理者は、エンクレーブ内でどの列データを計算できるかを制御できます。

ENCLAVE_COMPUTATIONS は変更できません。つまり、メタデータで列マスター キーを定義した後に変更することはできません。 特定の列マスター キーによって暗号化が行われる、列暗号化キーを使用したエンクレーブ計算を有効にするには、列マスター キーをローテーションし、エンクレーブ対応の列マスター キーに置き換える必要があります。 「エンクレーブ対応キーをローテーションする」をご覧ください。

注意

現時点では、SSMS と PowerShell の両方で、Azure Key Vault または Windows 証明書ストアに格納されたエンクレーブ対応の列マスター キーがサポートされています。 (CNG または CAPI を使用した) ハードウェア セキュリティ モジュールはサポートされていません。

エンクレーブ対応の列暗号化キーを作成するには、エンクレーブ対応の列マスター キーを選択して新しいキーを暗号化する必要があります。

次のセクションでは、SSMS と PowerShell を使用してエンクレーブ対応キーをプロビジョニングする方法の詳細について説明します。

SQL Server Management Studio を使用してエンクレーブ対応キーをプロビジョニングする

SQL Server Management Studio では、以下のプロビジョニングを行うことができます。

  • [新しい列マスター キー] ダイアログを使用した、エンクレーブ対応の列マスター キーのプロビジョニング。
  • [新しい列の暗号化キー] ダイアログを使用した、エンクレーブ対応の列暗号化キーのプロビジョニング。

Always Encrypted ウィザードを使用すれば、エンクレーブ対応列マスター キーとエンクレーブ対応列暗号化キーを作成することもできます。

SQL Server Management Studio (SSMS) の最新の一般提供 (GA) バージョンがインストールされていることを確認します。

[新しい列マスター キー] ダイアログを使用してエンクレーブ対応の列マスター キーをプロビジョニングする

エンクレーブ対応の列マスター キーをプロビジョニングするには、「[新しい列マスター キー] ダイアログを使用して列マスター キーをプロビジョニングする」の手順に従います。 必ず、[エンクレーブ計算を許可する] を選択します。 次のスクリーンショットをご覧ください。

Allow enclave computations

注意

[エンクレーブ計算を許可する] チェック ボックスは、データベース用にセキュリティで保護されたエンクレーブが構成されている場合にのみ表示されます。 SQL Server を使用する場合は、「SQL Server でセキュリティで保護されたエンクレーブを構成する」を参照してください。 Azure SQL Database を使用している場合は、「Azure SQL Databaseでセキュリティで保護されたエンクレーブが設定された Always Encrypted を有効にする」を参照してください。

ヒント

列マスター キーがエンクレーブ対応かどうかを確認するには、オブジェクト エクスプローラーでキーを右クリックし、[プロパティ] を選択します。 キーがエンクレーブ対応の場合、 Enclave Computations:Allowed が画面に表示され、キーのプロパティを示します。 または、sys.column_master_keys (Transact-SQL) ビューを使用することもできます。

[新しい列の暗号化キー] ダイアログを使用してエンクレーブ対応の列暗号化キーをプロビジョニングする

エンクレーブ対応の列暗号化キーをプロビジョニングするには、「[新しい列の暗号化キー] ダイアログを使用して列の暗号化キーをプロビジョニングする」の手順に従います。 列マスター キーを選択するときは、エンクレーブ対応であることを確認します。

ヒント

列暗号化キーがエンクレーブ対応かどうかを確認するには、オブジェクト エクスプローラーでキーを右クリックし、[プロパティ] を選択します。 キーがエンクレーブ対応の場合、 Enclave Computations:Allowed が画面に表示され、キーのプロパティを示します。

PowerShell を使用してエンクレーブ対応キーをプロビジョニングする

PowerShell を使用してエンクレーブ対応キーをプロビジョニングするには、SqlServer PowerShell モジュール バージョン 22 以降が必要です。

一般に、「PowerShell を使用して Always Encrypted キーをプロビジョニングする」で説明されている、Always Encrypted に対する PowerShell でのキー プロビジョニング ワークフロー (役割の分離の有無に関係なく) が、エンクレーブ対応キーにも適用されます。 このセクションでは、エンクレーブ対応キーに固有の詳細について説明します。

SqlServer PowerShell モジュールは、New-SqlCertificateStoreColumnMasterKeySettings および New-SqlAzureKeyVaultColumnMasterKeySettings コマンドレットが -AllowEnclaveComputations パラメーターで拡張され、プロビジョニング処理中にエンクレーブ対応の列マスター キーを指定できるようになっています。 どちらのコマンドレットでも、(Azure Key Vault または Windows 証明書ストアに格納されている) 列マスター キーのプロパティを含むローカル オブジェクトが作成されます。 -AllowEnclaveComputations プロパティを指定すると、キーがローカル オブジェクトでエンクレーブ対応としてマークされます。 また、コマンドレットでは、参照されている列マスター キー (Azure Key Vault または Windows 証明書ストア内) にアクセスして、キーのプロパティへのデジタル署名が行われます。 新しいエンクレーブ対応列マスター キーの設定オブジェクトを作成すると、以降の SqlColumnMasterKey コマンドレットの呼び出しでそれを使用して、新しいキーを記述するメタデータ オブジェクトをデータベースに作成できます。

エンクレーブ対応の列暗号化キーのプロビジョニングは、エンクレーブ対応ではない列暗号化キーのプロビジョニングと何ら変わりません。 新しい列暗号化キーの暗号化に使用される列マスター キーがエンクレーブ対応であることを確認する必要があるだけです。

注意

現在、SqlServer PowerShell モジュールでは、(CNG または CAPI を使用する) ハードウェア セキュリティ モジュールに格納されているエンクレーブ対応キーのプロビジョニングはサポートされていません。

例 - Windows 証明書ストアを使用してエンクレーブ対応キーをプロビジョニングする

次のエンドツーエンドの例では、Windows 証明書ストアに格納されている列マスター キーを格納して、エンクレーブ対応キーをプロビジョニングする方法を示します。 スクリプトは、「Windows 証明書ストアの例 (役割の分離なし)」の例が基になっています。 重要な点は、New-SqlCertificateStoreColumnMasterKeySettings コマンドレットでは -AllowEnclaveComputations パラメーターを使用することです。これが、2 つの例のワークフローの唯一の違いです。

# Create a column master key in Windows Certificate Store.
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation Cert:CurrentUser\My -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage DataEncipherment -KeySpec KeyExchange

# Import the SqlServer module.
Import-Module "SqlServer" -MinimumVersion 22.0.50

# 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

# Create a SqlColumnMasterKeySettings object for your column master key
# using the -AllowEnclaveComputations parameter.
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint -AllowEnclaveComputations

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings

# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database. 
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName  -InputObject $database -ColumnMasterKey $cmkName

例 - Azure Key Vault を使用してエンクレーブ対応キーをプロビジョニングする

以下のエンドツーエンドの例では、Azure Key Vault のキー コンテナーに列マスター キーを格納して、エンクレーブ対応キーをプロビジョニングする方法を示します。 スクリプトは、「Azure Key Vault 例 (役割の分離なし)」の例が基になっています。 エンクレーブ対応のキーとエンクレーブ対応ではないキーのワークフローでの 2 つの違いに注意することが重要です。

  • 次のスクリプトの New-SqlCertificateStoreColumnMasterKeySettings では、-AllowEnclaveComputations パラメーターを使用して、新しい列マスター キーがエンクレーブ対応にされています。
  • 次のスクリプトでは、 Get-AzAccessToken コマンドレットを使用して、キー コンテナーのアクセス トークンを取得します。 これが必要なのは、New-SqlAzureKeyVaultColumnMasterKeySettings が列マスター キーのプロパティへの署名が行われるために、Azure Key Vault にアクセスする必要があるためです。
# Create a column master key in Azure Key Vault.
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
Connect-AzAccount
$SubscriptionId = "<Azure SubscriptionId>"
$resourceGroup = "<resource group name>"
$azureLocation = "<datacenter location>"
$akvName = "<key vault name>"
$akvKeyName = "<key name>"
$azureCtx = Set-AzConteXt -SubscriptionId $SubscriptionId # Sets the context for the below cmdlets to the specified subscription.
New-AzResourceGroup -Name $resourceGroup -Location $azureLocation # Creates a new resource group - skip, if your desired group already exists.
New-AzKeyVault -VaultName $akvName -ResourceGroupName $resourceGroup -Location $azureLocation # Creates a new key vault - skip if your vault already exists.
Set-AzKeyVaultAccessPolicy -VaultName $akvName -ResourceGroupName $resourceGroup -PermissionsToKeys get, create, delete, list, wrapKey,unwrapKey, sign, verify -UserPrincipalName $azureCtx.Account
$akvKey = Add-AzKeyVaultKey -VaultName $akvName -Name $akvKeyName -Destination "Software"

# 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

# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token 

# Create a SqlColumnMasterKeySettings object for your column master key. 
$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyURL $akvKey.ID -AllowEnclaveComputations -KeyVaultAccessToken $keyVaultAccessToken

# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings

# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database. 
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName -KeyVaultAccessToken $keyVaultAccessToken

次のステップ

関連項目