SQL Server Management Studio を使用して Always Encrypted キーをローテーションする

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

この記事では、SQL Server Management Studio (SSMS) を使用して、Always Encrypted の列マスター キーと列暗号化キーを交換するためのタスクについて説明します。

推奨されるベスト プラクティスやセキュリティ上の重要な考慮事項など、Always Encrypted のキー管理の概要については、「Always Encrypted のキー管理の概要」をご覧ください。

注

Azure Key Vault のマネージド HSM に格納されている列マスター キーを使用するには、SSMS 18.9 以降のバージョンが必要です。

列マスター キーの回転

列マスター キーの回転は、既存の列マスター キーを新しい列マスター キーに置き換える処理です。 キーが侵害された場合、または暗号化キーを定期的にローテーションする必要がある組織のポリシーまたはコンプライアンス規則に準拠するために、キーのローテーションが必要になる場合があります。 列マスター キーの回転では、現在の列マスター キーで保護された列暗号化キーを暗号化解除し、新しい列マスター キーを使用して列暗号化キーを再度暗号化し、キーのメタデータを更新するという処理が必要です。

手順 1: 新しい列マスター キーをプロビジョニングする

「[新しい列マスター キー] ダイアログを使用して列マスター キーをプロビジョニングする」に記載されている手順に従ってください。

注

キー ストアとして Azure Key Vault を使用する場合、マルチテナントカスタマー マネージド キーローテーションはサポートされていません。 新しいカスタマー マネージド キーが既存のテナントと同じテナントにあることを確認します。

手順 2: 新しい列マスター キーで列暗号化キーを暗号化する

列マスター キーは、通常、1 つまたは複数の列暗号化キーを保護します。 各列暗号化キーには、列マスター キーを使用して列暗号化キーを暗号化する製品である、暗号化された値がデータベースに格納されています。 この手順では、回転する列マスター キーで保護されている各列暗号化キーを新しい列マスター キーで暗号化し、新しい暗号化された値をデータベースに格納します。 結果的に、回転の影響を受けた各列暗号化キーには暗号化された値が 2 つ含まれることになります。1 つは既存の列マスター キーにより暗号化された値、もう 1 つは新しい列マスター キーで暗号化された値です。

  1. [オブジェクト エクスプローラー] を使用して [セキュリティ]>[Always Encrypted キー]>[列マスター キー] フォルダーに移動し、ローテーション対象の列マスター キーを探します。
  2. 列マスター キーを右クリックし、 [回転]を選択します。
  3. [列マスター キーの回転] ダイアログの [ターゲット] フィールドで、手順 1 で作成した、新しい列マスター キーの名前を選択します。
  4. 既存の列マスター キーで保護された、列暗号化キーの一覧を確認します。 これらのキーは、回転の影響を受けます。
  5. [OK] を選択.

SQL Server Management Studio は、古い列マスター キーで保護されている列暗号化キーのメタデータと、古い列マスター キーと新しい列マスター キーのメタデータを取得します。 次に、SSMS では、列マスター キーのメタデータを使用することで、古い列マスター キーが格納されたキー ストアにアクセスし、列暗号化キーを暗号化解除します。 その後、SSMS は新しい列マスター キーを保持するキー ストアにアクセスして、列暗号化キーの暗号化された値の新しいセットを生成し、新しい値をメタデータに追加します ( ALTER COLUMN ENCRYPTION KEY ステートメントの生成と発行)。

注

古い列マスター キーで暗号化された各列暗号化キーが、他の列マスター キーで暗号化されていないことを確認します。 言い換えると、ローテーションの影響を受ける各列暗号化キーには、データベース内の暗号化された値が 1 つだけ必要です。 影響を受ける列暗号化キーのいずれかに複数の暗号化された値が含まれている場合、回転を続行する前にその値を削除する必要があります (列暗号化キーの暗号化された値を削除する方法は、 "手順 4" を参照してください)。

手順 3: 新しい列マスター キーでアプリケーションを構成する

この手順では、ローテーションする列マスター キーで保護されたデータベース列に対してクエリを実行するすべてのクライアント アプリケーションが、新しい列マスター キー (つまり、ローテーション中の列マスター キーで暗号化された列暗号化キーで暗号化されたデータベース列) にアクセスできることを確認する必要があります。 この手順は、新しい列マスター キーが格納されているキー ストアの種類によって異なります。 次に例を示します。

  • 新しい列マスター キーが Windows 証明書ストアに格納された証明書である場合、データベースの列マスター キーのキー パスに指定された場所と同じ証明書ストアの場所 ([現在のユーザー] または [ローカル コンピューター]) に証明書を展開する必要があります。 アプリケーションが、証明書にアクセスできる必要があります。
    • 証明書が、"現在のユーザー" の証明書ストアに格納されている場合、証明書をアプリケーションの Windows ID (ユーザー) の [現在のユーザー] ストアにインポートする必要があります。
    • 証明書が "ローカル コンピューター" の証明書ストアに格納されている場合、アプリケーションの Windows ID に証明書へのアクセス許可が必要です。
  • 新しい列マスター キーが Microsoft Azure Key Vault に格納されている場合は、アプリケーションが Azure を認証でき、キーにアクセスできるように実装する必要があります。

詳しくは、「Always Encrypted の列マスター キーを作成して保存する」をご覧ください。

注

回転のこの時点では、古い列マスター キーと新しい列マスター キーの両方が有効であり、これらを使ってデータにアクセスすることができます。

手順 4: 古い列マスター キーで暗号化された列暗号化キーの値をクリーンアップする

新しい列マスター キーを使用するようにすべてのアプリケーションを構成したら、 "古い" 列マスター キーで暗号化された列暗号化キーの値をデータベースから削除します。新しい列マスター キーを使用するようにすべてのアプリケーションを構成したら、古い列マスター キーで暗号化された列暗号化キーの値をデータベースから削除します。 古い値を削除することで、次の回転を行うことができます (ただし、回転される列マスター キーで保護されたすべての列暗号化キーに、必ず暗号化された値が 1 つ必要です)。

古い列マスター キーをアーカイブまたは削除する前に古い値をクリーンアップするもう 1 つの理由は、パフォーマンスに関係します。暗号化された列にクエリを実行すると、Always Encrypted が有効なクライアント ドライバーで、古い値と新しい値の 2 つの暗号化を解除しなければならない場合があるからです。 ドライバーでは、アプリケーションの環境で 2 つの列マスター キーのどちらが有効かは認識されません。このため、ドライバーでは暗号化された値が両方ともサーバーから取得されます。 使用できない列マスター キー (ストアから削除されている古い列マスター キーなど) で暗号化されていることにより一方の値の暗号化の解除が失敗すると、ドライバーでは新しい列マスター キーを使用してもう一方の値の暗号化の解除が試みられます。

警告

対応する列マスター キーがアプリケーションで使用できるようになる前に列暗号化キーの値を削除すると、データベース列をアプリケーションが暗号化解除できなくなります。

  1. [オブジェクト エクスプローラー] で、[セキュリティ] > [Always Encrypted キー] フォルダーの順に移動し、交換する既存の列マスター キーを探します。
  2. 既存の列マスター キーを右クリックし、 [クリーンアップ]を選択します。
  3. 削除される列暗号化キーの値の一覧を確認します。
  4. [OK] を選択.

SQL Server Management Studioは、ALTER COLUMN ENCRYPTION KEYステートメントを発行して、古い列マスター キーで暗号化された列暗号化キーの暗号化された値を削除します。

手順 5: 古い列マスター キーのメタデータを削除する

データベースから古い列マスター キーの定義を削除する場合は、次の手順を使用します。

  1. オブジェクト エクスプローラー を使用して、Security>Always Encrypted Keys>Column Master Keys フォルダーをたどり、データベースから削除する対象の古い列マスター キーを見つけます。
  2. 古い列マスター キーを右クリックし、 [削除]を選択します (これにより、 DROP COLUMN MASTER KEY ステートメントが生成され、列マスター キーのメタデータが削除されます)。
  3. [OK] を選択.

注

ローテーション後に古い列マスター キーを完全に削除しないことを強くお勧めします。 そこで、古い列マスター キーを現在のキー ストアに保存するか、セキュリティで保護された別の場所にアーカイブします。 新しい列マスター キーが構成される前の特定の時点にバックアップ ファイルからデータベースを復元する場合、データにアクセスするには古いキーが必要です。

列マスター キーを回転するためのアクセス許可

列マスター キーを回転するには、次のデータベース権限が必要です。

  • ALTER ANY COLUMN MASTER KEY - 新しい列マスター キーのメタデータを作成し、古い列マスター キーのメタデータを削除するために必要です。
  • ALTER ANY COLUMN ENCRYPTION KEY - 列暗号化キーのメタデータを変更するために必要です (新しい暗号化された値を追加します)。

また、キー ストアにある古い列マスター キーと新しい列マスター キーの両方にアクセスできるキー ストアのアクセス許可も必要です。 キーの管理操作に必要なキー ストアのアクセス許可の詳細については、「Always Encrypted の列マスター キーを作成して保存する」に移動し、キー ストアに関するセクションを見つけてください。

列暗号化キーをローテーションする

列暗号化キーを回転するには、回転するキーで暗号化されたすべての列のデータを暗号化解除し、新しい列暗号化キーを使用してデータを再度暗号化する必要があります。

注

回転するキーで暗号化された列を含むテーブルが大きい場合、列暗号化キーの回転には長い時間がかかることがあります。 データが再暗号化されている間、アプリケーションは影響を受けるテーブルに書き込むことができません。 したがって、組織で列暗号化キーを回転する場合は、慎重に計画を立てる必要があります。 列暗号化キーを回転するには、Always Encrypted ウィザードを使用します。

  1. データベースのウィザードを開きます。データベースを右クリックし、[ タスク] をポイントして、[ 列の暗号化] を選択します。
  2. [概要] ページを確認し、[次へ] を選択します。
  3. [列の選択] ページで、テーブルを展開し、古い列暗号化キーで現在暗号化されている列で、置換する列をすべて特定します。
  4. 古い列暗号化キーで暗号化されたそれぞれの列について、[暗号化キー] を新しい自動生成キーに設定します。 注: または、ウィザードを実行する前に、新しい列暗号化キーを作成しておくこともできます (「[新しい列の暗号化キー] ダイアログを使用して列の暗号化キーをプロビジョニングする」を参照)。
  5. [ マスター キーの構成] ページで、新しいキーを格納する場所を選択し、マスター キーソースを選択して、[ 次へ] を選択します。 注: 既存の列暗号化キーを使用する (自動生成されたものではなく) 場合、このページで実行するアクションはありません。
  6. [ 検証] ページで、スクリプトをすぐに実行するか、PowerShell スクリプトを作成するかを選択し、[ 次へ] を選択します。
  7. [ 概要 ] ページで、選択したオプションを確認し、[ 完了] を選択し、完了したらウィザードを閉じます。
  8. オブジェクト エクスプローラーで [セキュリティ]、[Always Encrypted キー]、[列暗号化キー] フォルダーの順に移動し、データベースから削除する古い列暗号化キーを探します。 キーを右クリックし、 [削除]をクリックします。

列暗号化キーを回転するためのアクセス許可

列暗号化キーをローテーションするには、データベースのアクセス許可が必要です。 ALTER ANY COLUMN MASTER KEY - 新しい自動生成列暗号化キーを使用する場合は必須です (新しい列マスター キーとその新しいメタデータも生成されます)。 ALTER ANY COLUMN ENCRYPTION KEY - 新しい列暗号化キーのメタデータを追加するために必要です。

また、新しいおよび古い列暗号化キーの両方の列マスター キーにアクセスできるキー ストアのアクセス許可も必要です。 キーの管理操作に必要なキー ストアのアクセス許可の詳細については、「Always Encrypted の列マスター キーを作成して保存する」に移動し、キー ストアに関するセクションを見つけてください。