認証済みフィードからのパッケージの使用

多くの NuGet 操作 (復元やインストールなど) では、1 つ以上のパッケージ ソースと通信する必要があります。これらは nuget.config ファイルで設定できます。 HTTP フィードの場合、NuGet は非認証要求を行い、サーバーが HTTP 401 応答で応答した場合には、NuGet は次の順序で認証情報を検索します。

  1. 環境変数 NuGetPackageSourceCredentials_{name}
  2. nuget.config ファイル内の認証情報
  3. NuGet 資格情報プロバイダーを使用します (パッケージ ソースで提供されている場合)

使用する必要がある認証情報は、パッケージ ソースによって決まります。 そのため、資格情報プロバイダーを使用していない限り、使用する認証情報について、パッケージ ソースをチェックする必要があります。 パッケージ ソースでは、NuGet でパスワード (Web サイトにログインするときのパスワード) の使用を禁止するのが非常に一般的です。 通常は、NuGet のパスワードとして使用する個人用アクセス トークンを作成する必要がありますが、使用している NuGet サーバーのドキュメントをチェックする必要があります。 Azure DevOps や GitHub などの一部のパッケージ ソースにはスコープ付きアクセス トークンがあるため、トークンを作成する場合、スコープを含めることが必要になることがあります。

認証情報を管理するためのセキュリティのベスト プラクティス

NuGet は上記の順序で認証情報を検索しますが、プライベート フィードで認証する場合、認証情報を安全に管理するには、次のシーケンスをお勧めします。

  1. 資格情報プロバイダー: 可能な限り資格情報プロバイダーを使用することを強くお勧めします。 この方法では、シークレットをプレーン テキストで格納することを回避し、ソース管理を通じて誤ってシークレットを公開するリスクを最小限に抑えます。 また、通常は認証情報の有効期限が切れたり変更されたりしたときに更新する必要がある場所の数が減ります。 資格情報プロバイダーがシングル サインオンをサポートしている場合、ログインの頻度や認証情報を保存する必要がある場所の数が減る可能性があります。 詳細については、資格情報プロバイダーのセクションを参照してください。

  2. nuget.config の暗号化された認証情報: 資格情報プロバイダーが使用できない場合は、暗号化された認証情報の使用を検討する必要があります。 この方法では、認証情報を暗号化形式で格納することで、セキュリティにレイヤが追加されます。 詳細については、nuget.config ファイルの認証情報に関するセクションを参照してください。

    Note

    暗号化されたパスワードは Windows でのみサポートされることに注意してください。 また、暗号化を解除できるのは、同じマシンで、最初にパスワードを暗号化したユーザーが行う場合だけです。

  3. nuget.config での環境変数マクロの使用: 暗号化された認証情報を使用できない場合は、環境変数マクロを使用して nuget.config ファイルに認証情報を格納することを検討してください。 この方法では、実際の認証情報を含む環境変数を参照できます。 これにより、透過性が向上し、エンド ユーザーが認証情報の設定方法を理解するのに役立ちます。 詳細については、nuget.config ファイルの認証情報に関するセクションを参照してください。

  4. 環境変数を直接使用する: フォールバック オプションとして、認証情報を環境変数に直接格納できます。 ただし、この方法では、nuget.config ファイルで環境変数マクロを使用する場合と比べて、可視性と制御性が低下する場合があることに注意してください。 詳細については、環境変数内の認証情報に関するセクションを参照してください。

  5. NuGet.Config のクリア テキスト認証情報: 上記オプションのいずれかを使用することを強くお勧めします。 これらのオプションが使用できない場合は、nuget.config ファイルに認証情報を格納できます。 ただし、このオプションは他のセキュリティで保護されたオプションが使用できない環境でのみ使用してください。 詳細については、nuget.config ファイルの認証情報に関するセクションを参照してください。

    警告

    nuget.config ファイルにクリア テキストで認証情報を格納することは、特にソース管理にこのファイルを保存する場合、誤って認証情報が漏えいする可能性が高まるため、危険です。 nuget.config ファイルに認証情報を格納する必要がある場合は、上記のより安全性の高いオプションのいずれかを使用することを検討してください。

これらのベスト プラクティスに従うことで、機密情報の漏えいのリスクを最小限に抑えながら、プライベート フィードを安全に認証できます。

環境変数内の認証情報

NuGet は、NuGetPackageSourceCredentials_{name} という名前の環境変数を検索します。{name}nuget.config ファイルのパッケージ ソース内の key="name" の値です。 この環境変数の値は Username={username};Password={password} にする必要があり、必要に応じて ;ValidAuthenticationTypes={types} を含めます。 環境変数が NuGet の規則に一致しない場合、または値が NuGet の適切なパターンを満たしていない場合、NuGet は環境変数を自動的に無視し、他の場所でパッケージ ソースの認証情報を検索し続けます。 NuGet が環境変数の認証情報を使用することを示すログはありません。これにより、環境変数に期限切れのシークレットが含まれていて、新しいシークレットが nuget.config ファイルに追加されると、この構成ファイルの優先順位が低いため、認証問題のデバッグが難しくなることがあります。

ヒント

CI/CD パイプラインで環境変数を使用すると、シークレットがログにキャプチャされるリスクを最小限に抑えることができます。

たとえば、次のような nuget.config ファイルがあるとします。

<configuration>
  <packageSources>
    <clear />
    <add key="Contoso" value="https://nuget.contoso.com/v3/index.json" />
  </packageSources>
</configuration>

この場合、ソース名は Contoso になります。NuGet は環境変数名 NuGetPackageSourceCredentials_Contoso を検索します。 一部のプラットフォームでは大文字と小文字が区別されるため、nuget.config ファイルで定義されている環境名とソース名に正しい大文字と小文字を使用してください。

ユーザー名が nugetUser で、パスワードが secret123 の場合、環境変数の値は Username=nugetUser;Password=secret123 に設定する必要があります。 NuGet で HTTP 基本認証にのみこの認証情報を使用し、他の認証スキームでは使用しない場合は、環境変数の値を Username=nugetUser;Password=secret123;ValidAuthenticationTypes=Basic に設定できます。 有効な認証タイプの詳細については、nuget.config ファイルのパッケージ認証情報に関するドキュメントを参照してください。

Note

環境変数で使用可能な文字には制限があり、オペレーティング システムによって制限が異なる場合があります。 たとえば、スペースは使用できません。 そのため、この環境変数機能を使用して、プラットフォームの環境変数では無効な文字を使用するパッケージ ソースの NuGet 認証情報を指定します。 このような場合は、nuget.config ファイル内のパッケージ ソースの名前を変更する必要があります。

nuget.config ファイル内の認証情報

nuget.config ファイルには、パッケージ ソースの認証情報を含めることができます。 構文を含む詳細については、パッケージ ソースの認証情報に関する nuget.config ファイル リファレンス ドキュメントのセクションを参照してください。 ただし、コマンド ラインで dotnet nuget update source を使用して認証情報を設定した方が簡単です。

警告

特に認証情報をプレーン テキストとして保存する場合、nuget.config ファイルで認証情報を設定するときは注意してください。 認証情報がソース管理内の nuget.config ファイルに書き込まれると、シークレットが誤って漏えいするリスクが高くなります。

NuGet は複数のファイルからの設定を蓄積するため、ユーザーの nuget.config ファイルに認証情報を保存することをお勧めします。 また、ビルドの信頼性のために、<clear /> 要素を含むソリューション (ソース コード リポジトリ) nuget.config ファイルにパッケージ ソースを保存することをお勧めします。

nuget.config ファイル内のユーザー名とプレーン テキスト パスワードでは、使用する環境変数の名前の先頭と末尾に % を追加することで、この環境変数を使用できます。 詳細については、環境変数の使用に関する nuget.config リファレンス ドキュメントを参照してください。

資格情報プロバイダー

NuGet には拡張性モデルがあり、プラグインで NuGet 認証情報を提供できます。 NuGet が検出するためのパスに資格情報プロバイダーをインストールする必要があり、このパスは .NET Framework (NuGet.exe、MSBuild、および Visual Studio) と .NET SDK (.NET 5 以降のランタイムで実行) では異なります。

NuGet は、対話型モードまたは非対話型モードで実行されます。 非対話型モードの場合、資格情報プロバイダーは NuGet をブロックしないように指示されます。 対話型モードでは、資格情報プロバイダーからログインを求められる場合があります。 ツールによって既定値が異なるため、シナリオによっては対話型モードのオプトインまたはオプトアウトが必要になる場合があります。

ツール 既定値 トグル
dotnet CLI non-interactive --interactive 引数。 たとえば、dotnet restore --interactive のようにします。
MSBuild non-interactive NuGetInteractive MSBuild プロパティ。 たとえば、msbuild -t:restore -p:NuGetInteractive=true のようにします。
NuGet.exe interactive -NonInteractive 引数。 たとえば、nuget.exe restore -NonInteractive のようにします。
Visual Studio interactive 非対話型モードでは実行できません。

NuGet.exe は V1 と V2 の両方の資格情報プロバイダーをサポートしますが、MSBuild と .NET SDK はクロス プラットフォーム (V2) プラグインのみをサポートします。

Visual Studio では、NuGet には Visual Studio 資格情報プロバイダー インターフェイスがあります。資格情報プロバイダーは、このインターフェイスを使用してログイン環境をグラフィカルに表示することも、必要に応じて Visual Studio API を呼び出すこともできます。 ソースを処理する Visual Studio 資格情報プロバイダーが見つからない場合、Visual Studio の NuGet はコマンド ライン資格情報プロバイダーにフォールバックします。

Visual Studio 2017 バージョン 15.9 以降には、Visual Studio、MSBuild、および NuGet.exe 内で動作する Azure Artifacts 用の資格情報プロバイダーが含まれています。 ただし、.NET SDK の資格情報プロバイダーは Visual Studio に含まれていないため、dotnet CLI を使用するには個別にインストールする必要があります

資格情報プロバイダーのリスト

.NET ツールを使用して資格情報プロバイダーをインストールできるようにする機能要求があり、これにより、他の資格情報プロバイダーの検出が容易になる可能性があります。 この機能が実装されるまで、対応している資格情報プロバイダーの一覧を次に示します。