編輯套件原點控制項 - Amazon CodeCatalyst

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

編輯套件原點控制項

在 Amazon 中 CodeCatalyst,套件版本可以直接發佈、從上游儲存庫下拉,或透過閘道從外部公用存放庫擷取套件版本,將其新增至套件儲存庫。如果您允許透過直接發佈和從公用存放庫擷取來新增套件版本,則容易遭受相依性替換攻擊。如需詳細資訊,請參閱依賴替換攻擊。若要保護自己免受相依性替代攻擊,請在儲存庫中的套件上設定套件來源控制項,以限制如何將該套件的版本新增至儲存庫。

您應該考慮設定套件來源控制項,讓不同套件的新版本同時來自內部來源,例如直接發佈和外部來源,例如公開儲存庫。根據預設,套件原始控制項是根據第一個套件版本新增至儲存庫的方式來設定。

Package 原點控制設定

使用套件來源控制項,您可以設定如何將套件版本新增至儲存庫。下列清單包括可用的套件原點控制設定和值。

發布

此設定可設定是否可以使用套裝程式管理員或類似工具將套件版本直接發佈至儲存庫。

  • ALLOW:Package 版本可以直接發布。

  • BLOCK: Package 版本無法直接發佈。

上游

此設定可設定套件版本是否可以從外部公用儲存庫擷取,或是在套件管理員要求時從上游儲存庫保留套件版本。

  • ALLOW:任何套件版本都可以從設定為上游 CodeCatalyst 儲存庫的其他儲存庫中保留,或從具有外部連線的公用來源擷取。

  • BLOCK:無法從設定為上游儲存庫的其他 CodeCatalyst 儲存庫保留 Package 版本,或從具有外部連線的公用來源擷取套件版本。

預設套件原始碼控制設定

套裝程式的預設套裝程式來源控制項將以該套裝程式的第一個版本新增至套裝程式儲存區域的方式為基礎。

  • 如果第一個軟件包版本由軟件包管理器直接發布,則設置將是「發布:」ALLOW 和「上游:BLOCK」。

  • 如果第一個套件版本是從公開來源擷取,則設定會是 Publish: BLOCK上游:ALLOW

常見的套件存取控制案例

本節說明何時將套裝程式版本新增至套裝程式儲存區域的一 CodeCatalyst 些常見案例。根據第一個 Package 件版本的新增方式,會為新套件設定套件原始碼控制設定。

在下列案例中,內部套件會直接從套件管理員發行至您的存放庫,例如您維護的套件。外部套件是存在於公用儲存庫中的套件,可透過上游閘道儲存庫擷取至您的儲存庫。

針對現有內部套件發行外部套件版本

在這個案例中,請考慮一個內部套件,PackaGa。您的團隊會將 PackaGea 的第一個套件版本發佈至 CodeCatalyst 套件存放庫。因為這是該套件的第一個套件版本,所以套件原始控制項設定會自動設定為「發佈:允許」和「上游:區塊」。在您的儲存區域中發佈套裝程式之後,會將具有相同名稱的套裝程式發行至連線至 CodeCatalyst 套裝程式儲存區域的公用儲存區域。這可能是針對內部軟件包的嘗試依賴替換攻擊,也可能是巧合。無論如何,套件來源控制項都設定為封鎖新外部版本的擷取,以保護自己免受潛在攻擊。

在下圖中,RePoA 是您的 CodeCatalyst 套件存放庫,其上游連線至npm-public-registry-gateway存放庫。您的存儲庫包含的版本 1.1 和 2.1 的 PackaGa,但 3.0 版本已發佈到公共存儲庫。一般而言,RePoA 會在套件管理員要求套件之後擷取 3.0 版。由於套件擷取設定為「封」,因此 3.0 版本不會擷取到您的 CodeCatalyst 套件儲存庫中,而且無法提供給連線的套件管理員。

簡單的圖形顯示從公共存儲庫阻止的新外部軟件包版本。

針對現有外部套件發行內部套件版本

在這個案例中,套件 PackageB 存在於外部您已連線至存放庫的公用存放庫中。當連接到儲存庫的套件管理員要求 PackageB 時,套件版本會從公用存放庫擷取到您的存放庫中。因為這是第一個套件版本的 PackageB 新增至您的儲存庫,因此套件原始設定會設定為「發佈:」BLOCK 和「上游:」。ALLOW稍後,您嘗試將具有相同套件名稱的版本發佈到存放庫。您可能不知道公用套件,並嘗試以相同的名稱發佈不相關的套件,或者您可能嘗試發佈修補的版本,或者您可能會嘗試直接發佈外部已存在的套件版本。 CodeCatalyst 拒絕您嘗試發行的版本,但如有必要,您可以明確覆寫拒絕並發佈版本。

在下圖中,RePoA 是您的 CodeCatalyst 套件存放庫,其上游連線至npm-public-registry-gateway存放庫。您的套件存放庫包含從公用存放庫擷取的 3.0 版。您想要將 1.2 版發佈至您的套件存放庫。通常,您可以將 1.2 版發佈至 RePoA,但由於發佈設定為「封鎖」,因此無法發佈 1.2 版。

顯示封裝發佈被封鎖的簡單圖形。

發佈現有外部套件的修補套件版本

在這個案例中,套件 PackageB 存在於外部,您已連線至套裝程式儲存區域的公用存放庫中。當連接到儲存庫的套件管理員要求 PackageB 時,套件版本會從公用存放庫擷取到您的存放庫中。因為這是第一個套件版本的 PackageB 新增至您的儲存庫,因此套件原始設定會設定為「發佈:」BLOCK 和「上游:」。ALLOW您的團隊決定將此套件的已修補套件版本發佈至存放庫。為了能夠直接發佈套件版本,您的團隊將套件原始控制項設定變更為 Publish: ALLOWUpload: BLOCK。此套件的版本現在可以直接發佈至您的儲存庫,並從公用存放庫擷取。在您的小組發佈已修補的套件版本之後,您的團隊會將套件來源設定還原為 Publish: BLOCKUp load:。ALLOW

編輯套件原點控制項

Package 程式原始控制項會根據套裝程式的第一個套裝程式版本新增至套裝程式儲存區域的方式,自動設定。如需詳細資訊,請參閱預設套件原始碼控制設定。若要新增或編輯套裝程式儲存區域中套裝程式的 CodeCatalyst 套裝程式原始控制項,請執行下列程序中的步驟。

新增或編輯套件原始控制項
  1. 在導覽窗格中,選擇 Packages (套件)

  2. 選擇包含要編輯之套裝程式的套裝程式儲存區域。

  3. 在「裝」表格中,搜尋並選擇您要編輯的封裝。

  4. 在套件摘要頁面中,選擇「Origin 控制項」。

  5. Origin 控制項中,選擇您要為此套件設定的套件原始控制項。必須同時設定套件原始控制項設定 (「發佈」和「上游」)。

    • 若要允許直接佈封裝版本,請在 [發佈] 中選擇 [允許]。若要封鎖套件版本的發佈,請選擇 [封]。

    • 若要允許從外部儲存庫擷取套裝程式並從上游儲存庫提取套裝程式,請在上游來源中選擇允許。若要封鎖所有從外部和上游儲存庫擷取套件版本,請選擇「封鎖」。

  6. 選擇 Save (儲存)。

發佈和上游儲存庫

在中 CodeCatalyst,您無法發佈存在於可存取的上游存放庫或公用存放庫中的套件版本。例如,假設您想要將 npm 套件發佈lodash@1.0至儲存庫myrepo,並且myrepo具有與 npmjs.com 外部連線的上游儲存庫。請考慮下列案例。

  1. 上的套件原始控制項設定lodash為「發佈:」ALLOW 和「上游:」ALLOW。如果lodash@1.0存在於上游儲存庫或 npmjs.com 中,則會透過發出 409 衝突錯誤來 CodeCatalyst 拒絕任何嘗試發佈至其中myrepo的嘗試。您仍然可以發佈不同的版本,例如lodash@1.1.

  2. 上的套件原始控制項設定lodash為「發佈:」ALLOW 和「上游:」BLOCK。您可以將任何版本的發佈lodash到尚未存在的存放庫,因為無法存取套件版本。

  3. 上的套件原始控制項設定lodash為「發佈:」BLOCK 和「上游:」ALLOW。您無法將任何套件版本直接發佈到存放庫。

依賴替換攻擊

Package 管理器簡化了打包和共享可重複使用代碼的過程。這些套件可能是由組織開發用於其應用程式的私有套件,也可能是公開的,通常是開放原始碼套件,這些套件是在組織外部開發並由公開套件儲存庫散佈的。請求軟件包時,開發人員依賴他們的軟件包管理器來獲取其依賴項的新版本。相依性替換攻擊 (也稱為相依性混淆攻擊) 會利用套件管理員通常無法區分合法版本的套件與惡意版本的事實。

依賴性替換攻擊屬於被稱為軟件供應鏈攻擊的攻擊子集。軟件供應鏈攻擊是一種利用軟件供應鏈中任何地方漏洞的攻擊。

依賴性替換攻擊可以針對使用內部開發的軟件包和從公共存儲庫獲取的軟件包的任何人。攻擊者識別內部軟件包名稱,然後策略性地將具有相同名稱的惡意代碼放置在公共軟件包存儲庫中。一般而言,惡意程式碼會以較高版本號碼的套件發佈。Package 件管理員會從這些公開摘要擷取惡意程式碼,因為他們認為惡意套件是套件的最新版本。這會導致所需的軟件包和惡意軟件包之間出現「混淆」或「替代」,從而導致代碼受到攻擊。

為了防止相依性替換攻擊,Amazon CodeCatalyst 提供套件來源控制。Package 件原始控制項是控制套件新增至儲存庫的方式的設定。當新套件的第一個套件版本新增至 CodeCatalyst 儲存庫時,控制項會自動設定控制項。控制項可確保套件版本不能同時直接發佈至您的儲存庫,並從公開來源擷取,以保護您免受相依性替代攻擊。如需套件來源控制項以及如何變更它們的詳細資訊,請參閱編輯套件原點控制項