チュートリアル: Intel SGX エンクレーブが設定された Always Encrypted を Azure SQL Database で使い始める

適用対象:Azure SQL Database

このチュートリアルでは、Azure SQL Databaseでセキュリティで保護されたエンクレーブを使用して Always Encrypted を使用する方法について説明します。 Intel Software Guard Extensions (Intel SGX) エンクレーブを使います。 このチュートリアルでは、次の内容について説明します。

  • Intel SGX エンクレーブが設定された Always Encrypted をテストおよび評価するための環境を作成する方法。
  • SQL Server Management Studio (SSMS) を使用して、データのインプレース暗号化を行い、暗号化された列に対して高度な機密クエリを実行する方法。

前提条件

PowerShell の要件

このセクションに記載されている前提条件は、このチュートリアルの一部の手順に PowerShell を使用する場合にのみ適用されます。 代わりに Azure portal の使用を予定している場合は、このセクションを省略できます。 Microsoftでは、Always Encrypted PowerShell スクリプトを実行するときに PowerShell 7 以降を使用することをお勧めします。 PowerShell 7 では、多くの Always Encrypted シナリオに必要な、クロスプラットフォームのサポートが強化され、パフォーマンスが向上し、SqlServer モジュール (v22 以降) との最新の互換性が提供されます。

Az PowerShell モジュール バージョン 9.3.0 以降が必要です。 Az PowerShell モジュールのインストール方法の詳細については、「Azure Az PowerShell モジュールのインストール」を参照してください。 お使いのマシンにインストールされている Az PowerShell モジュールのバージョンを確認するには、PowerShell から次のコマンドを実行します。

Get-InstalledModule -Name Az

手順 1: サーバーと DC シリーズ データベースを作成、構成する

この手順では、セキュア エンクレーブによる Always Encrypted に必要な DC シリーズのハードウェアを使用して、新しい Azure SQL Database 論理サーバーと新しいデータベースを作成します。 詳細については、DC シリーズに関するセクションをご覧ください。

  1. aka.ms/azuresqlhub の Azure SQL ハブに移動します。

  2. リソース メニューで、[ Azure SQL Database ] を展開し、[ SQL データベース] を選択します。

  3. +作成ドロップダウンリストからSQLデータベースを選択します。

    [SQL データベース] ページ、[作成] ボタン、および [SQL データベース] オプションを示す Azure portal のスクリーンショット。

  4. [SQL データベースの作成] フォームの [基本] タブにある [プロジェクトの詳細] で、目的の Azure [サブスクリプション] を選択します。

  5. [リソース グループ][新規作成] を選択し、リソース グループの名前を入力し、 [OK] を選択します。

  6. [データベース名] に、「ContosoHR」と入力します。

  7. [サーバー] で、 [新規作成] を選択し、 [新しいサーバー] フォームに次の値を入力します。

    • [サーバー名] : 「mysqlserver」と入力し、一意にするためにいくつかの文字を追加します。 サーバー名は、(サブスクリプション内だけでなく) Azure全体でグローバルに一意である必要があるため、mysqlserver135などを使用します。ポータルは、使用可能かどうかを示します。
    • [場所] :ドロップダウン リストから場所を選択します。

      重要

      DCシリーズのハードウェアとMicrosoft Azure Attestationの両方をサポートする場所(Azure リージョン)を選択する必要があります。 DC シリーズをサポートするリージョンの一覧については、DC シリーズの提供リージョンに関する記述を参照してください。 Microsoft Azure 構成証明のリージョンごとの可用性を確認してください。

    • [認証方法]: [SQL 認証を使用] を選びます。
    • [サーバー管理者ログイン] : 管理者のログイン名を入力します (例: azureuser)。
    • パスワード:要件を満たすパスワードを入力し、 [パスワードの確認入力] フィールドにもう一度入力します。
    • [OK] を選択します。
  8. [SQL エラスティック プールを使用しますか?][いいえ] に設定したままにします。

  9. [コンピューティングとストレージ] で、[データベースの構成] を選択し、[構成の変更] を選択します。

    Azure portal のデータベースを構成するハードウェア構成のスクリーンショット。

  10. [DC シリーズ] ハードウェア構成を選択し、 [OK] を選択します。

  11. [適用] を選択します。

  12. [基本] タブに戻り、 [コンピューティングとストレージ][General Purpose][DC、2 仮想コア、32 GB ストレージ] に設定されていることを確認します。

  13. [バックアップ ストレージの冗長性] には [Locally-redundant backup storage] (ローカル冗長バックアップ ストレージ) を選びます。

  14. ページの下部にある [Next: Networking](次へ: ネットワーク) を選択します。

    DC シリーズ データベースの構成 - 基本を示す Azure portal のスクリーンショット。

  15. [ネットワーク] タブの [接続方法] で、 [パブリック エンドポイント] を選択します。

  16. [ファイアウォール規則] で、 [現在のクライアント IP アドレスを追加する][はい] に設定します。 [Azure サービスおよびリソースにこのサーバー グループへのアクセスを許可する][いいえ] に設定したままにします。

  17. 接続ポリシーの場合は、[既定] に設定したままにします。Azure内からのすべてのクライアント接続にリダイレクト ポリシーを使用し、Azureの外部からのすべてのクライアント接続に対してプロキシを使用します。

  18. [Encrypted connections] (暗号化された接続)[Minimum TLS version] (最小 TLS バージョン)[TLS 1.2] に設定したままにします。

  19. ページ下部にある [確認と作成] を選択します。

    Azure portal の [SQL Database の作成] の [ネットワーク] タブのスクリーンショット。

  20. [確認と作成] ページで、確認後、 [作成] を選択します。

手順 2:構成証明プロバイダーを構成する

この手順では、Microsoft Azure Attestation で構成証明プロバイダーを作成して構成します。 これは、データベースが使用するセキュア エンクレーブの構成証明を行うために必要となります。

  1. 「アテステーション プロバイダーの作成」 ページに移動します。

  2. [アテステーションプロバイダーの作成](Create attestation provider) ページで、次の情報を入力します。

    • [サブスクリプション] : Azure SQL 論理サーバーを作成したのと同じサブスクリプションを選択します。
    • [リソース グループ] : Azure SQL 論理サーバーで作成したのと同じリソース グループを選択します。
    • [名前] : 「myattestprovider」と入力し、一意にするためにいくつか文字を追加します。 名前は世界的に一意でなければならないため、正確な認証プロバイダー名を提供することはできません。 そのため、myattestprovider12345 のように入力して、それが利用可能かどうかをポータルで確認できます。
    • [場所]: Azure SQL 論理サーバーと同じ場所を選択します。
    • [ポリシー署名者証明書ファイル]: 署名されていないポリシーを構成する場合は、このフィールドは空のままにします。
  3. 必要な情報を入力したら、 [確認と作成] を選択します。

    Azure portal の [構成証明プロバイダーの作成] メニューのスクリーンショット。

  4. [作成] を選択します。

  5. 構成証明プロバイダーが作成されたら、[リソースに移動] を選択します。

  6. 構成証明プロバイダーの [概要] タブで、Attest URI プロパティの値をクリップボードにコピーし、ファイルに保存します。 これは認証のURLです、後の手順で必要になります。

  7. 下部のペインまたはウィンドウの左側のリソース メニューで [ポリシー] を選択します。

  8. [構成証明の種類][SGX-IntelSDK] に設定します。

  9. 上部のメニューにある [構成] を選択します。

    Azure portal での構成証明ポリシーの構成のスクリーンショット。

  10. [ポリシーの形式][テキスト] に 設定します。 [ポリシー オプション][ポリシーの入力] に設定されたままにします。

  11. [ ポリシー] テキスト フィールドで、既定のポリシーを次のポリシーに置き換えます。 詳細については、「構成証明プロバイダーの作成と構成」を参照してください。

    version= 1.0;
    authorizationrules 
    {
           [ type=="x-ms-sgx-is-debuggable", value==false ]
            && [ type=="x-ms-sgx-product-id", value==4639 ]
            && [ type=="x-ms-sgx-svn", value>= 2 ]
            && [ type=="x-ms-sgx-mrsigner", value=="e31c9e505f37a58de09335075fc8591254313eb20bb1a27e5443cc450b6e33e5"] 
        => permit();
    
           [ type=="x-ms-sgx-is-debuggable", value==false ]
            && [ type=="x-ms-sgx-product-id", value==4639 ]
            && [ type=="x-ms-sgx-svn", value>= 2 ]
            && [ type=="x-ms-sgx-mrsigner", value=="a0f8e7f72092fb6a5d5752ffccd47fb3af7027ffb589b24e921e81f5703f3a9a"]
        => permit();
    };
    
  12. [保存] を選択します。

    Azure portal での構成証明ポリシーの編集のスクリーンショット。

  13. 上部のメニューにある [Refresh](最新の情報に更新) をクリックして、構成済みのポリシーを表示します

手順 3: データベースにデータを入力する

この手順では、テーブルを作成し、後で暗号化してクエリを実行するデータを設定します。

  1. SSMS を開き、データベース接続で Always Encrypted を有効にせずに、作成した Azure SQL 論理サーバーの ContosoHR データベースに接続します。

    1. [サーバーに接続] ダイアログで、サーバーの完全修飾名 (例: myserver135.database.windows.net) を指定し、サーバーの作成時に指定した管理者のユーザー名とパスワードを入力します。

    2. [オプション >>] を選択し、[接続プロパティ] タブを選択します。(既定の データベースではなく) 必ず master データベースを選択します。

    3. [Always Encrypted] タブを選択します。

    4. [Always Encrypted を有効にする (列の暗号化)] チェック ボックスがオンになっていないことを確認します。

      Always Encrypted を有効にせずに SSMS を使ってサーバーに接続した場合のスクリーンショット。

    5. [接続] を選択します。

  2. 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];
    GO
    
  3. 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);
    

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

この手順では、エンクレーブ計算を可能にする列マスター キーと列暗号化キーを作成します。

  1. 前の手順の SSMS インスタンスを使用し、オブジェクト エクスプローラーでデータベースを展開して、 [セキュリティ]>[Always Encrypted キー] に移動します。

  2. エンクレーブ対応の列マスターキーを作成します。

    1. [Always Encrypted Keys] を右クリックし、 [New Column Master Key...] を選択します。
    2. 新しい列マスター キーの名前を入力します: CMK1
    3. [エンクレーブ計算を許可する] が選択されていることを確認します。 (セキュリティで保護されたエンクレーブがデータベースに対して有効になっている場合は、既定でこれが選択されます。データベースでは DC シリーズ ハードウェア構成が使用されるため、有効にする必要があります)。
    4. [Azure Key Vault] (推奨) または [Windows 証明書ストア] ([現在のユーザー] または [ローカル マシン]) を選択します。
      • Azure Key Vault を選択した場合は、Azure にサインインし、使用するキー コンテナーを含む Azure サブスクリプションを選択し、キー コンテナーを選択します。 [キーの生成] を選択して、新しいキーを作成します。
      • Windows 証明書ストアを選択した場合は、[証明書の生成] ボタンを選択して新しい証明書を作成します。 新しい列マスター キーを作成するときに SSMS で [エンクレーブ計算を許可する] をオンにしたスクリーンショット。
    5. [OK] を選択します。
  3. 新しいエンクレーブ対応の列暗号化キーを作成します。

    1. [Always Encrypted キー] を右クリックし、 [新しい列の暗号化キー] を選択します。
    2. 新しい列暗号化キーの名前を入力します: CEK1
    3. [ 列マスター キー ] ドロップダウン リストで、前の手順で作成した列マスター キーを選択します。
    4. [OK] を選択します。

手順 5: 一部の列をその場で暗号化する

この手順では、サーバー側エンクレーブ内の SSN 列と Salary 列に格納されているデータを暗号化し、データに対する SELECT クエリをテストします。

  1. 新しい SSMS インスタンスを開き、データベース接続で Always Encrypted を有効にしてデータベースに接続します。

    1. SSMS の新しいインスタンスを開始します。

    2. [ サーバーへの接続 ] ダイアログで、サーバーの完全修飾名 ( <server name>.database.windows.net など) を指定し、サーバーの作成時に指定した管理者ユーザー名とパスワードを入力します。

    3. [オプション >>] を選択し、[接続プロパティ] タブを選択します。(既定の データベースではなく) 必ず master データベースを選択します。

    4. [Always Encrypted] タブを選択します。

    5. [Always Encrypted を有効にする (列の暗号化)] チェック ボックスをオンにします。

    6. [Enable secure enclaves] (セキュリティで保護されたエンクレーブを有効にする) を選択します。 (この手順は SSMS 19 以降に適用されます。)

    7. [プロトコル][Microsoft Azure Attestation] に設定します。 (この手順は SSMS 19 以降に適用されます。)

    8. 手順 2: 構成証明プロバイダーを構成する」の手順に従って取得したエンクレーブ構成証明 URL を指定します。

      SSMS の [サーバーに接続] ダイアログの [Always Encrypted] タブのスクリーンショット。構成証明が有効になっています。

    9. [接続] を選択します。

    10. Always Encrypted クエリのパラメーター化を有効にするよう求められたら、 [有効] を選択します。

  2. 同じ SSMS インスタンス (Always Encrypted が有効) を使用して、新しいクエリ ウィンドウを開き、次の T-SQL ステートメントを実行して SSN 列と Salary 列を暗号化します。

    ALTER TABLE [HR].[Employees]
    ALTER COLUMN [SSN] [char] (11) COLLATE Latin1_General_BIN2
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
    WITH
    (ONLINE = ON);
    
    ALTER TABLE [HR].[Employees]
    ALTER COLUMN [Salary] [money]
    ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
    WITH
    (ONLINE = ON);
    
    ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
    

    上記のスクリプトでデータベースのクエリ プラン キャッシュをクリアするには、 ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE ステートメントに注目してください。 テーブルを変更したら、テーブルにアクセスするすべてのバッチおよびストアド プロシージャのプランをクリアして、パラメーター暗号化情報を更新する必要があります。

  3. SSN列とSalary列が暗号化されたことを確認するには、データベース接続に対して Always Encrypted が有効になっていない SSMS インスタンスで新しいクエリ ウィンドウを開き、次のステートメントを実行します。 クエリ ウィンドウは、 SSN 列と Salary 列で暗号化された値を返す必要があります。 Always Encrypted が有効な SSMS インスタンスを使用して同じクエリを実行した場合は、復号化されたデータが表示されます。

    SELECT * FROM [HR].[Employees];
    

手順 6:暗号化された列に対して高度なクエリを実行する

暗号化された列に対して高度なクエリを実行できます。 いくつかのクエリ処理は、サーバー側エンクレーブ内で実行されます。

  1. Always Encrypted が有効になっている SSMS インスタンスで、Always Encrypted のパラメーター化も有効になっていることを確認します。

    1. SSMS のメイン メニューから [ツール] を選択します。
    2. [オプション...] を選択します。
    3. [クエリ実行]>[SQL Server]>[詳細] の順に移動します。
    4. [Always Encrypted のパラメーター化を有効にする] がオンであることを確認します。
    5. [OK] を選択します。
  2. 新しいクエリ ウィンドウを開き、次のクエリを貼り付けて実行します。 クエリでは、指定した検索条件を満たすプレーンテキスト値と行が返されます。

    DECLARE @SSNPattern [char](11) = '%6818';
    DECLARE @MinSalary [money] = $1000;
    SELECT * FROM [HR].[Employees]
    WHERE SSN LIKE @SSNPattern AND [Salary] >= @MinSalary;
    
  3. Always Encrypted が有効になっていない SSMS インスタンスで同じクエリをもう一度試します。 エラーが発生します。

チュートリアル

このチュートリアルを完了すると、次のいずれかのチュートリアルに進むことができます。