チュートリアル: Always Encrypted の作業の開始
適用対象: SQL Server
Azure SQL データベース
Azure SQL Managed Instance
Always Encrypted の開始方法について説明します。 次のことを示します。
- データベース内の選択した列を暗号化する方法。
- 暗号化された列のクエリを実行する方法。
Note
セキュリティで保護されたエンクレーブによる Always Encrypted に関する情報をお探しの場合は、代わりに次のチュートリアルを参照してください。
前提条件
このチュートリアルには、次のものが必要です。
- SQL Server データベース、Azure SQL Managed Instance、またはSQL Server の空のデータベース 次の手順では、データベース名が ContosoHR であることを前提としています。 データベースの所有者 (db_owner ロールのメンバー) である必要があります。 データベースを作成する方法の詳細については、「クイックスタート: 単一データベースを作成する - Azure SQL Database」または 「データベースを作成する - SQL Server」を参照してください。
- オプションとして、特にデータベースが Azure にある場合には、Azure Key Vault のキー コンテナーをお勧めします。 キー コンテナーを作成する方法については、「クイックスタート: Azure portal を使用してキー コンテナーを作成する」を参照してください。
- キー コンテナーでアクセス ポリシーのアクセス許可モデルを使用する場合は、キー コンテナーに次のキーアクセス許可があることを確認します:
get
、list
、create
、unwrap key
、wrap key
、verify
、sign
。 「Key Vault アクセス ポリシーを割り当てる」を参照してください。 - Azure ロールベースのアクセス制御 (RBAC) アクセス許可モデルを使用している場合は、キー コンテナーの Key Vault Crypto Officer ロールのメンバーであることを確認してください。 「Azure のロールベースのアクセス制御を使用して Key Vault のキー、証明書、シークレットへのアクセス権を付与する」を参照してください。
- キー コンテナーでアクセス ポリシーのアクセス許可モデルを使用する場合は、キー コンテナーに次のキーアクセス許可があることを確認します:
- 最新バージョンの SQL Server Management Studio (SSMS) または最新バージョンの SqlServer および Az PowerShell モジュール。 Az PowerShell モジュールは、Azure Key Vault を使用している場合にのみ必要です。
手順 1: データベース スキーマを作成して設定する
この手順では、HR スキーマと Employees テーブルを作成します。 次に、テーブルにデータを入力します。
データベースに接続します。 SSMS からデータベースに接続する方法については、「クイックスタート: SQL Server Management Studio (SSMS) を使用して Azure SQL Database または Azure Managed Instance に接続してクエリを実行する」または「クイックスタート: SQL Server Management Studio (SSMS) を使用して SQL Server インスタンスに接続し、クエリを行う」を参照してください。
ContosoHR データベースの新しいクエリ ウィンドウを開きます。
以下のステートメントを貼り付けて実行し、Employees という名前の新しいテーブルを作成します。
CREATE SCHEMA [HR]; GO CREATE TABLE [HR].[Employees] ( [EmployeeID] [int] IDENTITY(1,1) NOT NULL , [SSN] [char](11) NOT NULL , [FirstName] [nvarchar](50) NOT NULL , [LastName] [nvarchar](50) NOT NULL , [Salary] [money] NOT NULL ) ON [PRIMARY];
次のステートメントを貼り付けて実行し、Employees テーブルにいくつかの従業員レコードを追加します。
INSERT INTO [HR].[Employees] ( [SSN] , [FirstName] , [LastName] , [Salary] ) VALUES ( '795-73-9838' , N'Catherine' , N'Abel' , $31692 ); INSERT INTO [HR].[Employees] ( [SSN] , [FirstName] , [LastName] , [Salary] ) VALUES ( '990-00-6818' , N'Kim' , N'Abercrombie' , $55415 );
手順 2: 列を暗号化する
この手順では、Always Encrypted の列マスター キーと列暗号化キーをプロビジョニングします。 次に、Employees テーブルの SSN 列と Salary 列を暗号化します。
SSMS に用意されているウィザードを使用すると、列マスター キー、列暗号化キーを設定し、選択した列を暗号化することにより、簡単に Always Encrypted を構成できます。
オブジェクト エクスプローラーで、 [データベース]>[ContosoHRTables]> テーブルを展開します。
[Employees] テーブルを右クリックして [列の暗号化] を選択すると、Always Encrypted ウィザードが起動します。
ウィザードの [概要] ページで [次へ] を選択します。
[列の選択] ページで
- SSN と給与の列を選択します。 SSN 列の決定論的暗号化と、Salary 列のランダム化された暗号化を選択します。 決定論的暗号化では、暗号化された列の等価比較を伴うポイント ルックアップ検索などのクエリがサポートされます。 ランダム化された暗号化では、暗号化された列の計算はサポートされません。
- 両方の列の列暗号化キーとして CEK-Auto1 (新規) のままにします。 このキーはまだ存在せず、ウィザードによって生成されます。
- [次へ] を選択します。
[マスター キーの構成] ページで、ウィザードによって生成される新しい列マスター キーを構成します。 まず、列マスター キーを格納する場所を選択する必要があります。 ウィザードでは、次の 2 種類のキー ストアがサポートされています。
- Azure Key Vault - データベースが Azure にある場合にお勧めします
- Windows 証明書ストア
一般に、特にデータベースが Azure にある場合は、Azure Key Vault が推奨されるオプションです。
Azure Key Vault を使用するには:
- [Azure Key Vault]を選択します。
- [サインイン] を選択し、Azure へのサインインを完了します。
- サインインすると、アクセスできるサブスクリプションとキー コンテナーの一覧がページに表示されます。 使用するキー コンテナーを含む Azure サブスクリプションを選択します。
- キー コンテナーを選択します。
- [次へ] を選択します。
Windows 証明書ストアを使用するには:
[Windows 証明書ストア] を選択します。
[現在のユーザー] の既定の選択のままにします。これにより、現在のユーザー ストアに証明書 (新しい列マスター キー) を生成するようにウィザードに指示されます。
[次へ] を選択します。
[インプレース暗号化の設定] ページでは、データベースでエンクレーブが有効になっていないため、追加の構成は必要ありません。 [次へ] を選択します。
[実行設定] ページで、暗号化を続行するか、後で実行する PowerShell スクリプトを生成するかを確認するメッセージが表示されます。 既定の設定のままにして、[ 次へ] を選択します。
[概要] ページで、ウィザードによって実行されるアクションが通知されます。 すべての情報が正しいことを確認し、[完了] を選択します。
[結果]ページでは、ウィザードの操作の進行状況を監視できます。 すべての操作が正常に完了するまで待ち、[閉じる] を選択します。
(省略可能)ウィザードによってデータベースに加えられた変更を確認します。
[ContosoHR]>[Security]>[Always Encrypted Keys]を展開して、列マスター キーのメタデータ オブジェクトと、ウィザードによって作成された列暗号化を調べることができます。
キー メタデータを含むシステム カタログ ビューに対して、以下のクエリを実行することもできます。
SELECT * FROM sys.column_master_keys; SELECT * FROM sys.column_encryption_keys SELECT * FROM sys.column_encryption_key_values
オブジェクト エクスプローラーで、[社員] テーブルを右クリックし、[スクリプト テーブル]>[Create To]>[New クエリ エディター Window]を選択します。 これにより、Employees テーブルの CREATE TABLE ステートメントを含む新しいクエリ ウィンドウが開きます。 SSN 列と Salary 列の定義に表示される ENCRYPTED WITH 句に注意してください。
sys.columns に対して次のクエリを実行して、2 つの暗号化された列の列レベルの暗号化メタデータを取得することもできます。
SELECT [name] , [encryption_type] , [encryption_type_desc] , [encryption_algorithm_name] , [column_encryption_key_id] FROM sys.columns WHERE [encryption_type] IS NOT NULL;
手順 3: 暗号化された列のクエリを実行する
接続に対して Always Encrypted が無効になっている状態でデータベースに接続します。
- 新しいクエリ ウィンドウを開きます。
- クエリ ウィンドウ内の任意の場所を右クリックし、[接続]>[接続の変更] の順に選択します。 [データベース エンジンへの接続] ダイアログが開きます。
- オプション<<を選択します。 [データベース エンジンへの接続] ダイアログに追加のタブが表示されます。
- [Always Encrypted] タブを選択します。
- [Always Encrypted を有効にする (列の暗号化)] が選択されていないことを確認します。
- [接続] を選択します。
次のクエリを貼り付け、実行します。 クエリは、バイナリ暗号化データを返す必要があります。
SELECT [SSN], [Salary] FROM [HR].[Employees]
接続に対して Always Encrypted を有効にして、データベースに接続する必要があります。
- クエリ ウィンドウ内の任意の場所を右クリックし、[接続]>[接続の変更] の順に選択します。 [データベース エンジンへの接続] ダイアログが開きます。
- オプション<<を選択します。 [データベース エンジンへの接続] ダイアログに追加のタブが表示されます。
- [Always Encrypted] タブを選択します。
- [Always Encrypted を有効にする]を選択します。
- [接続] を選択します。
同じクエリを再実行してください。 データベース接続に対して Always Encrypted が有効になっているため、SSMS のクライアント ドライバーは、両方の暗号化された列に格納されているデータの暗号化解除を試みます。 Azure Key Vault を使用する場合は、Azure へのサインインを求められる場合があります。
[Always Encrypted のパラメーター化]を有効にします。 この機能を使用すると、暗号化された列でデータをフィルター処理 (または暗号化された列にデータを挿入) するクエリを実行できます。
- SSMS のメイン メニューから [クエリ] を選択します。
- [クエリ オプション...] を選択します。
- [実行]>[詳細]の順に移動します。
- [Always Encryptedのパラメーター化を有効にする] が有効になっていることを確認します。
- [OK] を選択します。
次のクエリを貼り付けて実行します。このクエリでは、暗号化された SSN 列でデータがフィルター処理されます。 クエリは、プレーンテキスト値を含む 1 つの行を返す必要があります。
DECLARE @SSN [char](11) = '795-73-9838' SELECT [SSN], [Salary] FROM [HR].[Employees] WHERE [SSN] = @SSN
必要に応じて、アクセス ポリシーアクセス許可モデルで構成された Azure Key Vault を使用している場合は、次の手順に従って、ユーザーがデータを保護する列マスター キーにアクセスせずに、暗号化された列からプレーンテキスト データを取得しようとしたときの動作を確認します。
- キー
unwrap
コンテナーのアクセス ポリシーで、自分のキーアクセス許可を削除します。 詳細については、キー コンテナーへのアクセス ポリシーの割り当てに関するページを参照してください。 - SSMS のクライアント ドライバーは、キー コンテナーから取得した列暗号化キーを 2 時間キャッシュするため、SSMS を閉じてもう一度開きます。 これにより、キー キャッシュが空になります。
- 接続に対して Always Encrypted を有効にして、データベースに接続する必要があります。
- 次のクエリを貼り付け、実行します。 必要な
unwrap
アクセス許可がないことを示すエラー メッセージが表示され、クエリが失敗します。
SELECT [SSN], [Salary] FROM [HR].[Employees]
- キー