Windows および Azure での ASP.NET Core を使用したキーのrestの暗号化
データ保護システムでは、暗号化キーをrestにどのように暗号化する必要があるかを決定するために、既定で検出メカニズムが使用されます。 開発者は検出メカニズムをオーバーライドし、restにキーを暗号化する方法を手動で指定できます。
警告
明示的なキー永続的の場所を指定した場合、データ保護システムではrestのメカニズムで既定のキー暗号化を登録解除します。 その結果、キーはrestに暗号化されなくなります。 運用展開のためには、明示的なキー暗号化メカニズムを指定することをお勧めします。 restの暗号化メカニズムのオプションについては、このトピックで説明します。
Azure Key Vault
Azure Key Vault にキーを格納するには、Startup
クラスで ProtectKeysWithAzureKeyVault を使ってシステムを構成します。
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToAzureBlobStorage(new Uri("<blobUriWithSasToken>"))
.ProtectKeysWithAzureKeyVault("<keyIdentifier>", "<clientId>", "<clientSecret>");
}
詳細については、「ASP.NET Core データ保護を構成する」の「ProtectKeysWithAzureKeyVault」を参照してください。
Windows DPAPI
Windows の展開にのみ適用されます。
Windows DPAPI が使用されている場合、キー マテリアルは CryptProtectData によって暗号化されてから、ストレージへの永続化が行われます。 DPAPI は、現在のマシンの外部で読み取られることがないデータには適切な暗号化メカニズムです (ただし、これたのキーを Active Directory にバックアップすることができます)。 restに DPAPI キー暗号化を構成するには、いずれかの ProtectKeysWithDpapi 拡張メソッドを呼び出します。
public void ConfigureServices(IServiceCollection services)
{
// Only the local user account can decrypt the keys
services.AddDataProtection()
.ProtectKeysWithDpapi();
}
パラメーターを指定せずに ProtectKeysWithDpapi
を呼び出した場合は、現在の Windows ユーザー アカウントのみが、永続化されたキー リングを解読できます。 必要に応じて、(現在のユーザー アカウントだけでなく) マシン上のすべてのユーザー アカウントがキー リングを解読できることを指定できます。
public void ConfigureServices(IServiceCollection services)
{
// All user accounts on the machine can decrypt the keys
services.AddDataProtection()
.ProtectKeysWithDpapi(protectToLocalMachine: true);
}
X.509 証明書
アプリが複数のマシンに分散配置されている場合は、共有する X.509 証明書をすべてのマシンにわたって配布し、rest のキーの暗号化にその証明書を使用するように、ホストされているアプリを構成すると便利なことがあります。
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.ProtectKeysWithCertificate("3BCE558E2AD3E0E34A7743EAB5AEA2A9BD2575A0");
}
.NET Framework の制限により、CAPI 秘密キーを持つ証明書のみがサポートされています。 これらの制限の考えられる回避策については、下記のコンテンツを参照してください。
Windows DPAPI-NG
このメカニズムは Windows 8/Windows Server 2012 以降でのみ使用できます。
Windows 8 以降の Windows OS では、DPAPI-NG (CNG DPAPI とも呼ばれます) がサポートされています。 詳細については、CNG DPAPI に関するページを参照してください。
プリンシパルは、保護記述子の規則としてエンコードされます。 ProtectKeysWithDpapiNG を呼び出す次の例では、指定した SID を持つドメイン参加済みユーザーのみがキー リングの暗号化を解除できます。
public void ConfigureServices(IServiceCollection services)
{
// Uses the descriptor rule "SID=S-1-5-21-..."
services.AddDataProtection()
.ProtectKeysWithDpapiNG("SID=S-1-5-21-...",
flags: DpapiNGProtectionDescriptorFlags.None);
}
パラメーターがない、ProtectKeysWithDpapiNG
のオーバーロードも存在します。 この便利なメソッドを使用して、"SID={CURRENT_ACCOUNT_SID}" という規則を指定します。CURRENT_ACCOUNT_SID は、現在の Windows ユーザー アカウントの SID です。
public void ConfigureServices(IServiceCollection services)
{
// Use the descriptor rule "SID={current account SID}"
services.AddDataProtection()
.ProtectKeysWithDpapiNG();
}
このシナリオでは、DPAPI-NG 操作によって使用される暗号化キーを配布する役割を担うのは AD ドメイン コントローラーです。 ターゲット ユーザーは、ドメインに参加しているマシンからの暗号化されたペイロードを解読できます (プロセスが自分のidentityで実行されている場合)。
Windows DPAPI-NG を使用した証明書ベースの暗号化
アプリが Windows 8.1/Windows Server 2012 R2 以降で実行されている場合は、Windows DPAPI-NG を使用して証明書ベースの暗号化を実行できます。 規則記述子の文字列 "CERTIFICATE = HashId:THUMBPRINT" を使用します。ここで THUMBPRINT は、16 進数でエンコードされた、証明書の SHA1 拇印です。
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.ProtectKeysWithDpapiNG("CERTIFICATE=HashId:3BCE558E2...B5AEA2A9BD2575A0",
flags: DpapiNGProtectionDescriptorFlags.None);
}
キーの暗号を解除するには、このリポジトリで指し示されているすべてのアプリが Windows 8.1/Windows Server 2012 R2 以降で実行されている必要があります。
カスタムのキー暗号化
付属のメカニズムが適切でない場合には、カスタムの IXmlEncryptor を提供することで、開発者が独自のキー暗号化メカニズムを指定できます。
ASP.NET Core