ASP.NET Core のデータ保護の概要

ASP.NET Core のデータ保護には、キーの管理やローテーションなど、データを保護する暗号化 API が用意されています。

Web アプリケーションでは、セキュリティが重要なデータの格納が必要になることがよくあります。 Windows にはデータ保護 API の DPAPI が用意されていますが、Windows DPAPI は Web アプリケーションでの使用は意図されていません。

ASP.NET Core のデータ保護スタックは、ASP.NET 1.x から 4.x の <machineKey> 要素に対する長期的な置き換えとして機能するように設計されています。 これは、最新のアプリケーションで発生する可能性があるほとんどのユース ケースに対して、すぐに使用できるソリューションを提供しながら、古い暗号化スタックの多くの欠点に対処するように設計されています。

問題の説明

全体的な問題の説明は、1 つの文で簡潔に記述できます: 後で取得するために信頼できる情報を保持する必要がありますが、永続化メカニズムを信頼していません。 Web の用語では、"信頼されていないクライアント経由で信頼された状態をラウンドトリップする必要がある" と記述できます。

その典型的な例は、認証 cookie またはベアラー トークンです。 サーバーで "私は Groot で xyz アクセス許可を持っています "トークンが生成され、クライアントに渡されます。 何日かして、クライアントからサーバーにそのトークンが返されますが、サーバーでは、クライアントでトークンが偽造されていないという何らかの種類の保証が必要です。 したがって、第 1 の要件は信頼性 (または、整合性、改ざん防止) です。

永続化された状態はサーバーによって信頼されているため、この状態には運用環境に固有の情報が含まれている可能性があるものと予想します。 これは、ファイル パス、アクセス許可、ハンドルや他の間接参照、またはサーバー固有のその他のデータの形式になっている可能性があります。 通常、このような情報は、信頼されていないクライアントに公開してはなりません。 したがって、第 2 の要件は機密性です。

最後に、最新のアプリケーションはコンポーネント化されているため、個々のコンポーネントは、システム内の他のコンポーネントに関係なく、このシステムを利用することを望んでいる、ということがわかっています。 たとえば、ベアラー トークン コンポーネントでこのスタックが使用されている場合は、同じスタックを使用している可能性のあるアンチ CSRF メカニズムからの干渉なしで動作する必要があります。 したがって、最後の要件は分離性です。

要件の範囲を絞るため、さらに制約を与えることができます。 暗号システム内で動作するすべてのサービスは同じように信頼されており、直接制御しているサービスの外部でデータを生成または使用する必要はないものと想定します。 さらに、Web サービスに対する各要求は暗号システムを 1 回以上通過する可能性があるため、操作は可能な限り高速である必要があります。 これにより、このシナリオには対称暗号化が理想的であり、非対称暗号化はそれが必要になるときまで無視できます。

設計の指針

最初に、既存のスタックに関する問題を特定しました。 その後、既存のソリューションの状況を調査し、既存のソリューションには求めている機能がまったくないという結論になりました。 次に、いくつかの基本原則に基づいてソリューションを設計しました。

  • システムは、簡単に構成できる必要があります。 構成が不要で、開発者がすぐに作業に取り組めるシステムが理想的です。 開発者が特定の側面 (キー リポジトリなど) を構成する必要がある場合は、それらの特定の構成を簡単にすることを考慮する必要があります。

  • コンシューマー向けのシンプルな API を提供します。 API は、正しく使用するのは簡単で、不適切に使用するのは困難でなければなりません。

  • 開発者は、キー管理の原則を習得する必要はないはずです。 開発者の代わりに、システムによってアルゴリズムの選択とキーの有効期間が処理される必要があります。 理想的には、開発者が未加工のキー マテリアルにアクセスできないようにする必要があります。

  • 可能な場合は、保存時にキーを保護する必要があります。 システムで適切な既定の保護メカニズムを見つけて、自動的に適用する必要があります。

これらの原則を念頭に置いて、簡単で使いやすいデータ保護スタックを開発しました。

ASP.NET Core データ保護 API は、機密ペイロードを無期限に永続化させることを主な目的としていません。 Windows CNG DPAPI および Azure Rights Management などの他のテクノロジの方が、無期限のストレージのシナリオに適しています。それらのテクノロジは、それに対応した強力なキー管理機能を備えています。 とはいえ、開発者が機密データを長期的に保護するために ASP.NET Core データ保護 API を使用できないわけではありません。

対象ユーザー

データ保護システムは、5 つのメイン パッケージに分かれています。 これらの API のさまざまな側面の対象は、3 つの主要な対象ユーザーです。

  1. コンシューマー API の概要に関する記事の対象は、アプリケーションとフレームワークの開発者です。

    "スタックのしくみやその構成方法について知りたくありません。 API の使い方をほとんど間違えることなく、可能な限り単純な方法で、操作を実行したいだけです。"

  2. 構成 API の対象は、アプリケーション開発者とシステム管理者です。

    "データ保護システムに、既定以外のパスや設定が必要であることを伝える必要があります。"

  3. 拡張性 API の対象は、カスタム ポリシーの実装を担当する開発者です。 これらの API の使用は、まれな状況と、経験が豊富でセキュリティを認識している開発者に限定されます。

    "本当に独特な動作要件があるため、システム内のコンポーネント全体を置き換える必要があります。 要件を満たすプラグインを構築するため、API サーフェイスの一般的に使用されない部分について学習しようと思っています。"

パッケージのレイアウト

データ保護スタックは、5 つのパッケージで構成されます。

  • Microsoft.AspNetCore.DataProtection.Abstractions には、データ保護サービスを作成するための IDataProtectionProvider インターフェイスと IDataProtector インターフェイスが含まれています。 また、これらの型を操作するための便利な拡張メソッドも含まれています (たとえば、IDataProtector)。 データ保護システムが他の場所でインスタンス化されており、その API を使用している場合は、Microsoft.AspNetCore.DataProtection.Abstractions を参照してください。

  • Microsoft.AspNetCore.DataProtection には、データ保護システムのコア実装が含まれています。これには、主要な暗号化操作、キー管理、構成、拡張機能が含まれます。 データ保護システムのインスタンス化 (たとえば、IServiceCollection への追加)、またはその動作の変更や拡張については、Microsoft.AspNetCore.DataProtection を参照してください。

  • 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 でパスワードをハッシュする」を参照してください。

その他のリソース