次の方法で共有


開発時にアプリケーションのシークレットを安全に格納する

ヒント

このコンテンツは eBook の「コンテナー化された .NET アプリケーションの .NET マイクロサービス アーキテクチャ」からの抜粋です。.NET Docs で閲覧できるほか、PDF として無料ダウンロードすると、オンラインで閲覧できます。

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

保護されたリソースおよびその他のサービスに接続する場合、ASP.NET Core アプリケーションは、通常、接続文字列やパスワードなど、機密情報を含む資格情報を使用する必要があります。 このような機密情報は、"シークレット" と呼ばれます。 ソース コードにシークレットを含めないこと、さらに決してソース管理にシークレットを格納しないことがベスト プラクティスです。 ASP.NET Core 構成モデルを使用して、安全な場所からシークレットを読み取る必要があります。

開発リソースおよびステージング リソースにアクセスするためのシークレットは、運用環境のリソースにアクセスするために使用するシークレットとは区別する必要があります。さまざまな人が、そのようなさまざまなシークレット セットへのアクセスを必要とするからです。 開発時に使用するシークレットを格納するには、環境変数にシークレットを格納するか、または ASP.NET Core Secret Manager ツールを使用してシークレットを格納する方法が一般的です。 運用環境でのストレージの安全性を高めるには、マイクロサービスで Azure Key Vault にシークレットを格納することができます。

環境変数にシークレットを格納する

ソース コードの外部にシークレットを保持する方法の 1 つは、開発者用が開発用コンピューター上で文字列ベースのシークレットを環境変数として設定するというものです。 環境変数を使用して、階層型の名前 (構成セクションで入れ子にされている名前など) を付けてシークレットを格納する場合は、そのセクションの完全な階層をコロン (:) 区切りで含めるように変数名を付ける必要があります。

たとえば、環境変数 Logging:LogLevel:DefaultDebug 値に設定する場合、それは次の JSON ファイルから構成値を取得することと等価になります。

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug"
        }
    }
}

環境変数からこれらの値にアクセスするために必要なのは、アプリケーションで IConfigurationRoot オブジェクトを構築するときに ConfigurationBuilderAddEnvironmentVariables を呼び出すことだけです。

Note

環境変数は一般にプレーンテキストとして格納されるので、環境変数が設定されたマシンまたはプロセスが侵害されると、環境変数の値が表示されることになります。

ASP.NET Core Secret Manager を使用してシークレットを格納する

開発時にソース コードの外部にシークレットを保持する別の方法として、ASP.NET Core の Secret Manager ツールを使用するやり方があります。 Secret Manager ツールを使用するには、プロジェクト ファイルにパッケージ Microsoft.Extensions.Configuration.SecretManager を組み込みます。 その依存関係が存在し、それが復元されたら、dotnet user-secrets コマンドを使用して、コマンド ラインからシークレットの値を設定できます。 これらのシークレットは、ユーザーのプロファイル ディレクトリにある JSON ファイルに格納され (OS によって詳細は異なる)、ソース コードから離れた場所に置かれます。

Secret Manager ツールによって設定されたシークレットは、シークレットを使用するプロジェクトの UserSecretsId プロパティによって編成されます。 そのため、次のスニペットに示すように、プロジェクト ファイルに UserSecretsId プロパティを設定する必要があります。 既定値は Visual Studio によって割り当てられた GUID ですが、お使いのコンピューター内で一意である限り、実際の文字列は重要ではありません。

<PropertyGroup>
    <UserSecretsId>UniqueIdentifyingString</UserSecretsId>
</PropertyGroup>

Secret Manager を使用して保存されたシークレットをアプリケーションで使用するには、ConfigurationBuilder インスタンス上で AddUserSecrets<T> を呼び出して、アプリケーションのシークレットをその構成に含めます。 ジェネリック パラメーター T は、UserSecretId が適用されたアセンブリからの型である必要があります。 通常は、AddUserSecrets<Startup> を使用しても問題ありません。

Program.csCreateDefaultBuilder メソッドを使用する場合、AddUserSecrets<Startup>() は開発環境の既定のオプションに含まれています。