適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Always Encrypted では、2 種類の暗号化キーを使用してデータを保護します。1 つはデータを暗号化するキー、もう 1 つはデータを暗号化するキーです。 列暗号化キーはデータを暗号化し、列マスター キーは列暗号化キーを暗号化します。 この記事では、これらの暗号化キーを管理するための詳細な概要を提供します。
Always Encrypted鍵と鍵の管理について説明する際には、実際の暗号化キーと、鍵を記述するメタデー タオブジェクトの違いを理解することが重要である。 実際の暗号化キーを指す 列暗号化キー と 列マスター キー という用語と、データベース内の Always Encrypted キーの 説明 を指す 列暗号化キーのメタデータ と 列マスター キーのメタデータ という用語を使用します。
列暗号化キー は、データを暗号化するために使用される内容暗号化キーです。 名前が示すように、列暗号化キーはデータベースの列内のデータを暗号化するために使用します。 1つまたは複数の列を同じ列暗号化キーで暗号化することも、アプリケーションの要件に応じて複数の列暗号化キーを使用することもできます。 列暗号化キーは自体が暗号化され、列暗号化キーの暗号化された値だけが (列暗号化キーのメタデータの一部として) データベースに格納されます。 列暗号化キーのメタデータは、 sys.column_encryption_keys (TRANSACT-SQL) と sys.column_encryption_key_values (TRANSACT-SQL) カタログ ビューに格納されます。 AES-256 アルゴリズムで使用される列暗号化キーは 256 ビット長です。
"列マスター キー" は、列暗号化キーの暗号化に使用される保護キーです。 列マスター キーは、Windows 証明書ストア、Azure Key Vault、またはハードウェア セキュリティ モジュールなどの信頼できるキー ストアに格納する必要があります。 データベースには、列マスター キーに関するメタデータ (キー ストアの種類と場所) のみが含まれます。 列マスター キーのメタデータは、 sys.column_master_keys (TRANSACT-SQL) カタログ ビューに格納されています。
データベース システムのキー メタデータには、プレーンテキスト列マスター キーまたはプレーンテキスト列暗号化キーが含まれません。 データベースには、列マスター キーの種類と場所に関する情報と、列暗号化キーの暗号化された値のみが含まれます。 これは、プレーンテキストのキーはデータベース システムに決して公開されないので、データベース システムが侵害された場合でも、Always Encrypted を使用して保護されているデータの安全性が保証されることを意味します。 データベース システムがプレーンテキスト キーにアクセスできないようにするには、データベースをホストしているコンピューターとは異なるコンピューターでキー管理ツールを実行してください。 詳細については、以下 の「キー管理のセキュリティに関する考慮事項 」セクションを参照してください。
データベースには暗号化されたデータ(Always Encrypted で保護されたカラム)のみが格納されており、平文の鍵にはアクセスできないため、データを復号化することはできません。 つまり、Always Encrypted 列に対してクエリを実行しても、暗号化された値が返されるだけなので、保護されたデータを暗号化または復号化する必要があるクライアント アプリケーションは、列マスター キーと関連する列暗号化キーにアクセスできる必要があります。 詳しくは、「Always Encrypted を使用したアプリケーションの開発」をご覧ください。
キー管理タスク
キー管理のプロセスは、次の高度なタスクに分類できます:
キープロビジョニング: 信頼されたキー ストア (Windows証明書ストア、Azure Key Vault、ハードウェア セキュリティ モジュールなど) に物理キーを作成し、列マスター キーを使用して列暗号化キーを暗号化し、データベース内の両方の種類のキーのメタデータを作成します。
キーのローテーション: 既存のキーを新しいキーに定期的に置き換えます。 キーが侵害された場合、または暗号化キーをローテーションする必要がある組織のポリシーまたはコンプライアンス規則に準拠するために、キーのローテーションが必要になる場合があります。
キー管理のロール
Always Encrypted キーを管理するユーザーには、2 つの異なるロールがあります。セキュリティ管理者とデータベース管理者 (DBA):
- セキュリティ管理者: 列暗号化キーと列マスター キーを生成し、列マスター キーを含むキー ストアを管理します。 これらのタスクを実行するには、セキュリティ管理者がキーとキー ストアにアクセスできる必要がありますが、データベースにアクセスする必要はありません。
- DBA: データベース内のキーに関するメタデータを管理します。 キー管理タスクを実行するために、DBAはデータベース内のキー・メタデータを管理できる必要があるが、キーやカラムマスター キーを保持するキー格納にアクセスする必要はない。
上記の役割を考慮すると、Always Encrypted のキー管理タスクを実行するには、 役割の分離を使用する場合と 役割の分離を使用しない場合の 2 つの異なる方法があります。 組織のニーズに応じて、要件に最適なキー管理プロセスを選択できます。
ロールの分離によるキーの管理
Always Encrypted キーがロールの分離によって管理されている場合、組織内のさまざまなユーザーがセキュリティ管理者と DBA ロールを引き受けます。 ロールを分離したキー管理プロセスにより、DBA は実際のキーを保持しているキーまたはキー ストアにアクセスできなくなり、セキュリティ管理者は機密データを含むデータベースにアクセスできなくなります。 組織内のDBAが機密データにアクセスできないようにすることが目的なら、ロールを分離してキーを管理することを推奨します。
Note
セキュリティ管理者はプレーンテキスト キーを生成して操作するため、データベース システムをホストしているのと同じコンピューターや、DBA や潜在的な敵対者である可能性のある他のユーザーがアクセスできるコンピューターでタスクを実行しないでください。
ロールを分離せずにキーを管理する
ロールを分離せずに Always Encrypted キーを管理する場合、1 人のユーザーがセキュリティ管理者ロールと DBA ロールの両方を引き受けることができます。つまり、ユーザーはキー/キー ストアとキー メタデータの両方にアクセスして管理できる必要があります。 DevOps モデルを使用している組織では、ロールを分離せずにキーを管理することをお勧めします。または、データベースがクラウドでホストされていて、主な目的は、クラウド管理者 (オンプレミスの DBA ではなく) が機密データにアクセスできないようにすることです。
Always Encrypted キーを管理するためのツール
Always Encrypted キーは、 SQL Server Management Studio (SSMS) と PowerShellを使用して管理できます:
SQL Server Management Studio (SSMS) - キー ストア アクセスとデータベース アクセスに関係するタスクを組み合わせるダイアログとウィザードを提供するため、ssms は役割の分離をサポートしていませんが、キーの構成が簡単になります。 SSMS を使用したキー管理の詳細については、以下を参照してください:
SQL Server PowerShell - 役割の分離を使用または使用せずに Always Encrypted キーを管理するためのコマンドレットが含まれます。 詳細については、次を参照してください:
キー管理でのセキュリティに関する考慮事項
Always Encrypted の主な目的は、データベース システムまたはそのホスティング環境が侵害された場合でも、データベースに格納されている機密データの安全を保証することです。 Always Encrypted が機密データの漏えい防止に役立つ、セキュリティ攻撃の例を次に示します:
- 高い特権を持つ悪意のあるデータベース ユーザー (DBA など)が、機密性の高いデータ列に対してクエリを実行する。
- SQL Server インスタンスをホストするコンピューターの悪意のある管理者が、SQL Server プロセスのメモリ、または SQL Server プロセスのダンプ ファイルをスキャンする。
- 悪意のあるデータ センター オペレーターが、顧客データベースにクエリを実行する、SQL Server のダンプ ファイルを調べる、またはクラウド内の顧客データをホストするコンピューターのメモリを調べる。
- データベースをホストしているコンピューター上でマルウェアが実行されている。
Always Encrypted がこのような攻撃を確実に防ぐためには、鍵管理プロセスにおいて、カラムマスター キー、カラム暗号化キー、およびカラムマスター キーを含むキー格納への資格証明情報が、潜在的な攻撃者に決して公開されないようにする必要がある。 従うべきいくつかのガイドラインを以下に示します:
- 列マスター キーまたは暗号化キーをデータベースをホストするコンピューター上で生成しないでください。 代わりに、別のコンピューター (キー管理専用またはキーへのアクセスを必要とするアプリケーションをホストしているコンピューターのいずれか) でキーを生成します。 つまり、攻撃者がプロビジョニングや Always Encrypted キーの維持に使用しているコンピューターにアクセスすると、ツールのメモリにキーが短時間表示されるだけでも、攻撃者がキーを取得できる可能性があるため、キーを生成するために使用したツールをデータベースをホストしているコンピューター上で決して実行しないでください。
- 鍵管理プロセスでカラムマスター キーやカラム暗号化キーが不用意に漏れないようにするためには、鍵管理プロセスを定義し実装する前に、潜在的な敵対者やセキュリティ上の脅威を特定することが重要である。 たとえば、DBAが機密データにアクセスできないようにすることが目的なら、DBAが鍵の生成を担当することはできません。 しかし、DBAは、メタデータにプレーンテキストの鍵が含まれていないため、データベースの鍵メタデータを管理することができます。