信頼された発行は、NuGet パッケージを発行するより優れた方法です。 有効期間の長い API キーを管理する必要はなくなりました。 代わりに、GitHub Actions など、CI/CD システムによって発行された有効期間の短い資格情報を使用します。
これにより、資格情報が漏洩するリスクを減らすことで、発行プロセスの安全性が向上します。 また、シークレットをローテーションまたは格納する必要がないため、自動化も簡単になります。 このアプローチは、セキュリティで保護されたキーレス公開に向けた業界の広範なシフトの一部です。 興味がある場合は、OpenSSF イニシアチブ( https://repos.openssf.org/trusted-publishers-for-all-package-repositories)をご確認ください。
⚠️ ヘッドアップ: nuget.org アカウントに 信頼できる公開 オプションが表示されない場合は、まだ使用できない可能性があります。 徐々に展開しています。
動作方法
GitHub Actions ワークフローを実行すると、github.com から暗号化された OIDC トークンが要求されます。 このトークンにはリポジトリとワークフローに関する情報が含まれており、改ざんを防ぐために GitHub Actions によって暗号で署名されます。 ワークフローは、このトークンを nuget.org に転送します。これにより、業界標準の暗号化方法を使用して github.com を使用してトークンの信頼性が安全に検証されます。 nuget.org のトークン交換エンドポイントは、トークンの詳細が、構成した信頼された発行ポリシーと一致することを確認します。 すべてが一致する場合、nuget.org は、パッケージの発行時にワークフローで使用する有効期間の短い API キーを発行します。
基本的なフローを次に示します。
- CI/CD システム (GitHub Actions など) はワークフローを実行します。
- 有効期間の短いトークンを発行します。
- そのトークンは nuget.org に送信されます。
- NuGet によって検証され、一時 API キーが返されます。
- ワークフローでは、そのキーを使用してパッケージをプッシュします。
NuGet の一時 API キーは 1 時間有効であるため、ワークフローは公開する直前にキーを要求する必要があります。 要求が早すぎると、プッシュが発生する前に期限切れになる可能性があります。
有効期間の短い各トークンは、1 つの一時 API キー (1 つのトークン、1 つの API キー) を取得するために 1 回だけ使用できます。
このセットアップを使用すると、有効期間の長いシークレットに伴うリスクを伴うことなく、パッケージを安全かつ自動化された方法で発行できます。
GitHub Actions のセットアップ
作業を開始するには:
- nuget.org にログインします。
- ユーザー名をクリックし、信頼できる発行を選択します。
- 新しい信頼された発行ポリシーを追加します。 ワークフロー ファイルを含む GitHub リポジトリ
https://github.com/contoso/contoso-sdkの場合は、次の信頼されたポリシーの詳細を入力.github/workflows/build.yml(大文字と小文字は区別されません)。-
リポジトリ所有者:
contoso -
リポジトリ:
contoso-sdk -
ワークフロー ファイル:
build.ymlこれは、
.github/workflows/build.ymlでのワークフローに対応します。 ファイル名のみを入力します (build.yml)、.github/workflows/パスは含めないでください。 -
環境 (省略可能):
releaseワークフローで
environment: releaseなどを使用していて、このポリシーをその環境に制限する場合は、環境を入力します。 GitHub Actions 環境を使用しない場合は、これを空のままにします。
-
リポジトリ所有者:
-
GitHub リポジトリで、ワークフローを更新して有効期間の短い API キーを要求し、パッケージをプッシュします。
基本的な例を次に示します。
jobs:
build-and-publish:
permissions:
id-token: write # enable GitHub OIDC token issuance for this job
steps:
# Build your artifacts/my-sdk.nupkg package here
# Get a short-lived NuGet API key
- name: NuGet login (OIDC → temp API key)
uses: NuGet/login@v1
id: login
with:
user: contoso-bot # Recommended: use a secret like ${{ secrets.NUGET_USER }} for your nuget.org username (profile name), NOT your email address
# Push the package
- name: NuGet push
run: dotnet nuget push artifacts/my-sdk.nupkg --api-key ${{steps.login.outputs.NUGET_API_KEY}} --source https://api.nuget.org/v3/index.json
ポリシーの所有権
信頼できる発行ポリシーを作成するときは、信頼できる発行ポリシーを所有するユーザーを選択する必要があります。 所有者は次のいずれかになります。
- あなた (個人のユーザー)
- 所属している組織
このポリシーは、選択した所有者が所有するすべてのパッケージに適用されます。 つまり、信頼された発行を使用してこれらのパッケージを発行または変更できるユーザーを制御します。
組織を選択する場合は、アクティブなメンバーであることを確認します。 後で組織を脱退した場合、ポリシーは再び追加されるまで非アクティブになる可能性があります。
適切な所有者を選択すると、発行のセットアップがセキュリティで保護され、チームの構造と一致していることを確認できます。
完全にアクティブ化されるのを待っているポリシー
信頼できる発行ポリシーを作成すると、7 日間、一時的にアクティブとして開始される場合があります。 これは通常、プライベート GitHub リポジトリで発生します。 この状態は UI に表示されます。 その間、通常のポリシーのように動作します。 ただし、その 7 日以内に発行が行われない場合、ポリシーは自動的に非アクティブになります。 有効期限が切れた後でも、いつでも 7 日間のウィンドウを再起動できます。
この一時的な期間が必要なのはなぜですか? NuGet には、元のリポジトリと所有者にポリシーをロックするために GitHub リポジトリと所有者 ID が必要であるためです。 それは復活攻撃を防ぐのに役立ちます。 これらの ID がないと、誰かがリポジトリを削除し、同じ名前で再作成し、何も変更されていないかのように発行を試みることができました。
発行が成功すると (GitHub の有効期間の短いトークンの一部として) ID が提供され、ポリシーは永続的にアクティブになります。
ポリシー権限の警告
信頼できる発行ポリシーは、個々のユーザーまたは組織のいずれかの特定の所有者に関連付けられています。 その所有権で何かが変更されると、ポリシーが非アクティブになる可能性があります。 その場合、UI に警告が表示されます。
一般的なケース
組織から削除されたユーザー
ポリシーが組織によって所有されていて、それを作成したユーザーがその組織から後で削除された場合、ポリシーは非アクティブになります。
ユーザーが組織に再び追加された場合、ポリシーは再び自動的にアクティブになります。組織がアクティブではなくなった
ポリシーを所有する組織がロックまたは削除されると、ポリシーは非アクティブになります。
これらの警告は、パッケージの発行時にアクティブでセキュリティで保護されたポリシーのみが使用されるようにするのに役立ちます。