エンクレーブ対応キーをプロビジョニングする
適用対象: SQL Server 2019 (15.x) 以降 - Windows のみ
Azure SQL データベース
この記事では、セキュリティで保護されたエンクレーブが設定された 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
は変更できません。つまり、メタデータで列マスター キーを定義した後に変更することはできません。 特定の列マスター キーによって暗号化が行われる、列暗号化キーを使用したエンクレーブ計算を有効にするには、列マスター キーをローテーションし、エンクレーブ対応の列マスター キーに置き換える必要があります。 「エンクレーブ対応キーをローテーションする」をご覧ください。
Note
現時点では、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) バージョンがインストールされていることを確認します。
[新しい列マスター キー] ダイアログを使用してエンクレーブ対応の列マスター キーをプロビジョニングする
エンクレーブ対応の列マスター キーをプロビジョニングするには、「[新しい列マスター キー] ダイアログを使用して列マスター キーをプロビジョニングする」の手順に従います。 必ず、[エンクレーブ計算を許可する] を選択します。 次のスクリーンショットをご覧ください。
Note
[エンクレーブ計算を許可する] チェック ボックスは、データベース用にセキュリティで保護されたエンクレーブが構成されている場合にのみ表示されます。 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 コマンドレットの呼び出しでそれを使用して、新しいキーを記述するメタデータ オブジェクトをデータベースに作成できます。
エンクレーブ対応の列暗号化キーのプロビジョニングは、エンクレーブ対応ではない列暗号化キーのプロビジョニングと何ら変わりません。 新しい列暗号化キーの暗号化に使用される列マスター キーがエンクレーブ対応であることを確認する必要があるだけです。
Note
現在、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
次のステップ
- セキュリティで保護されたエンクレーブを使用して Transact-SQL ステートメントを実行する
- セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用して列の暗号化をインプレースで構成する
- 既存の暗号化された列に対してセキュリティで保護されたエンクレーブが設定された Always Encrypted を有効にする
- セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用するアプリケーションを開発する