SQL Server コネクタと SQL の暗号化機能の併用

適用対象:SQL Server

Azure Key Vaultで保護された非対称鍵を使用する一般的なSQL Server暗号化活動は、以下の3つの分野に分類されます。

  • Azure Key Vaultの非対称鍵を使った透過的なデータ暗号化(TDE)。
  • キーボールトの非対称鍵を使ってバックアップを暗号化する方法。
  • キーボールトから非対称鍵を使用することでカラムレベルの暗号化を行います。

この記事の手順に従う前に、SQL Server の Azure Key Vault を使用した Transparent Data Encryption の設定のステップ 1 から 4 を完了してください。

注

バージョン1.0.0.440以前は新しい版に置き換えられており、本番環境ではサポートされていません。 バージョン1.0.1.0以降にアップグレードしてください。 Microsoft ダウンロード センターから最新バージョンをダウンロードし、SQL Server Connectorのメンテナンスとトラブルシューティングの「SQL Server Connectorのアップグレード」セクションの指示に従ってください。

注

Microsoft Entra ID は以前に Azure Active Directory(Azure AD)として知られていました。

Azure Key Vaultの非対称鍵を用いた透過的なデータ暗号化

SQL Server 向けに Azure Key Vault を使用して Transparent Data Encryption を設定するのステップ 1 から 4 を完了した後、Azure Key Vault のキーを使って、TDE でデータベース暗号化キーを暗号化します。 PowerShell を使用したキーのローテーションの詳細については、PowerShell を使用した透過的データ暗号化 (TDE) プロテクターのローテーション参照してください。

重要

ロールオーバー後に以前のバージョンのキーは削除しないでください。 鍵がロールオーバーされる際、古いデータベースバックアップ、バックアップされたログファイル、トランザクションログファイルなど、一部のデータは以前の鍵で暗号化されたままです。

認証情報とログイン情報を作成し、データベース内のデータとログを暗号化するデータベース暗号化キーを作成する必要があります。 データベースを暗号化するには、データベースに対するCONTROL権限が必要です。 以下の図は、Azure Key Vaultを使用した際の暗号化キーの階層を示しています。

Azure Key Vaultを使用した際の暗号化鍵の階層を示す図。

  1. データベース エンジンが TDE に使用する SQL Server の資格情報を作成する

    データベース エンジンは、データベースロード中にMicrosoft Entraアプリケーション認証情報を使ってキーボールトにアクセスします。 付与するキー ボールトのアクセス許可を制限するには、データベース エンジン 用に、手順 1: 認証モデルを設定するで説明されているように、別のクライアント IDとシークレットを作成します。

    次の Transact-SQL スクリプトを以下のように変更します。

    • IDENTITY 引数 (ContosoDevKeyVault) を編集し、Azure Key Vault を参照するようにします。

      • グローバル Azure を使用している場合は、IDENTITY 引数を「手順 2: キー コンテナーを作成する」のお使いの Azure Key Vault の名前に置き換えます。
      • プライベート Azure クラウド (Azure Government、21Vianet が運用する Azure、Azure Germany など) を使用している場合は、IDENTITY で返される Vault URI で 引数を置き換えてください。 キー コンテナー URI に https:// は含めないでください。
    • SECRET 引数の最初の部分を、ステップ 1: 認証モデルを設定する の Microsoft Entra アプリケーション Client ID に置き換えます。 この例のクライアント ID は EF5C8E094D2A4A769998D93440D8115D です。

      重要

      クライアント IDのハイフンは削除してください。

    • SECRET 引数の 2 番目の部分を、手順 1 で取得した クライアント シークレット で完成させます。 この例では、 クライアントシークレット は ReplaceWithAADClientSecretです。

    • SECRETの引数の最後の文字列は、ハイフンのない長い文字と数字の列です。

    USE master;  
    CREATE CREDENTIAL Azure_EKM_TDE_cred   
        WITH IDENTITY = 'ContosoDevKeyVault', -- for global Azure
        -- WITH IDENTITY = 'ContosoDevKeyVault.vault.usgovcloudapi.net', -- for Azure Government
        -- WITH IDENTITY = 'ContosoDevKeyVault.vault.azure.cn', -- for Microsoft Azure operated by 21Vianet
        -- WITH IDENTITY = 'ContosoDevKeyVault.vault.microsoftazure.de', -- for Azure Germany   
        SECRET = 'EF5C8E094D2A4A769998D93440D8115DReplaceWithAADClientSecret'   
    FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov;  
    
  2. データベース エンジンが TDE に使用する SQL Server ログインを作成する

    SQL Server ログインを作成し、手順 1. で作成した資格情報を追加します。 この例の Transact-SQL では、既にインポートされているキーと同じものを使用しています。

    USE master;  
    -- Create a SQL Server login associated with the asymmetric key   
    -- for the Database engine to use when it loads a database   
    -- encrypted by TDE.  
    CREATE LOGIN TDE_Login   
    FROM ASYMMETRIC KEY CONTOSO_KEY;  
    GO   
    
    -- Alter the TDE Login to add the credential for use by the   
    -- Database Engine to access the key vault  
    ALTER LOGIN TDE_Login   
    ADD CREDENTIAL Azure_EKM_TDE_cred ;  
    GO  
    
  3. データベース暗号化鍵(DEK)を作成する

    DEKはデータベースインスタンス内のデータやログファイルを暗号化し、その後Azure Key Vaultの非対称キーによって暗号化されます。 SQL Serverがサポートする任意のアルゴリズムやキー長を使ってDEKを作成できます。

    USE ContosoDatabase;  
    GO  
    
    CREATE DATABASE ENCRYPTION KEY   
    WITH ALGORITHM = AES_256   
    ENCRYPTION BY SERVER ASYMMETRIC KEY CONTOSO_KEY;  
    GO  
    
  4. TDEをオンにしてください

    -- Alter the database to enable transparent data encryption.  
    ALTER DATABASE ContosoDatabase   
    SET ENCRYPTION ON;  
    GO  
    

    Management Studioを使って、オブジェクト エクスプローラーでデータベースに接続してTDEが有効かどうか確認してください。 データベースを右クリックし、タスクにカーソルを合わせて、データベースの暗号化の管理を選択します。

    [タスク] > [データベース暗号化の管理] が選択されたオブジェクト エクスプローラーを示すスクリーンショット。

    [データベース暗号化の管理] ダイアログ ボックスで、TDE が有効になっていることを確認し、DEK の暗号化に使用されている非対称キーを確認します。

    [データベース暗号化をオンに設定] オプションが選択され、TDE が有効になっていることを示す黄色のバナーが表示された、[データベース暗号化の管理] ダイアログボックスのスクリーンショット。

    代わりに、次の Transact-SQL スクリプトを実行してもかまいません。 暗号化の状態が "3" である場合、データベースが暗号化済みであることを示します。

    USE MASTER  
    SELECT * FROM sys.asymmetric_keys  
    
    -- Check which databases are encrypted using TDE  
    SELECT d.name, dek.encryption_state   
    FROM sys.dm_database_encryption_keys AS dek  
    JOIN sys.databases AS d  
         ON dek.database_id = d.database_id;  
    

    注

    いずれかのデータベースで TDE が有効になっている場合は常に、 tempdb データベースが自動的に暗号化されます。

キーボールトからの非対称鍵を用いたバックアップの暗号化

暗号化されたバックアップは、SQL Server 2014 (12.x) 以降でサポートされています。 以下の例では、鍵保管庫内の非対称鍵によって保護されたデータ暗号化キーで暗号化されたバックアップを作成し、復元します。

データベース エンジンは、データベースロード中にMicrosoft Entraアプリケーション認証情報を使ってキーボールトにアクセスします。 付与するキー コンテナーのアクセス許可を制限するには、手順 1: 認証モデルの設定の説明に従って、データベースエンジン用に別のクライアント ID とシークレットを作成してください。

  1. バックアップ暗号化用にデータベース エンジン用のSQL Server資格情報を作成します

    次の Transact-SQL スクリプトを以下のように変更します。

    • IDENTITY 引数 (ContosoDevKeyVault) を編集し、Azure Key Vault を参照するようにします。

    • SECRET 引数の最初の部分を、ステップ 1: 認証モデルを設定する の Microsoft Entra アプリケーション クライアント ID に置き換えます。 この例のクライアント ID は EF5C8E094D2A4A769998D93440D8115D です。

      重要

      クライアント IDのハイフンは削除してください。

    • ステップ1のSECRETを使用して、引数の2番目の部分を入力します。 この例では、 クライアントシークレット は Replace-With-AAD-Client-Secretです。 SECRETの引数の最終的な文字列は、ハイフンのない長い文字と数字の列です。

      USE master;  
      
      CREATE CREDENTIAL Azure_EKM_Backup_cred   
          WITH IDENTITY = 'ContosoDevKeyVault', -- for global Azure
          -- WITH IDENTITY = 'ContosoDevKeyVault.vault.usgovcloudapi.net', -- for Azure Government
          -- WITH IDENTITY = 'ContosoDevKeyVault.vault.azure.cn', -- for Microsoft Azure operated by 21Vianet
          -- WITH IDENTITY = 'ContosoDevKeyVault.vault.microsoftazure.de', -- for Azure Germany   
          SECRET = 'EF5C8E094D2A4A769998D93440D8115DReplace-With-AAD-Client-Secret'   
      FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov;    
      
  2. バックアップ暗号化のためにデータベース エンジン用のSQL Serverログインを作成する

    データベース エンジンが暗号化バックアップに使用する SQL Server ログインを作成し、手順 1 の資格情報を追加します。 この例の Transact-SQL では、既にインポートされているキーと同じものを使用しています。

    重要

    すでにTDE(前例)や列レベルの暗号化(次の例)で同じ非対称鍵を使っている場合は、バックアップに同じ非対称鍵を使うことはできません。

    この例では、masterで説明されているように、データベース用に以前にインポートまたは作成した、キー ボールトに保存されたCONTOSO_KEY_BACKUP非対称キーを使用します。

    USE master;  
    
    -- Create a SQL Server login associated with the asymmetric key   
    -- for the Database engine to use when it is encrypting the backup.  
    CREATE LOGIN Backup_Login   
    FROM ASYMMETRIC KEY CONTOSO_KEY_BACKUP;  
    GO   
    
    -- Alter the Encrypted Backup Login to add the credential for use by   
    -- the Database Engine to access the key vault  
    ALTER LOGIN Backup_Login   
    ADD CREDENTIAL Azure_EKM_Backup_cred ;  
    GO  
    
  3. データベースをバックアップしてください

    Key Vault に保存されている非対称鍵を使用した暗号化を指定して、データベースをバックアップします。

    以下の例では、データベースがすでにTDEで暗号化されており、非対称鍵 CONTOSO_KEY_BACKUP がTDE非対称鍵と異なる場合、バックアップはTDE非対称鍵と CONTOSO_KEY_BACKUPの両方で暗号化されます。 ターゲットとなるSQL Serverインスタンスはバックアップを復号するために両方の鍵を必要とします。

    USE master;  
    
    BACKUP DATABASE [DATABASE_TO_BACKUP]  
    TO DISK = N'[PATH TO BACKUP FILE]'   
    WITH FORMAT, INIT, SKIP, NOREWIND, NOUNLOAD,   
    ENCRYPTION(ALGORITHM = AES_256,   
    SERVER ASYMMETRIC KEY = [CONTOSO_KEY_BACKUP]);  
    GO  
    
  4. データベースの復元

    TDEで暗号化されたデータベースバックアップを復元するには、ターゲットSQL Serverインスタンスがまず暗号化に使用された非対称キーボールトキーのコピーを持っている必要があります。 コピーを提出する方法:

    • TDEで使用された元の非対称鍵がキー ボールトに存在しない場合は、キー ボールト キーのバックアップを復元するか、ローカルHSMからキーを再インポートしてください。 キーの指紋をデータベース バックアップに記録された指紋と一致させるには、キーは元々使用していた同じ Key Vault キー名を使用する必要があります。

    • ターゲットSQL Serverインスタンスに対してステップ1と2を適用します。

    • ターゲットとなるSQL Serverインスタンスがバックアップの暗号化に使われた非対称鍵にアクセスできるようになったら、サーバー上でデータベースを復元してください。

    復元のサンプル コードは次のとおりです。

    RESTORE DATABASE [DATABASE_TO_BACKUP]  
    FROM DISK = N'[PATH TO BACKUP FILE]'   
        WITH FILE = 1, NOUNLOAD, REPLACE;  
    GO  
    

    バックアップ オプションの詳細については、「 BACKUP (Transact-SQL)」を参照してください。

キーボールトからの非対称鍵を用いたカラムレベルの暗号化

次の例では、資格情報コンテナー内の非対称キーによって保護された対称キーを作成します。 対称鍵はデータベース内のデータを暗号化します。

重要

バックアップ暗号化に同じ非対称鍵を使っている場合は、同じ非対称鍵をカラムレベルの暗号化に使うことはできません。

この例では、Key Vault に保存されている CONTOSO_KEY_COLUMNS 非対称キーを使用します。この鍵は、ステップ 2: Key Vault の作成で説明されているように、事前にインポートするか、作成しておくことができます。 この非対称キーを ContosoDatabase データベースで使用するには、CREATE ASYMMETRIC KEY 文を再度実行して ContosoDatabase データベースにキーへの参照を与える必要があります。

USE [ContosoDatabase];  
GO  
  
-- Create a reference to the key in the key vault  
CREATE ASYMMETRIC KEY CONTOSO_KEY_COLUMNS   
FROM PROVIDER [AzureKeyVault_EKM_Prov]  
WITH PROVIDER_KEY_NAME = 'ContosoDevRSAKey2',  
CREATION_DISPOSITION = OPEN_EXISTING;  
  
-- Create the data encryption key.  
-- The data encryption key can be created using any SQL Server   
-- supported algorithm or key length.  
-- The DEK will be protected by the asymmetric key in the key vault  
  
CREATE SYMMETRIC KEY DATA_ENCRYPTION_KEY  
    WITH ALGORITHM=AES_256  
    ENCRYPTION BY ASYMMETRIC KEY CONTOSO_KEY_COLUMNS;  
  
DECLARE @DATA VARBINARY(MAX);  
  
--Open the symmetric key for use in this session  
OPEN SYMMETRIC KEY DATA_ENCRYPTION_KEY   
DECRYPTION BY ASYMMETRIC KEY CONTOSO_KEY_COLUMNS;  
  
--Encrypt syntax  
SELECT @DATA = ENCRYPTBYKEY  
    (  
    KEY_GUID('DATA_ENCRYPTION_KEY'),   
    CONVERT(VARBINARY,'Plain text data to encrypt')  
    );  
  
-- Decrypt syntax  
SELECT CONVERT(VARCHAR, DECRYPTBYKEY(@DATA));  
  
--Close the symmetric key  
CLOSE SYMMETRIC KEY DATA_ENCRYPTION_KEY;