共用方式為


防範惡意公共套件

Azure DevOps 服務 |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

Azure Artifacts 上游來源可讓開發人員使用單一來源來儲存已發佈的套件以及從公用註冊中取用的套件,例如 NuGet.org,來集中化套件管理。

上游來源為管理依賴關係提供了多種優勢,包括簡單性、可靠性和套件完整性。 請參閱 什麼是上游來源?如需詳細資訊,

允許外部來源版本

這項功能可讓開發人員控制他們是否想要從公用登錄取用套件版本,例如 NuGet.org 或 npmjs.com。

為特定套件啟用 允許外部版本 切換之後,公用登錄中的版本就會變成可儲存至摘要。 預設情況下,此選項處於停用狀態,透過減少公共註冊表中潛在惡意套件的暴露來增加額外的安全層。 變更此設定不會影響已儲存至饋送的套件版本。 無論此設定為何,這些版本仍可存取。 您必須是 訂閱資料擁有者,才能啟用 允許外部來源版本的功能

允許套件使用外部版本

若要啟用特定套件的外部版本,請遵循下列步驟:

注意

您必須是 Feed 擁有者,才能允許外部來源版本。

  1. 登入 Azure DevOps,然後流覽至您的專案。

  2. 選取工件,然後從下拉式選單中選取您的饋送。

  3. 選取您的套件,選取省略符號按鈕以取得更多選項,然後選取 [允許外部來源版本]。

  4. 切換 [允許外部版本] 以啟用此功能,然後在完成後選取 [關閉]。

    螢幕擷取畫面,顯示如何在 Azure Artifacts 中為特定套件啟用外部版本。

使用 REST API 允許外部版本

若要使用 REST API 為特定套件啟用外部版本,請使用下列端點:

包裝類型 API 端點
NuGet - 設定上游行為配置
- 取得上游行為模式
npm - 設定上游行為
- 設定範圍內的上游行為
- 取得套件上傳行為
- 取得有範圍的套件上游作業
Python(編程語言) - 取得上游操作行為
- 設定上游行為
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. 根據您的案例,從表格執行命令:

    行動 Description Command
    取得上游行為 擷取套件的上游行為狀態。 使用來自先前步驟的 $url$headers Invoke-RestMethod -Uri $url -Headers $headers
    設定上游行為 透過設定 versionsFromExternalUpstreamsAllowExternalVersions來允許套件的外部來源版本。 $body = '{"versionsFromExternalUpstreams": "AllowExternalVersions"}'
    Invoke-RestMethod -Uri $url -Headers $headers -Body $body -Method Patch -ContentType "application/json"
    清除上游傳輸行為 透過設定 versionsFromExternalUpstreamsAuto來重設上游行為。 $body = '{"versionsFromExternalUpstreams": "Auto"}'
    Invoke-RestMethod -Uri $url -Headers $headers -Body $body -Method Patch -ContentType "application/json"

注意

上游行為的變更可能需要一段時間才能傳播到服務。 如果您的套件在更新設定之後無法使用,則最多允許 3 小時變更生效。

適用的案例

本節說明外部版本 (來自公用註冊表的套件)被 封鎖允許 儲存至資料庫的常見情況。 在本文的其餘部分,我們將公用登錄中的套件稱為 公用套件 ,並將儲存在 Azure Artifacts 摘要中的套件稱為 私人套件

案例 1:封鎖公用版本

在下列兩種情況下,啟用「 允許外部版本 」功能時,會封鎖公用版本儲存至摘要:

原為私人使用的套件版本已公開

如果私人套件稍後公開,摘要會封鎖來自公用來源的任何具有相同套件名稱的新版本。

此圖顯示公開的內部套件版本。

同時擁有私人和公用套件

當團隊同時使用私人和公用套件時,若啟用了允許外部版本的功能,則資料流會封鎖從公用註冊表引入的任何新套件版本。

顯示可用私人和公用套件的圖例。

案例 2:允許公用版本

在下列三種情況下,啟用「 允許外部版本」 功能時,允許將公用版本儲存至摘要:

所有套餐均為私人

如果所有套件都是私人的,且小組不打算使用公用套件,則啟用此設定不會影響小組的工作流程。

顯示僅含私人套件的供稿圖例。

所有套件都是公開的

如果小組只取用登錄或開放原始碼存放庫的公用套件,則啟用此設定不會影響其工作流程。

顯示僅包含公開套件的資料流插圖。

公共封包設為私有

當公用套件稍後轉換為私人時,啟用允許外部版本設定不會影響小組的工作流程。

此圖顯示從公用轉換為私用的套件。