防范恶意公共包

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

Azure Artifacts 上游源使开发人员能够使用单个源库集中管理包管理,以存储已发布的包以及从公共注册表(如 NuGet.org)获取的包。

上游源提供了多种优势来管理依赖项,包括简单性、可靠性和包完整性。 有关更多详细信息,请参阅 什么是上游源?

允许外部源版本

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

启用特定包的允许外部版本开关后,公共注册表中的版本将可以保存到供稿中。 默认情况下,此选项处于禁用状态,通过减少对公共注册表中潜在恶意包的暴露,增加了额外的安全层。 更改此设置不会影响已保存到源的包版本。 无论此设置如何,这些版本都仍可访问。 你必须是源所有者才能启用允许外部来源版本功能。

允许包的外部版本

若要为特定包启用外部版本,请执行以下步骤:

注意

必须是 源所有者 才能允许外部源版本。

  1. 登录到 Azure DevOps,然后导航到项目。

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

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

  4. 切换 “允许外部版本 ”启用该功能,然后在完成后选择“ 关闭 ”。

    显示如何在 Azure Artifacts 中为特定包启用外部版本的屏幕截图。

允许使用 REST API 的外部版本

若要使用 REST API 为特定包启用外部版本,请使用以下终结点:

包类型 API 终结点
NuGet - 设置上游行为
- 获取上游特性
npm - 设置上游行为
- 设置限定范围的上游行为
- 获取包上游行为
- 获取作用域内包上游行为
- 获取上游行为
- 设置上游行为
Maven - 获取上游特性
- 设置上游行为
货物 - 获取上游行为
- 设置上游行为

使用 PowerShell 允许外部版本

若要使用 PowerShell 为特定包启用外部版本,请执行以下步骤:

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

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

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

    $token = [Convert]::ToBase64String(([Text.Encoding]::ASCII.GetBytes("username:$env:PatVar")))
    $headers = @{
        Authorization = "Basic $token"
    }
    
  4. 基于您的数据源类型构建端点URL:

    • 项目作用域的源

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

      $url = "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_apis/packaging/feeds/<FEED_NAME>/<PROTOCOL>/packages/<PACKAGE_NAME>/upstreaming?api-version=7.2-preview.1"
      
  5. 根据你的情况从表中运行命令:

    Action Description Command
    获取上游行为 检索包的上游行为状态。 使用 $url$headers 根据前面的步骤。 Invoke-RestMethod -Uri $url -Headers $headers
    设置上游传输行为 通过将 versionsFromExternalUpstreams 设置为 AllowExternalVersions 允许您的包使用外部源版本。 $body = '{"versionsFromExternalUpstreams": "AllowExternalVersions"}'
    Invoke-RestMethod -Uri $url -Headers $headers -Body $body -Method Patch -ContentType "application/json"
    清除上游行为 通过将versionsFromExternalUpstreams设置为Auto来重置上游行为。 $body = '{"versionsFromExternalUpstreams": "Auto"}'
    Invoke-RestMethod -Uri $url -Headers $headers -Body $body -Method Patch -ContentType "application/json"

注意

对上游行为的更改可能需要一段时间才能跨服务传播。 如果您的包在更新设置后仍不可用,请最多等待3小时,更改才能生效。

适用的场景

本节介绍在何种常见方案下,外部版本(公共注册表中的包)被阻止允许保存到 feed。 本文的其余部分将公共注册表中的包称为 公共包 ,将 Azure Artifacts 源中存储的 包作为专用包

方案 1:阻止公开版本

在以下两种情况下,当启用 “允许外部版本” 功能时,公共版本将被阻止保存到信息流中:

专用包版本公开

如果以后公开专用包,源会阻止来自公共源的包名称相同的任何新版本。

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

同时拥有专用包和公共包

当团队同时使用专用包和公共包时,启用准许外部版本功能会阻止来自公共注册表的任何新包版本。

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

方案 2:允许公共版本

在以下三种情况下启用 “允许外部版本” 功能时,允许将公开版本保存到信息流:

所有包都是专用包

如果所有包都是私有的,并且团队不打算使用公共包,则启用此设置不会影响团队的工作流。

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

所有包都是公共包

如果团队专门使用注册表或开源存储库中的公共包,则启用设置不会影响其工作流。

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

公共包设为专用

稍后将公共包转换为专用包时,启用允许外部版本设置不会影响团队的工作流。

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