データ保護の ASP.NET CoreASP.NET Core Data Protection

多くの場合、Web アプリケーションは、セキュリティを重視するデータを格納する必要があります。Web applications often need to store security-sensitive data. Windows では、デスクトップアプリケーション用に DPAPI が提供されていますが、これは web アプリケーションには適していません。Windows provides DPAPI for desktop applications but this is unsuitable for web applications. ASP.NET Core データ保護スタックは、開発者がキーの管理やローテーションなどのデータを保護するために使用できる、シンプルで使いやすい暗号化 API を提供します。The ASP.NET Core data protection stack provide a simple, easy to use cryptographic API a developer can use to protect data, including key management and rotation.

ASP.NET Core データ保護スタックは、 < > ASP.NET 1.x-4.X の machineKey 要素の長期的な置換として機能するように設計されています。The ASP.NET Core data protection stack is designed to serve as the long-term replacement for the <machineKey> element in ASP.NET 1.x - 4.x. これは、古い暗号化スタックの多くの欠点に対処するように設計されており、最新のアプリケーションが発生する可能性のあるほとんどのユースケースに対して、すぐに使用できるソリューションを提供しています。It was designed to address many of the shortcomings of the old cryptographic stack while providing an out-of-the-box solution for the majority of use cases modern applications are likely to encounter.

問題の説明Problem statement

全体的な問題の説明は、1つの文で簡潔に記述できます。後で取得するために信頼できる情報を保持する必要がありますが、永続化メカニズムを信頼していません。The overall problem statement can be succinctly stated in a single sentence: I need to persist trusted information for later retrieval, but I don't trust the persistence mechanism. Web 用語では、"信頼された状態を信頼されていないクライアント経由でラウンドトリップする必要がある" として記述されている可能性があります。In web terms, this might be written as "I need to round-trip trusted state via an untrusted client."

この例では、認証またはベアラートークンが使用されてい cookie ます。The canonical example of this is an authentication cookie or bearer token. サーバーは "I am Groot と" xyz アクセス許可 "トークンを生成し、クライアントに渡します。The server generates an "I am Groot and have xyz permissions" token and hands it to the client. 将来の日付では、クライアントはそのトークンをサーバーに返しますが、サーバーでは、クライアントがトークンを偽造していないことを保証する必要があります。At some future date the client will present that token back to the server, but the server needs some kind of assurance that the client hasn't forged the token. そのため、最初の要件: 信頼性 (Thus the first requirement: authenticity (a.k.a. 整合性、改ざん防止)。integrity, tamper-proofing).

永続化された状態はサーバーによって信頼されているため、この状態には、オペレーティング環境に固有の情報が含まれている可能性があります。Since the persisted state is trusted by the server, we anticipate that this state might contain information that's specific to the operating environment. ファイルパス、アクセス許可、ハンドルまたはその他の間接参照、またはサーバー固有のその他のデータの形式を使用できます。This could be in the form of a file path, a permission, a handle or other indirect reference, or some other piece of server-specific data. 通常、このような情報は、信頼されていないクライアントに公開することはできません。Such information should generally not be disclosed to an untrusted client. そのため、2番目の要件は機密性です。Thus the second requirement: confidentiality.

最後に、最新のアプリケーションがコンポーネント化されているため、システム内の他のコンポーネントに関係なく、個々のコンポーネントでこのシステムを利用することが求められています。Finally, since modern applications are componentized, what we've seen is that individual components will want to take advantage of this system without regard to other components in the system. たとえば、ベアラートークンコンポーネントがこのスタックを使用している場合は、同じスタックを使用している可能性のある CSRF メカニズムからの干渉なしで動作する必要があります。For instance, if a bearer token component is using this stack, it should operate without interference from an anti-CSRF mechanism that might also be using the same stack. そのため、最終的な要件は分離です。Thus the final requirement: isolation.

要件の範囲を絞るために、さらに制約を与えることができます。We can provide further constraints in order to narrow the scope of our requirements. ここでは、cryptosystem 内で動作するすべてのサービスが同じように信頼されており、直接制御しているサービスの外部でデータを生成または使用する必要がないことを想定しています。We assume that all services operating within the cryptosystem are equally trusted and that the data doesn't need to be generated or consumed outside of the services under our direct control. さらに、web サービスに対する各要求が cryptosystem を1回以上通過する可能性があるため、可能な限り高速操作を行う必要があります。Furthermore, we require that operations are as fast as possible since each request to the web service might go through the cryptosystem one or more times. これにより、対称暗号化がシナリオに適したものになるため、必要な時間まで非対称暗号化を割引できます。This makes symmetric cryptography ideal for our scenario, and we can discount asymmetric cryptography until such a time that it's needed.

設計思想Design philosophy

まず、既存のスタックに関する問題を特定しました。We started by identifying problems with the existing stack. これを行った後は、既存のソリューションのランドスケープを調査し、既存のソリューションには、お探しの機能がまったくないという結論を与えました。Once we had that, we surveyed the landscape of existing solutions and concluded that no existing solution quite had the capabilities we sought. 次に、いくつかの基本原則に基づいてソリューションを設計しています。We then engineered a solution based on several guiding principles.

  • システムは、構成を簡単にする必要があります。The system should offer simplicity of configuration. 理想的には、システムがゼロ構成であり、開発者が実行を開始する可能性があります。Ideally the system would be zero-configuration and developers could hit the ground running. 開発者が特定の側面 (キーリポジトリなど) を構成する必要がある場合は、これらの特定の構成を単純にすることを考慮する必要があります。In situations where developers need to configure a specific aspect (such as the key repository), consideration should be given to making those specific configurations simple.

  • コンシューマー向けのシンプルな API を提供します。Offer a simple consumer-facing API. Api は、正しく使用するのが簡単で、不適切に使用するのは困難です。The APIs should be easy to use correctly and difficult to use incorrectly.

  • 開発者は、キー管理の原則を習得するべきではありません。Developers shouldn't learn key management principles. システムは、開発者の代わりに、アルゴリズムの選択とキーの有効期間を処理する必要があります。The system should handle algorithm selection and key lifetime on the developer's behalf. 理想的には、開発者が未加工のキーマテリアルにアクセスできないようにする必要があります。Ideally the developer should never even have access to the raw key material.

  • 可能な場合は、保存時にキーを保護する必要があります。Keys should be protected at rest when possible. システムは、適切な既定の保護メカニズムを見つけて、自動的に適用する必要があります。The system should figure out an appropriate default protection mechanism and apply it automatically.

これらの原則を念頭に置いて、シンプルで使い やすい データ保護スタックを開発しました。With these principles in mind we developed a simple, easy to use data protection stack.

ASP.NET Core データ保護 Api は、主に機密ペイロードの永続的な永続化のためのものではありません。The ASP.NET Core data protection APIs are not primarily intended for indefinite persistence of confidential payloads. WINDOWS CNG DPAPIAzure Rights Managementなどのその他のテクノロジは、無期限のストレージのシナリオに適しています。また、強力なキー管理機能も備えています。Other technologies like Windows CNG DPAPI and Azure Rights Management are more suited to the scenario of indefinite storage, and they have correspondingly strong key management capabilities. ただし、社外秘データの長期的な保護には、ASP.NET Core データ保護 Api を使用した開発者の禁止はありません。That said, there's nothing prohibiting a developer from using the ASP.NET Core data protection APIs for long-term protection of confidential data.

対象ユーザーAudience

データ保護システムは、5つのメインパッケージに分割されています。The data protection system is divided into five main packages. これらの Api のさまざまな側面は、3つの主要な対象ユーザーを対象とします。Various aspects of these APIs target three main audiences;

  1. コンシューマー api の概要については、アプリケーションとフレームワークの開発者を対象としています。The Consumer APIs Overview target application and framework developers.

    「スタックの動作方法や構成方法について知りたくありません。"I don't want to learn about how the stack operates or about how it's configured. 単に、Api を正常に使用できる確率で、可能な限り単純な方法で操作を実行したいと考えています。」I simply want to perform some operation in as simple a manner as possible with high probability of using the APIs successfully."

  2. 構成 apiは、アプリケーション開発者とシステム管理者を対象としています。The configuration APIs target application developers and system administrators.

    「データ保護システムに、既定以外のパスや設定が必要であることを知らせる必要があります。」"I need to tell the data protection system that my environment requires non-default paths or settings."

  3. 拡張 Api は、カスタムポリシーの実装を担当する開発者を対象としています。The extensibility APIs target developers in charge of implementing custom policy. これらの Api の使用は、まれな状況や経験豊富な開発者に限定されます。Usage of these APIs would be limited to rare situations and experienced, security aware developers.

    「システム内のコンポーネント全体を置き換える必要があります。これは、本当に独特な行動要件があるためです。"I need to replace an entire component within the system because I have truly unique behavioral requirements. 要件を満たすプラグインを構築するために、API サーフェイスの一般的に使用されない部分について学習します。I am willing to learn uncommonly-used parts of the API surface in order to build a plugin that fulfills my requirements."

パッケージのレイアウトPackage layout

データ保護スタックは、5つのパッケージで構成されます。The data protection stack consists of five packages.

  • AspNetCore には、 IDataProtectionProvider IDataProtector データ保護サービスを作成するためのインターフェイスとインターフェイスが含まれています。Microsoft.AspNetCore.DataProtection.Abstractions contains the IDataProtectionProvider and IDataProtector interfaces to create data protection services. また、これらの型を操作するための便利な拡張メソッドも含まれています (たとえば、 IDataProtector)。It also contains useful extension methods for working with these types (for example, IDataProtector.Protect). データ保護システムが他の場所でインスタンス化されており、API を使用している場合は、「」を参照 Microsoft.AspNetCore.DataProtection.Abstractions してください。If the data protection system is instantiated elsewhere and you're consuming the API, reference Microsoft.AspNetCore.DataProtection.Abstractions.

  • AspNetCore には、データ保護システムのコア実装が含まれています。これには、主要な暗号化操作、キー管理、構成、および拡張機能が含まれます。Microsoft.AspNetCore.DataProtection contains the core implementation of the data protection system, including core cryptographic operations, key management, configuration, and extensibility. データ保護システムをインスタンス化する (たとえば、に追加する IServiceCollection )、その動作を変更または拡張するには、「」を参照 Microsoft.AspNetCore.DataProtection してください。To instantiate the data protection system (for example, adding it to an IServiceCollection) or modifying or extending its behavior, reference Microsoft.AspNetCore.DataProtection.

  • AspNetCore には、開発者が役に立つがコアパッケージに属さない追加の api が含まれています。Microsoft.AspNetCore.DataProtection.Extensions contains additional APIs which developers might find useful but which don't belong in the core package. たとえば、このパッケージには、データ保護システムをインスタンス化して、依存関係を挿入せずにファイルシステム上の場所にキーを格納するファクトリメソッドが含まれています (「」を参照してください DataProtectionProvider )。For instance, this package contains factory methods to instantiate the data protection system to store keys at a location on the file system without dependency injection (see DataProtectionProvider). また、保護されたペイロードの有効期間を制限するための拡張メソッドも含まれています (を参照してください ITimeLimitedDataProtector )。It also contains extension methods for limiting the lifetime of protected payloads (see ITimeLimitedDataProtector).

  • Microsoft.AspNetCore.DataProtection.SystemWeb を既存の ASP.NET 4.x アプリにインストールして、 <machineKey> 新しい ASP.NET Core データ保護スタックを使用するように操作をリダイレクトすることができます。Microsoft.AspNetCore.DataProtection.SystemWeb can be installed into an existing ASP.NET 4.x app to redirect its <machineKey> operations to use the new ASP.NET Core data protection stack. 詳細については、「ASP.NET Core の ASP.NET machineKey を置き換える」を参照してください。For more information, see ASP.NET Core の ASP.NET machineKey を置き換える.

  • AspNetCore は、PBKDF2 パスワードハッシュルーチンの実装を提供し、ユーザーパスワードを安全に処理する必要があるシステムで使用できます。Microsoft.AspNetCore.Cryptography.KeyDerivation provides an implementation of the PBKDF2 password hashing routine and can be used by systems that must handle user passwords securely. 詳細については、「ASP.NET Core でのパスワードのハッシュ」を参照してください。For more information, see ASP.NET Core でのパスワードのハッシュ.

その他の技術情報Additional resources

Web ファームでの ASP.NET Core のホスト