ASP.NET Core のデータ保護の概要
ASP.NET Core には、キーの管理やローテーションなど、データを保護する暗号化 API が用意されています。
Web アプリは、多くの場合、機密データを格納する必要があります。 Windows データ保護 API (DPAPI) は、Web アプリでの使用を目的としていません。
ASP.NET Core データ保護スタックは、次の目的で設計されました。
- ほとんどの Web シナリオ用に組み込みのソリューションを提供する。
- 以前の暗号化システムの多くの欠陥に対処する。
- ASP.NET 1.x から 4.x での
<machineKey>
要素の代替として機能する。
問題の説明
後で取得するために信頼できる情報を保持する必要がありますが、永続化メカニズムを信頼していません。 Web の用語では、"信頼されていないクライアント経由で信頼された状態をラウンドトリップする必要がある" と記述できます。
信頼性、整合性、改ざん防止が必要です。 その典型的な例は、認証 cookie またはベアラー トークンです。 サーバーで "私は Groot で xyz アクセス許可を持っています" トークンが生成され、クライアントに送信されます。 クライアントからサーバーにそのトークンが返されますが、サーバーでは、クライアントでトークンが偽造されていないという何らかの種類の保証が必要です。
機密性が必要です。 永続化された状態はサーバーによって信頼されているため、この状態には、信頼されていないクライアントに公開すべきではない情報が含まれている可能性があります。 次に例を示します。
- ファイル パス。
- アクセス許可。
- ハンドルまたはその他の間接参照。
- 一部のサーバー固有のデータ。
分離が必要です。 最新のアプリはコンポーネント化されているため、個々のコンポーネントは、システム内の他のコンポーネントに関係なく、このシステムを利用することができます。 たとえば、このスタックを使用するベアラー トークン コンポーネントについて考えてみましょう。 これは、たとえば、同じスタックを使用する CSRF 対策メカニズムからの何の干渉もなく動作する必要があります。
一般的な想定によっては、要件の範囲を絞り込むことができます。
- 暗号システム内で動作するすべてのサービスは平等に信頼されます。
- 直接制御しているサービスの外部でデータを生成または使用する必要がありません。
- Web サービスに対する各要求は暗号システムを 1 回以上通過する可能性があるため、操作は高速である必要があります。 速度要件により、対称暗号化が理想的です。 非対称暗号化は、必要になるまで使用されません。
設計の指針
ASP.NET Core データ保護は、使いやすいデータ保護スタックです。 このネットワークは次の原則に基づいています。
- 構成の容易さ。 システムは、ゼロ構成を目指しています。 開発者が特定の側面 (キー リポジトリなど) を構成する必要があっても、それらの特定の構成は難しくありません。
- コンシューマー向けの基本的な API を提供します。 API は簡単に適切に使用でき、不適切に使用しづらくなっています。
- 開発者は、キー管理の原則を習得する必要はありません。 開発者の代わりに、システムによってアルゴリズムの選択とキーの有効期間が処理されます。 開発者は、未加工のキー マテリアルにアクセスできません。
- キーは可能な限り rest 時に保護されます。 システムにより適切な既定の保護メカニズムが検出され、自動的に適用されます。
データ保護 API は、機密ペイロードを無期限に永続化させることを主な目的としていません。 Windows CNG DPAPI、Azure Rights Management などの他のテクノロジの方が、無期限のストレージのシナリオに適しています。 それらは、それに対応した強力なキー管理機能を備えています。 とは言え、ASP.NET Core データ保護 API は、機密データを長期的に保護するために使用できます。
対象者
データ保護システムには、主に次の 3 種類のユーザーを対象とする API が用意されています。
コンシューマー API は、アプリケーション開発者やフレームワーク開発者を対象としています。
スタックがどのように動作し、それがどのように構成されているのかについて知りたいとは思いません。 API の使い方をほとんど間違えることなく、操作を実行したいだけです。
構成 API は、アプリ開発者やシステム管理者を対象としています。
データ保護システムに、自身の環境では、既定以外のパスや設定が必要であることを伝える必要があります。
拡張性 API の対象は、カスタム ポリシーの実装を担当する開発者です。 これらの API の使用は、まれな状況と、セキュリティ経験のある開発者に限定されます。
本当に独特な動作要件があるため、システム内のコンポーネント全体を置き換える必要があります。 要件を満たすプラグインを構築するため、API サーフェイスの一般的に使用されない部分について学習しようと思っています。
パッケージのレイアウト
データ保護スタックは、5 つのパッケージで構成されます。
Microsoft.AspNetCore.DataProtection.Abstractions には、次のものが含まれます。
- データ保護サービスを作成するための IDataProtectionProvider インターフェイスと IDataProtector インターフェイス。
- これらのタイプに対して機能する拡張メソッド。 たとえば、IDataProtector.Protect など
データ保護システムが他の場所でインスタンス化されており、その API を使用している場合は、
Microsoft.AspNetCore.DataProtection.Abstractions
を参照してください。Microsoft.AspNetCore.DataProtection には、次のような、データ保護システムのコア実装が含まれています。
- コア暗号化操作。
- キー管理。
- 構成と拡張性。
データ保護システムをインスタンス化するには、
Microsoft.AspNetCore.DataProtection
を参照してください。 次の場合に、データ保護システムを参照することが必要になる場合があります。- それを IServiceCollection に追加する場合
- その動作を変更または拡張する場合
Microsoft.AspNetCore.DataProtection.Extensions には、開発者にとって役に立つかもしれませんがコア パッケージには属さない追加の API が含まれています。 たとえば、このパッケージには次のものが含まれます。
- 依存関係を挿入せずにファイル システム上の場所にキーを格納するためにデータ保護システムをインスタンス化するファクトリ メソッド。 以下を参照してください。DataProtectionProvider
- 保護されたペイロードの有効期間を制限するための拡張メソッド。 以下を参照してください。ITimeLimitedDataProtector
Microsoft.AspNetCore.DataProtection.SystemWeb を既存の ASP.NET 4.x アプリにインストールすると、その
<machineKey>
操作をリダイレクトして、新しい ASP.NET Core データ保護スタックを使用することができます。 詳細については、「ASP.NET Core での ASP.NET machineKey の置換」を参照してください。Microsoft.AspNetCore.Cryptography.KeyDerivation では PBKDF2 パスワード ハッシュ ルーチンの実装が提供され、ユーザー パスワードを安全に処理する必要があるシステムで使用できます。 詳細については、「ASP.NET Core でパスワードをハッシュする」を参照してください。
その他のリソース
ASP.NET Core には、キーの管理やローテーションなど、データを保護する暗号化 API が用意されています。
Web アプリは、多くの場合、機密データを格納する必要があります。 Windows データ保護 API (DPAPI) は、Web アプリでの使用を目的としていません。
ASP.NET Core データ保護スタックは、次の目的で設計されました。
- ほとんどの Web シナリオ用に組み込みのソリューションを提供する。
- 以前の暗号化システムの多くの欠陥に対処する。
- ASP.NET 1.x から 4.x での
<machineKey>
要素の代替として機能する。
問題の説明
後で取得するために信頼できる情報を保持する必要がありますが、永続化メカニズムを信頼していません。 Web の用語では、"信頼されていないクライアント経由で信頼された状態をラウンドトリップする必要がある" と記述できます。
信頼性、整合性、改ざん防止が必要です。 その典型的な例は、認証 cookie またはベアラー トークンです。 サーバーで "私は Groot で xyz アクセス許可を持っています" トークンが生成され、クライアントに送信されます。 クライアントからサーバーにそのトークンが返されますが、サーバーでは、クライアントでトークンが偽造されていないという何らかの種類の保証が必要です。
機密性が必要です。 永続化された状態はサーバーによって信頼されているため、この状態には、信頼されていないクライアントに公開すべきではない情報が含まれている可能性があります。 次に例を示します。
- ファイル パス。
- アクセス許可。
- ハンドルまたはその他の間接参照。
- 一部のサーバー固有のデータ。
分離が必要です。 最新のアプリはコンポーネント化されているため、個々のコンポーネントは、システム内の他のコンポーネントに関係なく、このシステムを利用することができます。 たとえば、このスタックを使用するベアラー トークン コンポーネントについて考えてみましょう。 これは、たとえば、同じスタックを使用する CSRF 対策メカニズムからの何の干渉もなく動作する必要があります。
一般的な想定によっては、要件の範囲を絞り込むことができます。
- 暗号システム内で動作するすべてのサービスは平等に信頼されます。
- 直接制御しているサービスの外部でデータを生成または使用する必要がありません。
- Web サービスに対する各要求は暗号システムを 1 回以上通過する可能性があるため、操作は高速である必要があります。 速度要件により、対称暗号化が理想的です。 非対称暗号化は、必要になるまで使用されません。
設計の指針
ASP.NET Core データ保護は、使いやすいデータ保護スタックです。 このネットワークは次の原則に基づいています。
- 構成の容易さ。 システムは、ゼロ構成を目指しています。 開発者が特定の側面 (キー リポジトリなど) を構成する必要があっても、それらの特定の構成は難しくありません。
- コンシューマー向けの基本的な API を提供します。 API は簡単に適切に使用でき、不適切に使用しづらくなっています。
- 開発者は、キー管理の原則を習得する必要はありません。 開発者の代わりに、システムによってアルゴリズムの選択とキーの有効期間が処理されます。 開発者は、未加工のキー マテリアルにアクセスできません。
- キーは可能な限り rest 時に保護されます。 システムにより適切な既定の保護メカニズムが検出され、自動的に適用されます。
データ保護 API は、機密ペイロードを無期限に永続化させることを主な目的としていません。 Windows CNG DPAPI、Azure Rights Management などの他のテクノロジの方が、無期限のストレージのシナリオに適しています。 それらは、それに対応した強力なキー管理機能を備えています。 とは言え、ASP.NET Core データ保護 API は、機密データを長期的に保護するために使用できます。
対象者
データ保護システムには、主に次の 3 種類のユーザーを対象とする API が用意されています。
コンシューマー API は、アプリケーション開発者やフレームワーク開発者を対象としています。
スタックがどのように動作し、それがどのように構成されているのかについて知りたいとは思いません。 API の使い方をほとんど間違えることなく、操作を実行したいだけです。
構成 API は、アプリ開発者やシステム管理者を対象としています。
データ保護システムに、自身の環境では、既定以外のパスや設定が必要であることを伝える必要があります。
拡張性 API の対象は、カスタム ポリシーの実装を担当する開発者です。 これらの API の使用は、まれな状況と、セキュリティ経験のある開発者に限定されます。
本当に独特な動作要件があるため、システム内のコンポーネント全体を置き換える必要があります。 要件を満たすプラグインを構築するため、API サーフェイスの一般的に使用されない部分について学習しようと思っています。
パッケージのレイアウト
データ保護スタックは、5 つのパッケージで構成されます。
Microsoft.AspNetCore.DataProtection.Abstractions には、次のものが含まれます。
- データ保護サービスを作成するための IDataProtectionProvider インターフェイスと IDataProtector インターフェイス。
- これらのタイプに対して機能する拡張メソッド。 たとえば、IDataProtector.Protect など
データ保護システムが他の場所でインスタンス化されており、その API を使用している場合は、
Microsoft.AspNetCore.DataProtection.Abstractions
を参照してください。Microsoft.AspNetCore.DataProtection には、次のような、データ保護システムのコア実装が含まれています。
- コア暗号化操作。
- キー管理。
- 構成と拡張性。
データ保護システムをインスタンス化するには、
Microsoft.AspNetCore.DataProtection
を参照してください。 次の場合に、データ保護システムを参照することが必要になる場合があります。- それを IServiceCollection に追加する場合
- その動作を変更または拡張する場合
Microsoft.AspNetCore.DataProtection.Extensions には、開発者にとって役に立つかもしれませんがコア パッケージには属さない追加の API が含まれています。 たとえば、このパッケージには次のものが含まれます。
- 依存関係を挿入せずにファイル システム上の場所にキーを格納するためにデータ保護システムをインスタンス化するファクトリ メソッド。 以下を参照してください。DataProtectionProvider
- 保護されたペイロードの有効期間を制限するための拡張メソッド。 以下を参照してください。ITimeLimitedDataProtector
Microsoft.AspNetCore.DataProtection.SystemWeb を既存の ASP.NET 4.x アプリにインストールすると、その
<machineKey>
操作をリダイレクトして、新しい ASP.NET Core データ保護スタックを使用することができます。 詳細については、「ASP.NET Core での ASP.NET machineKey の置換」を参照してください。Microsoft.AspNetCore.Cryptography.KeyDerivation では PBKDF2 パスワード ハッシュ ルーチンの実装が提供され、ユーザー パスワードを安全に処理する必要があるシステムで使用できます。 詳細については、「ASP.NET Core でパスワードをハッシュする」を参照してください。
その他のリソース
ASP.NET Core