신뢰할 수 있는 게시는 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시간 동안 유효하므로 워크플로는 게시 직전에 키를 요청해야 합니다. 너무 일찍 요청하면 푸시가 발생하기 전에 만료될 수 있습니다.
수명이 짧은 각 토큰은 하나의 임시 API 키(하나의 토큰, 하나의 API 키)를 가져오는 데 한 번만 사용할 수 있습니다.
이 설정은 장기 사용 비밀과 관련된 위험 없이 패키지를 안전하게 자동으로 게시하는 방법을 제공합니다.
GitHub Actions 설정
시작하기:
- nuget.org 로그인합니다.
- 사용자 이름을 클릭하고 신뢰할 수 있는 게시를 선택합니다.
- 신뢰할 수 있는 새 게시 정책을 추가합니다. 워크플로 파일이
https://github.com/contoso/contoso-sdk있는 GitHub 리포지.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에 경고가 표시됩니다.
일반적인 사례
조직에서 제거된 사용자
조직이 정책을 소유하고 해당 정책을 만든 사용자가 나중에 해당 조직에서 제거되면 정책이 비활성 상태가 됩니다.
사용자가 조직에 다시 추가되면 정책이 자동으로 다시 활성화됩니다.조직이 더 이상 활성화되지 않음
정책을 소유한 조직이 잠겨 있거나 삭제되면 정책이 비활성 상태가 됩니다.
이러한 경고는 패키지를 게시할 때 활성 보안 정책만 사용하는지 확인하는 데 도움이 됩니다.