防范恶意公共包

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

借助 Azure Artifacts 上游源,开发人员可以更加便利地使用统一的源,将包从 Artifact 源和常用的公共注册表(如 NuGet.org 或 npmjs.com)进行发布和使用。

允许外部源版本

此功能使开发人员能够控制他们是否想要使用公共注册表中的包版本,例如 NuGet.org 还是 npmjs.com。

为特定包启用 允许外部版本 切换后,公共注册表中的版本可供下载。 默认情况下,此选项是禁用的,这为安全性添加了一层额外的保护,以防止从公共注册表中下载到潜在的恶意软件包。 你必须是源所有者才能启用允许外部来源版本功能。

注意

更改此设置不会影响已保存到源的包版本。 无论此设置如何,这些版本都将保持可访问状态。

适用的场景

以下部分概述了允许或阻止外部版本(来自公共注册表的包)保存到源的常见场景。 本文的其余部分将公共注册表中的包称为公共包,Azure Artifacts 源中的包作为专用包。

场景 1:阻止公共版本

专用包版本公开

在此场景中,团队具有设为公开的专用包。 在这种情况下,外部版本设置将导致源阻止从公共源消费任何具有该包名称的新版本。

显示设为公开的内部包版本的插图。

同时拥有专用包和公共包

在此情境下,如果团队使用专用包与公共包的组合,禁止来自外部的包将会阻止从公共注册表获取任何新包版本。

显示可用的专用和公共包的插图。

场景 2:不会阻止公共版本

所有包都是专用的*

如果所有现有包都是私有的,并且团队没有计划使用任何公共包,则外部版本设置在此方案中不会影响团队的工作流。

显示仅包含专用包的订阅源的插图。

所有包都是公共包

在此方案中,如果团队专门使用公共包,无论是从公共注册表还是其他开源存储库,则设置不会以任何方式影响其工作流。

显示仅包含公共包的订阅源的插图。

公共包设为专用

在这种情况下,当公共包转换为专用包时,外部版本设置不会以任何方式影响团队的工作流。

显示从公共转换为专用的包的插图。

允许外部版本

注意

必须是 源所有者 才能允许外部源版本。 有关详细信息,请参阅 源权限

  1. 登录到 Azure DevOps 组织,并导航到你的项目。

  2. 选择“ 项目”,然后从下拉菜单中选择源。

  3. 选择包,然后选择省略号按钮以获取更多选项。 选择“ 允许外部源版本”。

    显示如何允许外部源版本的屏幕截图。

  4. 选择切换按钮以允许外部版本。 完成后,选择“ 关闭 ”。

    显示如何启用外部版本的屏幕截图。

允许使用 REST API 的外部版本

使用 PowerShell 允许外部版本

  1. 创建个人访问令牌,并给予打包>读取、写入和管理权限。

    显示如何选择打包权限的屏幕截图。

  2. 为个人访问令牌创建环境变量。

    $env:PATVAR = "YOUR_PERSONAL_ACCESS_TOKEN"
    
  3. 将个人访问令牌转换为 baser64 编码字符串并构造 HTTP 请求标头。

    $token = [Convert]::ToBase64String(([Text.Encoding]::ASCII.GetBytes("username:$env:PatVar")))
    $headers = @{
        Authorization = "Basic $token"
    }
    
  4. 构造端点 URL。 示例://pkgs.dev.azure.com/MyOrg/MyProject/_apis/packaging/feeds/MyFeed/nuget/packages/pkg1.0.0.nupkg/upstreaming?api-version=6.1-preview.1

    • 项目作用域的源

      $url = "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_apis/packaging/feeds/<FEED_NAME>/<PROTOCOL>/packages/<PACKAGE_NAME>/upstreaming?api-version=6.1-preview.1"
      
    • 组织作用域的源

      $url = "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_apis/packaging/feeds/<FEED_NAME>/<PROTOCOL>/packages/<PACKAGE_NAME>/upstreaming?api-version=6.1-preview.1"
      

运行以下命令以检索包的上游行为状态。 $url$headers 上一节中使用的变量相同。

Invoke-RestMethod -Uri $url -Headers $headers