Microsoft traz Trusted Publishing ao NuGet: Como aplicar e proteger pacotes com exemplo real no ReactiveLock

Michel Oliveira
4 min read
Microsoft traz Trusted Publishing ao NuGet: Como aplicar e proteger pacotes com exemplo real no ReactiveLock

Introdução

A Microsoft lançou recentemente o Trusted Publishing no NuGet, eliminando a necessidade de tokens de API permanentes (ou de alta duração) para publicar pacotes .NET. Este recurso é essencial para proteger a cadeia de suprimentos de pacotes contra ataques (supply chain attacks), garantindo que apenas workflows confiáveis possam publicar versões oficiais.

Ataques de supply chain já vêm acontecendo em outros ecossistemas, como o npm, onde invasores conseguiram injetar código malicioso em pacotes populares ou em dependências indiretas, comprometendo projetos que consumiam essas bibliotecas. Esses incidentes mostram a importância de mecanismos de segurança que garantem a autenticidade e a rastreabilidade das publicações, exatamente como o Trusted Publishing propõe para o NuGet.

Por que é importante

Tokens de alta duração armazenados em secrets podem vazar e ser usados para publicar pacotes comprometidos. O Trusted Publishing:

  • Substitui tokens de alta duração por chaves temporárias, válidas apenas durante a execução do workflow.
  • Garante que apenas pipelines autorizados e validados pelo NuGet possam publicar pacotes.
  • Melhora a rastreabilidade: é possível identificar qual execução publicou cada pacote.
  • Reduz o risco de ataques à cadeia de suprimentos (supply chain attacks).

Como aplicar

1. Criar política Trusted Publishing no NuGet

  1. Acesse NuGet e faça login.
  2. Vá para a seção Trusted Publishing.
  3. Crie uma nova política indicando:
    • Proprietário do pacote (usuário ou organização).
    • Repositório GitHub que fará a publicação.
    • Nome do arquivo de workflow YAML que publicará o pacote.
    • (Opcional) Environment se você usar ambientes no GitHub Actions.
  4. Para repositórios privados, a política fica provisória por 7 dias até a primeira execução válida.

2. Ajustar workflow do GitHub Actions

No .github/workflows/<workflow>.yml:

permissions:
  # Esta permissão permite que o GitHub Actions emita um token OIDC para o workflow.
  # O token OIDC é usado pelo NuGet para validar a identidade do workflow e emitir
  # uma chave API temporária. Sem esta permissão, o Trusted Publishing não funcionaria.
  id-token: write

jobs:
  build-and-publish:
    permissions:
      # Aqui reafirmamos que este job específico também pode gerar o token OIDC.
      # É obrigatório para que a ação `NuGet/login@v1` consiga trocar o token por
      # uma chave temporária e publicar o pacote de forma segura.
      id-token: write
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      # Build, testes e geração do .nupkg

      # A nova action `NuGet/login@v1` realiza a autenticação no NuGet usando o token OIDC
      # gerado pelo GitHub Actions. Ela solicita ao NuGet uma **chave API temporária** 
      # válida apenas para esta execução do workflow. Dessa forma, não é necessário 
      # armazenar tokens permanentes nos secrets do repositório.
      - name: NuGet login (OIDC → chave temporária)
        uses: NuGet/login@v1
        id: login
        with:
          # Novo secret NUGET_USER (usuário do nuget, não é o e-mail)
          user: ${{ secrets.NUGET_USER }}

      # O comando `dotnet nuget push` utiliza a chave temporária fornecida pelo 
      # passo anterior (`steps.login.outputs.NUGET_API_KEY`) para publicar o pacote.
      # Como a chave é de curta duração e única para esta execução, aumenta-se a 
      # segurança e a rastreabilidade das publicações.
      - name: Publicar pacote
        run: dotnet nuget push **/*.nupkg \
             --source https://api.nuget.org/v3/index.json \
             --api-key ${{ steps.login.outputs.NUGET_API_KEY }}

Notas importantes:

  • id-token: write é necessário para gerar o token OIDC.
  • NuGet/login@v1 troca o token OIDC por uma chave temporária, válida apenas para aquela execução.
  • Não é mais necessário armazenar chaves de alta duração como secrets.

Como o Trusted Publishing funciona no NuGet

flowchart TD A[Workflow CI/CD] -->|Solicita token OIDC| B[NuGet] B -->|Valida política e identidade| C[Emite chave API temporária] C -->|Chave temporária| D[Workflow CI/CD] D -->|dotnet nuget push| E[Publica pacote no NuGet] E --> F[Pacote publicado com segurança]

3. Migrar de chaves antigas

  • Crie a política Trusted Publishing primeiro.
  • Ajuste o workflow conforme acima.
  • Teste a publicação via workflow.
  • Remova tokens de alta duração antigos dos secrets após confirmar que o fluxo Trusted Publishing funciona.

Exemplo real: ReactiveLock

No PR micheloliveira‑com/ReactiveLock #34 é possível ver a aplicação prática:

  • Permissões id-token: write no workflow.
  • Uso da ação NuGet/login@v1 para gerar a chave temporária.
  • Publicação de pacotes sem depender de tokens permanentes, garantindo que apenas workflows confiáveis publiquem o pacote ReactiveLock.

Conclusão

O Trusted Publishing moderniza a publicação de pacotes .NET e é essencial para proteger seus pacotes contra ataques de supply chain, garantindo rastreabilidade e segurança na publicação de bibliotecas como o ReactiveLock.

Referências

Conecte-se para transformar sua tecnologia!

Saiba mais e entre em contato: