

Amazon CodeCatalyst 不再向新客戶開放。現有客戶可以繼續正常使用該服務。如需詳細資訊，請參閱[如何從 CodeCatalyst 遷移](migration.md)。

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

# 編輯套件原始伺服器控制項
<a name="package-origin-controls"></a>

在 Amazon CodeCatalyst 中，套件版本可以直接發佈、從上游儲存庫下拉，或透過閘道從外部公有儲存庫擷取，以新增至套件儲存庫。如果您允許透過直接從公有儲存庫發佈和擷取來新增套件的版本，則您容易遭受相依性替代攻擊。如需詳細資訊，請參閱[相依性替代攻擊](#dependency-substitution-attacks)。為了保護自己免受相依性替代攻擊，請在儲存庫中的套件上設定套件原始伺服器控制，以限制將該套件的版本新增至儲存庫的方式。

您應該考慮設定套件原始伺服器控制，讓不同套件的新版本來自兩個內部來源，例如直接發佈和外部來源，例如公有儲存庫。根據預設，套件原始伺服器控制是根據將套件的第一個版本新增至儲存庫的方式進行設定。

## 套件原始伺服器控制設定
<a name="package-origin-control-settings"></a>

透過套件原始伺服器控制，您可以設定如何將套件版本新增至儲存庫。下列清單包含可用的套件原始控制設定和值。

**發布**

此設定會設定是否可使用套件管理員或類似工具，將套件版本直接發佈至儲存庫。
+ **允許**：可以直接發佈套件版本。
+ **封鎖**：無法直接發佈套件版本。

**上游**

此設定會設定套件版本是否可以從外部、公有儲存庫擷取，或在套件管理員要求時從上游儲存庫保留。
+ **允許**：任何套件版本都可以從設定為上游儲存庫的其他 CodeCatalyst 儲存庫保留，或從具有外部連線的公有來源擷取。
+ **封鎖**：套件版本無法從設定為上游儲存庫的其他 CodeCatalyst 儲存庫保留，或從具有外部連線的公有來源擷取。

### 預設套件原始伺服器控制設定
<a name="default-package-origin-control-settings"></a>

套件的預設套件原始伺服器控制項將根據該套件的第一個版本如何新增至套件儲存庫。
+ 如果第一個套件版本是由套件管理員正確發佈，則設定將是**發佈：允許**和**上游：鎖定**。
+ 如果從公有來源擷取第一個套件版本，則設定將是**發佈：封鎖**和**上游：允許**。

## 常見的套件存取控制案例
<a name="package-origin-control-scenarios"></a>

本節說明將套件版本新增至 CodeCatalyst 套件儲存庫的一些常見案例。根據第一個套件版本的新增方式，會為新套件設定套件原始伺服器控制設定。

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

**針對現有的內部套件發佈外部套件版本**

在此案例中，請考慮內部套件 *packageA*。您的團隊會將 *packageA* 的第一個套件版本發佈至 CodeCatalyst 套件儲存庫。由於這是該套件的第一個套件版本，套件原始伺服器控制設定會自動設定為**發佈：允許**和**上游：封鎖**。在儲存庫中發佈套件後，具有相同名稱的套件會發佈至連線至 CodeCatalyst 套件儲存庫的公有儲存庫。這可能是對內部套件的嘗試相依性替換攻擊，也可能是巧合。無論如何，套件原始伺服器控制都會設定為封鎖新外部版本的擷取，以保護自己免於潛在的攻擊。

在下圖中，*repoA* 是具有儲存庫上游連線的 CodeCatalyst 套件`npm-public-registry-gateway`儲存庫。您的儲存庫包含 *packageA* 的 1.1 和 2.1 版，但 3.0 版會發佈至公有儲存庫。通常，在套件管理員請求套件之後，*repoA* 會擷取 3.0 版。由於套件擷取設定為 **Block**，因此 3.0 版不會擷取到您的 CodeCatalyst 套件儲存庫，且無法供與其連線的套件管理員使用。

![\[簡單圖形顯示新的外部套件版本遭到公有儲存庫封鎖。\]](http://docs.aws.amazon.com/zh_tw/codecatalyst/latest/userguide/images/packages/package-origin-controls-one.png)


**針對現有的外部套件發佈內部套件版本**

在此案例中，套件 *packageB* 在外部存在於您已連線至儲存庫的公有儲存庫中。當套件管理員連接到您的儲存庫請求 *packageB* 時，套件版本會從公有儲存庫擷取到您的儲存庫。由於這是新增至儲存庫的第一個 *packageB* 套件版本，因此套件原始伺服器設定會設定為 **Publish： BLOCK** and **Upstream： ALLOW**。稍後，您會嘗試將具有相同套件名稱的版本發佈至儲存庫。您可能不知道公有套件並嘗試以相同名稱發佈不相關的套件，或者您可能嘗試發佈修補版本，或者您可能嘗試直接發佈已存在於外部的確切套件版本。CodeCatalyst 會拒絕您嘗試發佈的版本，但您可以視需要明確覆寫拒絕並發佈版本。

在下圖中，*repoA* 是具有與儲存庫上游連線的 CodeCatalyst 套件`npm-public-registry-gateway`儲存庫。您的套件儲存庫包含從公有儲存庫擷取的 3.0 版。您想要將 1.2 版發佈至套件儲存庫。一般而言，您可以將 1.2 版發佈至 *repoA*，但由於發佈設定為 **Block**，因此無法發佈 1.2 版。

![\[顯示套件發佈已封鎖的簡單圖形。\]](http://docs.aws.amazon.com/zh_tw/codecatalyst/latest/userguide/images/packages/package-origin-controls-two.png)


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

在此案例中，套件 *packageB* 在外部存在於您已連線至套件儲存庫的公有儲存庫中。當套件管理員連接到您的儲存庫請求 *packageB* 時，套件版本會從公有儲存庫擷取到您的儲存庫。由於這是新增至儲存庫的第一個 *packageB* 套件版本，因此套件原始伺服器設定會設定為 **Publish： BLOCK** and **Upstream： ALLOW**。您的團隊決定將此套件的修補套件版本發佈至 儲存庫。為了能夠直接發佈套件版本，您的團隊會將套件原始伺服器控制設定變更為**發佈：允許**和**上游：封鎖**。此套件的版本現在可以直接發佈到您的儲存庫，並從公有儲存庫擷取。在您的團隊發佈修補的套件版本之後，您的團隊會將套件原始伺服器設定還原為 **Publish： BLOCK** and **Upstream： ALLOW**。

## 編輯套件原始伺服器控制項
<a name="edit-package-origin-controls"></a>

套件原始伺服器控制是根據套件的第一個套件版本如何新增至套件儲存庫而自動設定。如需詳細資訊，請參閱[預設套件原始伺服器控制設定](#default-package-origin-control-settings)。若要新增或編輯 CodeCatalyst 套件儲存庫中套件的套件原始伺服器控制項，請執行下列程序中的步驟。

**新增或編輯套件原始伺服器控制項**

1. 在導覽窗格中，選擇 **Packages (套件)**。

1. 選擇包含您要編輯之套件的套件儲存庫。

1. 在**套件**表格中，搜尋並選擇您要編輯的套件。

1. 在套件摘要頁面中，選擇**原始伺服器控制項**。

1. 在**原始伺服器控制項**中，選擇您要為此套件設定的套件原始伺服器控制項。套件原始控制設定 **Publish** 和 **Upstream** 必須同時設定。
   + 若要允許直接發佈套件版本，請在**發佈**中選擇**允許**。若要封鎖發佈套件版本，請選擇**封鎖**。
   + 若要允許從外部儲存庫擷取套件並從上游儲存庫提取套件，請在**上游來源**中選擇**允許**。若要封鎖所有從外部和上游儲存庫擷取和提取套件版本，請選擇**封鎖**。

1. 選擇**儲存**。

## 發佈和上游儲存庫
<a name="package-publishing-upstreams"></a>

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

1. 上的套件原始伺服器控制設定`lodash`是**發佈：允許**和**上游：允許**。如果上游儲存庫或 npmjs.com 中存在 `lodash@1.0` ，CodeCatalyst `myrepo`會發出 409 衝突錯誤，拒絕在 中發佈任何嘗試。您仍然可以發佈不同的版本，例如 `lodash@1.1`。

1. 上的套件原始伺服器控制設定`lodash`是 **Publish： ALLOW** 和 **Upstream： BLOCK**。您可以將任何 版本發佈`lodash`至尚未存在的儲存庫，因為套件版本無法連線。

1. 上的套件原始伺服器控制設定`lodash`是 **Publish： BLOCK** and **Upstream： ALLOW**。您無法將任何套件版本直接發佈到您的儲存庫。

## 相依性替代攻擊
<a name="dependency-substitution-attacks"></a>

套件管理員可簡化封裝和共用可重複使用程式碼的程序。這些套件可能是組織開發用於其應用程式的私有套件，也可能是公有套件，通常是在組織外部開發並由公有套件儲存庫分發的開放原始碼套件。請求套件時，開發人員依賴其套件管理員來擷取其相依性的新版本。相依性替代攻擊也稱為相依性混淆攻擊，利用套件管理員通常無法區分套件的合法版本與惡意版本這一事實。

相依性替代攻擊屬於稱為軟體供應鏈攻擊的攻擊子集。軟體供應鏈攻擊是一種利用軟體供應鏈中任何位置漏洞的攻擊。

相依性替代攻擊可以針對任何同時使用內部開發的套件和從公有儲存庫擷取的套件。攻擊者會識別內部套件名稱，然後在公有套件儲存庫中以策略方式放置同名的惡意程式碼。一般而言，惡意程式碼會發佈在版本編號較高的套件中。套件管理員會從這些公有饋送擷取惡意程式碼，因為他們認為惡意程式套件是套件的最新版本。這會導致所需套件和惡意套件之間的「混淆」或「替代」，這會導致程式碼洩露。

為了防止相依性替代攻擊，Amazon CodeCatalyst 提供套件原始伺服器控制。套件原始伺服器控制是控制套件如何新增至儲存庫的設定。當新套件的第一個套件版本新增至 CodeCatalyst 儲存庫時，會自動設定控制項。控制項可確保套件版本無法直接發佈至您的儲存庫並從公有來源擷取，以保護您免受相依性替代攻擊。如需套件原始伺服器控制以及如何變更它們的詳細資訊，請參閱 [編輯套件原始伺服器控制項](#package-origin-controls)。