.NET ユーザーのシークレットを管理する
.NET でセキュアキーを扱うには、利便性と安全性のバランスを慎重に考慮する必要があります。 テストを迅速に行うために、アプリケーションの設定に本番データベースの接続文字列を追加してしまうと、誤ってソース管理にコミットしてしまう可能性があります。 .NET ユーザーシークレットは、ローカル開発中に機密情報を簡単に保存できる方法を提供し、機密情報が漏洩するリスクを大幅に軽減します。
.NET シークレットマネージャー
.NET Core 3.1 以降、SDK には Secrets Manager が含まれており、プロジェクト関連のシークレットのための一意なストアを作成するコマンドラインユーティリティです。 初期化すると、.NET はプロジェクトシークレットを現在のプロジェクト外のユーザーごとのディレクトリに保存します。 利用しているホストのオペレーティングシステムによって保存場所が異なります:
Windows: %APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json
Linux/macOS: ~/.microsoft/usersecrets/<user_secrets_id>/secrets.json
機密情報をプロジェクト外に保管することで、誤ってソース管理にコミットしてしまう可能性を低減できます。 機密情報を格納するフォルダーはプロジェクトごとに固有であり、プロジェクトファイル内の UserSecretsId MSBuild 要素を使用します。 この要素の値は任意の一意の識別子で、.NET テンプレートでは通常自動的に初期化されます。
MSBuild プロパティを UserSecretsId の値として使用することもできます。 たとえば、 ProjectName プロパティを使用できます。 ただし、開発環境全体でプロジェクト名が一意であることを確認してください。
ユーザーシークレットを初期化する
プロジェクトに UserSecretsId 要素がない場合は、2 つの方法で初期化できます。
ターミナルから初期化する
JetBrains Rider でターミナルを開き、プロジェクトディレクトリに移動します。
次のコマンドを実行します:
dotnet user-secrets init
ソリューションエクスプローラーから初期化する
ソリューションエクスプローラーで、プロジェクトノードを右クリックします。
に移動します。
JetBrains Rider は、プロジェクトファイルに
UserSecretsId要素を追加し、ユーザーディレクトリの secrets.json ファイルを開いてプロジェクトを初期化します。
.NET のほとんどのプロジェクトテンプレートでは、ユーザーシークレットがすでに初期化されているため、シークレットの値はすぐに使用できます。
秘密を管理する
プロジェクトの初期化が完了したら、 secrets.json ファイルを編集することでシークレットを管理できます。 このファイルは、多くの .NET プロジェクトで使用される appsettings.json 構成ファイルに似ています。 複雑な構造の構成データを含めることもできますが、通常はキーと値のペアがこれらのファイルに格納されています。
secrets.json ファイルを開くには、ソリューションエクスプローラーでプロジェクトを右クリックし、 を選択します。
secrets.json ファイルを編集する際は、JSON 形式に従ってください。 プロジェクト外のファイルを誤って編集してしまうことを防ぐため、プロジェクト外のファイルを編集しようとすると警告が表示される場合があります。 ファイルの編集を許可するには、 OK をクリックしてください。
コンソールアプリケーションでユーザーシークレットを使用する
コンソールアプリケーションプロジェクトには通常、構成依存関係が欠落しているため、手動で追加する必要があります。
新しいコンソールアプリケーションプロジェクトを作成します。
NuGet ツールウィンドウを使用して
Microsoft.Extensions.Configuration.UserSecretsNuGet パッケージを追加します。 この依存関係により、構成インスタンスを作成し、ユーザーシークレットファイルを読み込むことができます。コンテキストメニュー要素を使用してプロジェクトを初期化します。
secrets.json ファイルを開き、秘密の値を追加します。 例えば:
{ "Name": "World" }Program.cs では、
ConfigurationBuilderタイプを使用してIConfigurationインスタンスを構築し、ユーザーシークレットにアクセスします。using Microsoft.Extensions.Configuration; var configuration = new ConfigurationBuilder() .AddUserSecrets<Program>() .Build(); Console.WriteLine($"Hello, {configuration["Name"]}!");
AddUserSecrets 呼び出しの重要な要素は、その汎用型引数です。 UserSecretsId MSBuild プロパティ値はアセンブリに追加され、 UserSecretsIdAttribute カスタム属性を使用してアクセスされます。 この属性の値がないと、.NET はユーザーシークレットファイルの場所を見つけることができません。
ASP.NET Core およびワーカーサービスにおけるユーザーシークレット
ほとんどの ASP.NET Core およびワーカーサービスプロジェクトテンプレートには、デフォルトでユーザーシークレットが含まれています。 これらのシークレット値はすぐに使用できます。
ASP.NET Core アプリケーションは通常、次のコード行から始まります。
WebApplication.CreateBuilder を呼び出すと、 IConfiguration インスタンスが構築されます。 デフォルトの構成プロバイダーには、JSON、環境変数、コマンドライン引数、ユーザーシークレットが含まれます。
コンソールアプリケーションとは異なり、ホストビルダーは、アプリケーションが開発モードで実行されている場合にのみユーザーシークレットを登録します。 開発者は通常、ローカル開発環境以外ではユーザーシークレットを使用しません。 本番環境では、アプリケーションにシークレットを提供する他のメカニズムの方が管理が容易です。
セキュリティに関する考慮事項
secrets.json ファイルは暗号化されておらず、コンピューターに侵入した悪意のある攻撃者であれば誰でもアクセスできます。 しかし、ユーザーシークレットを使用することで、誤ってシークレットをソースコード管理システムに追加してしまうリスクを軽減できます。
鍵を定期的に交換したり、機密情報へのアクセスを必要最小限の人に限定したりするなど、適切なセキュリティ対策を講じることは依然として不可欠です。