SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Azure Key Vault を使用した Always Encrypted による暗号化

one comment

こちらも PASS で発表されていた内容となりますが、Always Encrypted の列マスターキー (Column Master Key : CMK) の保存場所として、Azure Key Vault が使用できるようになりました。
Always Encrypted (Database Engine)? / Creating Custom Key Store Providers for Always Encrypted (Azure Key Vault Example) / Always On Encrypted ? Generating Certificates and Column Encryption Key ENCRYPTED_VALUE?の情報を見ながら設定方法の流れを軽くまとめてみたいと思います。
最新の情報は、Using the Azure Key Vault Key Store Provider for Always Encrypted になりそうですね。

■Key Vault にキーを作成

Key Vault を使用した、Always Encrypted の設定ですが、まずは Key Vault 上にキーを作成する必要がありますので、Azure の PowreShell を使用します。
今回は、1.0.0-preview2 で公開されている、azure-powershell.0.9.9.msi を使用しています。
こちらのバージョンでは、スイッチしないで ARM のコマンドを実行するバージョンとなっていますので、コマンド体系は少し気をつけておく必要があるかと。
まずは以下のコマンドで Key Vault にキーを生成します。

Login-AzureRmAccount
Select-AzureRmSubscription -TenantId <テナント ID> -SubscriptionId <サブスクリプション ID> -SubscriptionName <サブスクリプション名>
New-AzureRmResourceGroup -Name <ソースグループ名> -Location 'Japan West'
New-AzureRmKeyVault -VaultName <Vault 名> -ResourceGroupName <リソースグループ名> -Location 'Japan West'
Add-AzureKeyVaultKey -VaultName <Vault 名> -Name <キー名> -Destination Software
# 作成したキーの確認
Get-AzureKeyVaultKey -VaultName '<Vault 名>  -Name <キー名>

 
この中の情報としては、「Id」の URL を使用しますので、この値はあとで使えるようにしておきます。
image
 

■WAAD にアプリケーションの作成

Key Vault の設定が終わったら、WAAD にアプリケーションを作成します。
この設定をして生成された、特定のアプリケーションから Key Vault のキーに対してアクセスが可能となります。
アプリケーションの種類としては、「組織で開発中のアプリケーションを追加」から、「WEB アプリケーションや WEB API」を選択します。
URL については適当に「http://dummy」等を設定しておけばよいかと。
# 今回の構成では URL の設定内容は使いませんので。
アプリケーションの作成が終わったら「構成」から、キーを作成します。
構成の情報から使用するのは 2 点あり、

  • クライアント ID
  • キー

の情報をあとで使用するので控えておきます。
# キーについては生成時にしか確認できませんのでご注意を。
image
 

■Key Vault のアクセスポリシーの設定

ここまでで、Key Vault 上にキーが作成され、Key Vault にアクセスをする際に使用するアプリケーションが設定されました。
最後に作成したアプリケーションから、Key Vault にアクセスするためのアクセスポリシーを設定します。
CMK から、列の暗号化キー (Column Encryption Key : CEK) を作成するためには、最低限、以下の権限が必要となるようですので、これらを先ほど作成したアプリケーションに指定します。

Set-AzureRmKeyVaultAccessPolicy -VaultName <Key Vault 名> -ServicePrincipalName <アプリケーションのクライアント ID> -PermissionsToKeys  get,wrapKey,sign,verify,unwrapKey

 
これで、サンプルアプリケーションをセットアップモードで実行した際に、CEK の作成ができるようになります。
CEK を作成するためであれば、「unwrapKey」については不要なのですが、今回は作成したアプリケーションでデータのアクセスも実行しているため、この権限を付与しています。
サンプルのドキュメントに書かれているように、

  • キーを管理するためのアプリケーション
  • データにアクセスするためのアプリケーション

を別にするのが本来の管理上は好ましいのでしょうね。
各権限の詳細については、キーとシークレットについて が参考になります。
 

■サンプルアプリケーションの修正

SQL Server 2016 CTP 3.0 になって、いくつかの構文に変更がありますので、サンプルアプリケーションで影響がある個所を修正します。
# プロバイダー名の変更と、DEFINITION が不要になっています。
CREATE COLUMN MASTER KEY (Transact-SQL)
CREATE COLUMN ENCRYPTION KEY (Transact-SQL)

const string CUSTOM_AKV_PROVIDER_NAME = @"AZURE_KEY_VAULT_PROVIDER";
↓
const string CUSTOM_AKV_PROVIDER_NAME = @"AZURE_KEY_VAULT";
internal const string _createColumnEncryptionKeyTemplate = @"
CREATE COLUMN ENCRYPTION KEY [{0}]
WITH VALUES
  (
    COLUMN MASTER KEY DEFINITION = [{1}],
    ALGORITHM = 'RSA_OAEP',
    ENCRYPTED_VALUE = {2}
  );";
↓
internal const string _createColumnEncryptionKeyTemplate = @"
CREATE COLUMN ENCRYPTION KEY [{0}]
WITH VALUES
  (
    COLUMN_MASTER_KEY = [{1}],
    ALGORITHM = 'RSA_OAEP',
    ENCRYPTED_VALUE = {2}
  );";
internal const string _createColumnMasterKeyTemplate = @"
CREATE COLUMN MASTER KEY DEFINITION [{0}]
    WITH ( KEY_STORE_PROVIDER_NAME = '{1}',
    KEY_PATH = '{2}');";
↓
internal const string _createColumnMasterKeyTemplate = @"
CREATE COLUMN MASTER KEY [{0}]
    WITH ( KEY_STORE_PROVIDER_NAME = '{1}',
    KEY_PATH = '{2}');";

 
上記の修正をしてビルドしたアプリケーションであれば、SQL Server 2016 CTP 3.0 に対してテストすることができます。

■サンプルアプリケーションの実行

ここまでの作業が終わったら、サンプルアプリケーションを実行することができます。
サンプルアプリケーションをビルドして「SqlKeyVaultSampleApp.exe」ができたら以下のコマンドを実行して、

  • CMK の作成
  • CEK の作成
  • 暗号化されたテーブルの作成
.\SqlKeyVaultSampleApp.exe -i <アプリケーションのクライアントID>-s <アプリケーションのキー>-c "Data Source=localhost;Initial Catalog=AEDB;Integrated Security=True;Column Encryption Setting=Enabled" -k <https:// で始まる Key Vault のid> -o setup

 
を行います。
設定が終わったら、「-o setup」を「-o data_access」に変更して、データへのアクセスを行うと、暗号化したデータを複合して表示することができているのが確認できます。
image
 
Always Encrypted は SQL Database でも使用することができるようになりましたので、サンプルのアプリケーションについては、SQL Database に対しても実行可能です。
image
 

■SSMS の GUI ベースの設定

ここまでは、サンプルアプリケーションを使用して、実施していましたが、SSMS の GUI ベースで Key Vault を使用した Always Encrypted の設定をすることも可能です。
SSMS から、Key Vault を利用して、CMK / CEK を作成する場合は、UPN を使用した Key Vault へのアクセスポリシーを設定し、先ほどまで使用していた権限に「list」を加えるようにしておきます。

Set-AzureRmKeyVaultAccessPolicy -VaultName '<Key Vault 名>' -UserPrincipalName "hogehoge@hogehoge.onmicrosoft.com" -PermissionsToKeys get,wrapKey,sign,verify,unwrapKey,list

これにより、Key Vault 内に登録されているキーを GUI から選択することができるようになります。
image
SSMS の新機能として、GUI ベースのテーブルの暗号化設定があり、CMK/CEK の作成も併せて実施することができます。
imageimage
この場合、Key Vault に新しいキーの作成が行われますので、「create」の権限を付与しておくようにします。

Set-AzureRmKeyVaultAccessPolicy -VaultName '<Key Vault 名>' -UserPrincipalName "hogehoge@hogehoge.onmicrosoft.com" -PermissionsToKeys get,wrapKey,sign,verify,unwrapKey,create

SSMS を使用した、Always Encrypted のデータ操作について Getting Started with Always Encrypted with SSMS が動作がわかりやすいかと思います。
この動画の中では、SSMS からクエリ実行した際に、「Column Encryption Setting=Enabled」の場合は、暗号化されテーブルへのアクセス時に認証情報が求められ、UPN による Key Vault へのアクセスが行われています。
これが、私の環境だと実現できないのですよね…。
この実現方法については調査中です。

Share

Written by Masayuki.Ozawa

11月 1st, 2015 at 11:39 am

One Response to 'Azure Key Vault を使用した Always Encrypted による暗号化'

Subscribe to comments with RSS or TrackBack to 'Azure Key Vault を使用した Always Encrypted による暗号化'.

  1. […] Azure Key Vault を使用した Always Encrypted による暗号化 […]

Leave a Reply