다음을 통해 공유


nuget.org에서의 신뢰할 수 있는 게시

신뢰할 수 있는 게시는 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 키를 발급합니다.

기본 흐름은 다음과 같습니다.

  1. CI/CD 시스템(예: GitHub Actions)은 워크플로를 실행합니다.
  2. 수명이 짧은 토큰을 발급합니다.
  3. 해당 토큰은 nuget.org 전송됩니다.
  4. NuGet은 이를 확인하고 임시 API 키를 반환합니다.
  5. 워크플로는 해당 키를 사용하여 패키지를 푸시합니다.

신뢰할 수 있는 게시 페이지를 보여 주는 스크린샷

NuGet의 임시 API 키는 1시간 동안 유효하므로 워크플로는 게시 직전에 키를 요청해야 합니다. 너무 일찍 요청하면 푸시가 발생하기 전에 만료될 수 있습니다.

수명이 짧은 각 토큰은 하나의 임시 API 키(하나의 토큰, 하나의 API 키)를 가져오는 데 한 번만 사용할 수 있습니다.

이 설정은 장기 사용 비밀과 관련된 위험 없이 패키지를 안전하게 자동으로 게시하는 방법을 제공합니다.

GitHub Actions 설정

시작하기:

  1. nuget.org 로그인합니다.
  2. 사용자 이름을 클릭하고 신뢰할 수 있는 게시를 선택합니다.
  3. 신뢰할 수 있는 새 게시 정책을 추가합니다. 워크플로 파일이 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 환경을 사용하지 않는 경우 이 값을 비워 둡니다.

  4. 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에 경고가 표시됩니다.

일반적인 사례

  • 조직에서 제거된 사용자
    조직이 정책을 소유하고 해당 정책을 만든 사용자가 나중에 해당 조직에서 제거되면 정책이 비활성 상태가 됩니다.
    사용자가 조직에 다시 추가되면 정책이 자동으로 다시 활성화됩니다.

  • 조직이 더 이상 활성화되지 않음
    정책을 소유한 조직이 잠겨 있거나 삭제되면 정책이 비활성 상태가 됩니다.

이러한 경고는 패키지를 게시할 때 활성 보안 정책만 사용하는지 확인하는 데 도움이 됩니다.