開発時にアプリケーションのシークレットを安全に格納する
ヒント
このコンテンツは eBook の「コンテナー化された .NET アプリケーションの .NET マイクロサービス アーキテクチャ」からの抜粋です。.NET Docs で閲覧できるほか、PDF として無料ダウンロードすると、オンラインで閲覧できます。
保護されたリソースおよびその他のサービスに接続する場合、ASP.NET Core アプリケーションは、通常、接続文字列やパスワードなど、機密情報を含む資格情報を使用する必要があります。 このような機密情報は、"シークレット" と呼ばれます。 ソース コードにシークレットを含めないこと、さらに決してソース管理にシークレットを格納しないことがベスト プラクティスです。 ASP.NET Core 構成モデルを使用して、安全な場所からシークレットを読み取る必要があります。
開発リソースおよびステージング リソースにアクセスするためのシークレットは、運用環境のリソースにアクセスするために使用するシークレットとは区別する必要があります。さまざまな人が、そのようなさまざまなシークレット セットへのアクセスを必要とするからです。 開発時に使用するシークレットを格納するには、環境変数にシークレットを格納するか、または ASP.NET Core Secret Manager ツールを使用してシークレットを格納する方法が一般的です。 運用環境でのストレージの安全性を高めるには、マイクロサービスで Azure Key Vault にシークレットを格納することができます。
環境変数にシークレットを格納する
ソース コードの外部にシークレットを保持する方法の 1 つは、開発者用が開発用コンピューター上で文字列ベースのシークレットを環境変数として設定するというものです。 環境変数を使用して、階層型の名前 (構成セクションで入れ子にされている名前など) を付けてシークレットを格納する場合は、そのセクションの完全な階層をコロン (:) 区切りで含めるように変数名を付ける必要があります。
たとえば、環境変数 Logging:LogLevel:Default
を Debug
値に設定する場合、それは次の JSON ファイルから構成値を取得することと等価になります。
{
"Logging": {
"LogLevel": {
"Default": "Debug"
}
}
}
環境変数からこれらの値にアクセスするために必要なのは、アプリケーションで IConfigurationRoot
オブジェクトを構築するときに ConfigurationBuilder
で AddEnvironmentVariables
を呼び出すことだけです。
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.cs の CreateDefaultBuilder
メソッドを使用する場合、AddUserSecrets<Startup>()
は開発環境の既定のオプションに含まれています。
.NET