作成者: Rick Anderson
キーの管理
アプリにより、その運用環境の検出とキー構成の処理が独自に試行されます。
アプリが Azure Apps でホストされている場合、キーは %HOME%\ASP.NET\DataProtection-Keys フォルダーに保持されます。 このフォルダーはネットワーク ストレージにバックアップされ、アプリをホストしているすべてのマシンで同期されています。
- 保存中のキーは保護されていません。
- DataProtection-Keys フォルダーから、単一のデプロイ スロットのアプリのすべてのインスタンスにキー リングが提供されます。
- ステージングや運用などの別のデプロイ スロットでは、キー リングが共有されません。 ステージングから運用へのスワップや A/B テストの使用など、デプロイ スロットをスワップすると、データ保護を使っているアプリからは、前のスロット内のキー リングを使って格納されたデータを復号化できなくなります。 その結果、標準の ASP.NET Core cookie 認証を使うアプリでは、データ保護を使って Cookie が保護しているため、ユーザーがログアウトされます。 スロットに依存しないキー リングが必要な場合は、Azure Blob Storage、Azure Key Vault、SQL ストア、Redis キャッシュなどの外部キー リング プロバイダーを使います。
ユーザー プロファイルを使用できる場合、キーは %LOCALAPPDATA%ASP.NET\DataProtection-Keys フォルダーに保持されます。 オペレーティング システムが Windows の場合、キーは DPAPI を使用して保存時に暗号化されます。
アプリ プールの setProfileEnvironment 属性も有効にする必要があります。
setProfileEnvironmentの既定値はtrueです。 一部のシナリオ (たとえば、Windows OS) では、setProfileEnvironmentはfalseに設定されます。 キーが期待どおりにユーザー プロファイル ディレクトリに格納されていない場合:- %windir%/system32/inetsrv/config フォルダーに移動します。
- applicationHost.config ファイルを開きます。
-
<system.applicationHost><applicationPools><applicationPoolDefaults><processModel>要素を見つけます。 -
setProfileEnvironment属性 (その規定値はtrueです) が存在しないことを確認するか、属性の値を明示的にtrueに設定します。
アプリが IIS でホストされている場合、HKLM レジストリ内の、ワーカー プロセス アカウントにのみ ACL が設定されている特別なレジストリ キーにキーが保持されます。 キーは DPAPI を使用して保存時に暗号化されます。
これらの条件のいずれにも該当しない場合、キーは現在のプロセスの外部には保持されません。 プロセスがシャットダウンすると、生成されたキーはすべて失われます。
開発者は常にフル コントロール状態であり、キーの格納方法と場所をオーバーライドすることができます。 上記の最初の 3 つのオプションは、これまでの ASP.NET <machineKey> の自動生成ルーチンのしくみと同様に、ほとんどのアプリに適した既定として利用できます。 最後のフォールバック オプションは、開発者がキーの保持が必要な場合に事前に構成を指定する必要がある唯一のシナリオですが、まれな状況でのみ、このフォールバックが発生します。
Docker コンテナーでホストする場合、キーは Docker ボリューム (共有ボリュームまたはコンテナーの有効期間を超えて保持されるホスト マウント ボリューム) のフォルダーか、Azure Key Vault や Redis などの外部プロバイダーに保持する必要があります。 外部プロバイダーは、アプリから共有ネットワーク ボリュームにアクセスできない場合の Web ファームのシナリオでも役に立ちます (詳細については、PersistKeysToFileSystem に関するページを参照してください)。
警告
開発者が上記の規則をオーバーライドし、データ保護システムを特定のキー リポジトリにポイントした場合、保存時のキーの自動暗号化は無効になります。 保存時の保護は構成を介して再び有効にすることができます。
キーの有効期間
キーの有効期間は既定で 90 日です。 キーの有効期限が切れると、アプリによって自動的に新しいキーが生成され、その新しいキーがアクティブ キーとして設定されます。 廃止されたキーがシステムに残っている限り、そのキーで保護されたデータをアプリから復号化できます。 詳細については、キー管理に関するページを参照してください。
既定のアルゴリズム
既定で使われるペイロード保護アルゴリズムは、機密性には AES-256-CBC、信頼性には HMACSHA256 です。 90 日ごとに変更される 512 ビットのマスター キーは、ペイロードごとにこれらのアルゴリズムに使われる 2 つのサブキーを派生させるために使われます。 詳細については、サブキーの派生に関するページを参照してください。
キーを削除する
キーを削除すると、保護されたデータに永久にアクセスできなくなります。 このリスクを軽減するには、キーを削除しないことをお勧めします。 結果として得られるキーの蓄積はサイズが小さいため、通常、その影響は最小限に抑えられます。 非常に長時間実行されるサービスなど例外的な場合は、キーを削除できます。 次に該当するキーのにを削除します。
- 古い (現在は使われていない) もの。
- ストレージの節約と引き換えに、データ損失のリスクを受け入れることができる場合。
データ保護キーを削除しないことをお勧めします。
using Microsoft.AspNetCore.DataProtection.KeyManagement;
var services = new ServiceCollection();
services.AddDataProtection();
var serviceProvider = services.BuildServiceProvider();
var keyManager = serviceProvider.GetService<IKeyManager>();
if (keyManager is IDeletableKeyManager deletableKeyManager)
{
var utcNow = DateTimeOffset.UtcNow;
var yearAgo = utcNow.AddYears(-1);
if (!deletableKeyManager.DeleteKeys(key => key.ExpirationDate < yearAgo))
{
Console.WriteLine("Failed to delete keys.");
}
else
{
Console.WriteLine("Old keys deleted successfully.");
}
}
else
{
Console.WriteLine("Key manager does not support deletion.");
}
その他のリソース
キーの管理
アプリにより、その運用環境の検出とキー構成の処理が独自に試行されます。
アプリが Azure Apps でホストされている場合、キーは %HOME%\ASP.NET\DataProtection-Keys フォルダーに保持されます。 このフォルダーはネットワーク ストレージにバックアップされ、アプリをホストしているすべてのマシンで同期されています。
- 保存中のキーは保護されていません。
- DataProtection-Keys フォルダーから、単一のデプロイ スロットのアプリのすべてのインスタンスにキー リングが提供されます。
- ステージングや運用などの別のデプロイ スロットでは、キー リングが共有されません。 ステージングから運用へのスワップや A/B テストの使用など、デプロイ スロットをスワップすると、データ保護を使っているアプリからは、前のスロット内のキー リングを使って格納されたデータを復号化できなくなります。 その結果、標準の ASP.NET Core cookie 認証を使うアプリでは、データ保護を使って Cookie が保護しているため、ユーザーがログアウトされます。 スロットに依存しないキー リングが必要な場合は、Azure Blob Storage、Azure Key Vault、SQL ストア、Redis キャッシュなどの外部キー リング プロバイダーを使います。
ユーザー プロファイルを使用できる場合、キーは %LOCALAPPDATA%ASP.NET\DataProtection-Keys フォルダーに保持されます。 オペレーティング システムが Windows の場合、キーは DPAPI を使用して保存時に暗号化されます。
アプリ プールの setProfileEnvironment 属性も有効にする必要があります。
setProfileEnvironmentの既定値はtrueです。 一部のシナリオ (たとえば、Windows OS) では、setProfileEnvironmentはfalseに設定されます。 キーが期待どおりにユーザー プロファイル ディレクトリに格納されていない場合:- %windir%/system32/inetsrv/config フォルダーに移動します。
- applicationHost.config ファイルを開きます。
-
<system.applicationHost><applicationPools><applicationPoolDefaults><processModel>要素を見つけます。 -
setProfileEnvironment属性 (その規定値はtrueです) が存在しないことを確認するか、属性の値を明示的にtrueに設定します。
アプリが IIS でホストされている場合、HKLM レジストリ内の、ワーカー プロセス アカウントにのみ ACL が設定されている特別なレジストリ キーにキーが保持されます。 キーは DPAPI を使用して保存時に暗号化されます。
これらの条件のいずれにも該当しない場合、キーは現在のプロセスの外部には保持されません。 プロセスがシャットダウンすると、生成されたキーはすべて失われます。
開発者は常にフル コントロール状態であり、キーの格納方法と場所をオーバーライドすることができます。 上記の最初の 3 つのオプションは、これまでの ASP.NET <machineKey> の自動生成ルーチンのしくみと同様に、ほとんどのアプリに適した既定として利用できます。 最後のフォールバック オプションは、開発者がキーの保持が必要な場合に事前に構成を指定する必要がある唯一のシナリオですが、まれな状況でのみ、このフォールバックが発生します。
Docker コンテナーでホストする場合、キーは Docker ボリューム (共有ボリュームまたはコンテナーの有効期間を超えて保持されるホスト マウント ボリューム) のフォルダーか、Azure Key Vault や Redis などの外部プロバイダーに保持する必要があります。 外部プロバイダーは、アプリから共有ネットワーク ボリュームにアクセスできない場合の Web ファームのシナリオでも役に立ちます (詳細については、PersistKeysToFileSystem に関するページを参照してください)。
警告
開発者が上記の規則をオーバーライドし、データ保護システムを特定のキー リポジトリにポイントした場合、保存時のキーの自動暗号化は無効になります。 保存時の保護は構成を介して再び有効にすることができます。
キーの有効期間
キーの有効期間は既定で 90 日です。 キーの有効期限が切れると、アプリによって自動的に新しいキーが生成され、その新しいキーがアクティブ キーとして設定されます。 廃止されたキーがシステムに残っている限り、そのキーで保護されたデータをアプリから復号化できます。 詳細については、キー管理に関するページを参照してください。
既定のアルゴリズム
既定で使われるペイロード保護アルゴリズムは、機密性には AES-256-CBC、信頼性には HMACSHA256 です。 90 日ごとに変更される 512 ビットのマスター キーは、ペイロードごとにこれらのアルゴリズムに使われる 2 つのサブキーを派生させるために使われます。 詳細については、サブキーの派生に関するページを参照してください。
その他のリソース
ASP.NET Core