防范恶意公共包

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

借助 Azure Artifacts 上游源,开发人员可以方便地使用统一源从 Artifact 源和常用公共注册表(如 NuGet.org 或 npmjs.com)发布和使用包。 以前,项目源合并了源本身和所有配置的上游源中的可用包版本列表。

显示源内容的插图。

允许外部源版本是一项功能,使开发人员能够选择是否要使用外部源包版本。 它控制可从特定包的公共注册表访问哪些包。

禁用 “允许外部版本 ”切换时,将阻止公共注册表中的版本,并且无法下载。 这增加了额外的安全层,通过防止从公共注册表暴露到潜在的恶意包。

但是,如果用户愿意,他们可以启用 “允许外部版本 ”切换,以允许从公共注册表访问和使用包。

注意

此设置不会对已保存到源的任何包版本进行更改。 由于更改此设置,对这些包版本的访问不会更改。

适用的场景

以下部分演示了外部版本设置阻止外部源包版本的各种常见方案,以及不需要阻止访问公共包的其他方案。

公共版本被阻止

专用包版本公开

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

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

同时具有专用包和公共包

在此方案中,如果团队使用专用包和公共包的组合,则禁止外部源包阻止来自公共注册表的任何新包版本。

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

不会阻止公共版本

所有包都是专用包*

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

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

所有包都是公共的

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

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

公共包专用

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

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

允许外部版本

注意

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

  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