web-dev-qa-db-ja.com

ASP.net Core 2のappsettings.json内でパスワードをどのように暗号化しますか?

Appsettings.jsonを使用して「マスターパスワード」を保存したいと思います。

このマスターパスワードは、この優れたパスワードストアパッケージによって生成された秘密鍵(およびそれに続くパスワードストア)を開くために使用されます: https://github.com/neosmart/SecureStore

問題は、マスターパスワードを暗号化する方法が思いつかないことです。 .NET 4.5では、次のことが可能でした。

1)パスワードをweb.configファイルに配置します

2)次のスクリプトを実行します:aspnet_regiis.exe -pef appSettings "C:\ myfolder"

3)パスワードは最終的に暗号化されますが、プログラムによって安全に読み取られます。

https://www.codeproject.com/Articles/599416/Encrypting-ASP-NET-Application-Settings

私はこれを正しい方法で行っていますか、それともより良い方法がありますか?

3
Ryan Battistone

Webサイトにあり、通常はソース管理で保持されているメインのappsettings.jsonにシークレットを保存しないでください。ファイルプロバイダーを使用して、サーバー上の他の場所にあるファイルを見つけます。

Azureにアクセスできる場合は、appsettings.jsonの代わりに Azure Key Vault にシークレットを保存できます。

このことを念頭に置いて、JSONファイルを使用する場合は、ブリッジまたはプロキシクラスを使用して値の復号化を処理できます。

まず、値を復号化するためのクラスが必要になります。簡潔にするために、ここでは復号化クラスの詳細には触れず、SettingsDecryptorというクラスが記述されており、単一のメソッドDecryptを使用してISettingsDecryptorというインターフェイスを実装していると仮定します。文字列値を復号化します。

ブリッジクラスは2つのコンストラクターパラメーターを取ります。

  • 1つ目はIOptions<T>またはIOptionsSnapshot<T>です。ここで、Tは、appsettings.jsonのセクションがservices.Configureメソッドを介してバインドされるクラスです(例:MyAppSettings)。または、クラスにバインドしたくない場合は、代わりにIConfigurationを使用して、構成から直接読み取ることができます。
  • 2つ目は、ISettingsDecryptorを実装する復号化クラスです。

ブリッジクラスでは、復号化が必要な各プロパティは、復号化クラスを使用して、構成内の暗号化された値を復号化する必要があります。

public class MyAppSettingsBridge : IAppSettings
{
    private readonly IOptions<MyAppSettings> _appSettings;

    private readonly ISettingsDecrypt _decryptor;

    public MyAppSettingsBridge(IOptionsSnapshot<MyAppSettings> appSettings, ISettingsDecrypt decryptor) {
        _appSettings = appSettings ?? throw new ArgumentNullException(nameof(appSettings));
        _decryptor = decryptor ?? throw new ArgumentException(nameof(decryptor));
    }

    public string ApplicationName => _appSettings.Value.ApplicationName;

    public string SqlConnectionSting => _decryptor.Decrypt(_appSettings.Value.Sql);

    public string OracleConnectionSting => _decryptor.Decrypt(_appSettings.Value.Oracle);
}

DIコンテナは次のように設定する必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddOptions();            
    services.Configure<MyAppSettings>(Configuration.GetSection("MyAppSettings"));
    services.AddSingleton(Configuration);        
    services.AddSingleton<ISettingsDecrypt, SettingsDecryptor>();
    services.AddScoped<IAppSettings, MyAppSettingsBridge>();
}

コントローラは、復号化された設定にアクセスするためにブリッジをIAppSettingsとして受け取るコンストラクターを持つことができます。

上記の回答は、かなりのコードが必要なため、ソリューション全体の簡単な要約です。

完全な詳細な説明は、私のブログ投稿で見ることができます appsettings.jsonで秘密を隠す– ASP.Netコア構成でブリッジを使用する(パート4) ここでブリッジパターンの使用について詳しく説明します。 Githubの完全な例(復号化クラスを含む)も https://github.com/configureappio/ConfiguarationBridgeCrypto にあります。

1
Steve Collins

JSON構成プロバイダーは暗号化をサポートしていません。現在、暗号化された構成をサポートする、すぐに使用できるプロバイダーはAzureKeyVaultのみです。 KeyVaultは、アプリケーションが実際にAzureでホストされているかどうかに関係なく使用できます。無料ではありませんが、ほとんどのシナリオでわずかな費用しかかからない可能性があります。

とはいえ、Coreの美しさの一部は、完全にモジュール化されていることです。いつでも独自の構成プロバイダーを作成して、必要なものを実装できます。たとえば、暗号化を実際にdoesサポートするJSONプロバイダーを作成できます。

4
Chris Pratt

ASP.NET Coreの場合、最善の解決策は、アプリケーションの起動時に、復号化や文字列の置換など、構成値の変換を行うことです。これが、構成プロバイダーが存在する理由です。

構成プロバイダーを連鎖させることができます。 Microsoft.Extensions.Configurationのソースコードには、例として使用できる ChainedConfigurationProvider というクラスがあります。

public static IHostBuilder CreateHostBuilder(string[] args)
{
    return new HostBuilder()
    .ConfigureAppConfiguration((Host, config) => {

        var jsonFile = new ConfigurationBuilder();
        jsonFile.AddJsonFile("appsettings.json");
        // the json file is the source for the new configuration provider.
        config.AddConfiguration(jsonFile.Build());
    });
}

Docker SwarmまたはKubernetesを使用している場合は、appsettings.jsonファイルでパスワードを暗号化する必要はありません。ビルトイン Key-per-file構成プロバイダー またはカスタム構成プロバイダーを使用して、Dockerシークレットからパスワードを読み取り、構成値にマップできます。

私のブログ投稿で ASP.NET Core構成ファイルでパスワードを管理する方法 パスワードのみを秘密として保持し、構成文字列を更新できるカスタム構成プロバイダーを作成する方法について詳しく説明します。ランタイム。また、この記事の完全なソースコードは github.com/gabihodoroaga/blog-app-secrets でホストされています。

1

暗号化できない機密データをjsonファイルに保存する代わりに、SecretManagerツールを使用できます。これが 完全なドキュメント です。

編集:セキュリティの観点から、それは開発目的でのみ実行可能です。

0
David Szorad