

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

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

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

任何想要允許不同套件新版本來自兩個內部來源的團隊，例如直接發佈和外部來源，例如公有儲存庫，都應考慮設定套件原始伺服器控制。根據預設，套件原始伺服器控制會根據套件的第一個版本新增至儲存庫的方式進行設定。如需套件原始控制設定及其預設值的詳細資訊，請參閱 [套件原始伺服器控制設定](#package-origin-control-settings)。

若要在使用 `put-package-origin-configuration` API 操作後移除套件記錄，請使用 `delete-package`（請參閱 [刪除套件或套件版本](delete-package.md))。

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

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

在下列案例中，*內部套件*是直接從套件管理員發佈到儲存庫的套件，例如您或您的團隊撰寫和維護的套件。*外部套件*是存在於公有儲存庫中的套件，可透過外部連線擷取到您的儲存庫。

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

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

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

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


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

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

在下圖中，*repoA* 是具有公有儲存庫外部連線的 CodeArtifact 儲存庫。您的儲存庫包含從公有儲存庫擷取的 3.0 版。您想要將 1.1 版發佈到您的儲存庫。一般而言，您可以將 1.2 版發佈至 *repoA*，但由於發佈設定為 **Block**，因此無法發佈 1.2 版。

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


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

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

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

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

**注意**  
在套件群組上設定原始伺服器控制項時，可用的設定和值會有所不同。如需詳細資訊，請參閱[套件群組原始伺服器控制](package-group-origin-controls.md)。

**發布**

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

**上游**

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

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

預設套件原始伺服器控制設定是根據套件相關聯的套件群組原始伺服器控制設定進行設定。如需套件群組和套件群組原始伺服器控制項的詳細資訊，請參閱 [在 CodeArtifact 中使用套件群組](package-groups.md)和 [套件群組原始伺服器控制](package-group-origin-controls.md)。

如果套件與每個限制類型的限制設定為 `ALLOW` 的套件群組相關聯，則套件的預設套件原始伺服器控制項將根據該套件的第一個版本如何新增至儲存庫。
+ 如果第一個套件版本是由套件管理員正確發佈，則設定會是 **Publish： ALLOW** 和 **Upstream： BLOCK**。
+ 如果從公有來源擷取第一個套件版本，則設定將是**發佈：封鎖**和**上游：允許**。

**注意**  
在 2022 年 5 月前後，CodeArtifact 儲存庫中存在的套件會有**發佈：允許**和**上游：允許**的預設套件原始伺服器控制。這類套件必須手動設定套件原始伺服器控制。目前預設值自那時起已在新套件上設定，並在 2022 年 7 月 14 日啟動此功能時開始強制執行。如需設定套件原始伺服器控制的詳細資訊，請參閱 [編輯套件原始伺服器控制項](#edit-package-origin-controls)。

否則，如果套件與具有至少一個限制設定 `BLOCK`或 的套件群組相關聯`ALLOW_SPECIFIC_REPOSITORIES`，則該套件的預設原始伺服器控制設定將設定為 **Publish： ALLOW** 和 **Upstream： ALLOW**。

## 套件原始伺服器控制如何與套件群組原始伺服器控制互動
<a name="package-origin-controls-interaction-package-groups"></a>

由於套件具有原始伺服器控制設定，且其相關聯的套件群組具有原始伺服器控制設定，因此請務必了解這兩個不同的設定如何彼此互動。

兩個設定之間的互動是 的設定`BLOCK`一律會勝過 的設定`ALLOW`。下表列出一些範例組態及其有效的原始伺服器控制設定。


| 套件原始伺服器控制設定 | 套件群組原始伺服器控制設定 | 有效的原始伺服器控制設定 | 
| --- | --- | --- | 
| PUBLISH：允許UPSTREAM：允許 | PUBLISH：允許UPSTREAM：允許 | PUBLISH：允許UPSTREAM：允許 | 
| PUBLISH：BLOCKUPSTREAM：允許 | PUBLISH：允許UPSTREAM：允許 | PUBLISH：BLOCKUPSTREAM：允許 | 
| PUBLISH：允許UPSTREAM：允許 | PUBLISH：允許UPSTREAM：封鎖 | PUBLISH：允許UPSTREAM：封鎖 | 

這表示原始伺服器設定為 **Publish： ALLOW** 和 **Upstream： ALLOW** 的套件，會有效地延遲至相關聯的套件群組原始伺服器控制設定。

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

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

**新增或編輯套件原始伺服器控制 （主控台）**

1. 開啟位於 https：//[https://console.aws.amazon.com/codesuite/codeartifact/home](https://console.aws.amazon.com/codesuite/codeartifact/home) 的 AWS CodeArtifact 主控台。

1. 在導覽窗格中，選擇**儲存庫**，然後選擇包含您要編輯之套件的儲存庫。

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

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

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

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

1. 如果您尚未設定 ， AWS CLI 請依照中的步驟進行設定[使用 AWS CodeArtifact 設定](get-set-up-for-codeartifact.md)。

1. 使用 `put-package-origin-configuration`命令來新增或編輯套件原始伺服器控制項。取代下列欄位：
   + 將 *my\$1domain* 取代為 CodeArtifact 網域，其中包含您要更新的套件。
   + 將 *my\$1repo* 取代為 CodeArtifact 儲存庫，其中包含您要更新的套件。
   + 將 *npm* 取代為您要更新的套件格式。
   + 將 *my\$1package* 取代為您要更新的套件名稱。
   + 將 *ALLOW* 和 *BLOCK* 取代為您想要的套件原始伺服器控制設定。

   ```
   aws codeartifact put-package-origin-configuration --domain my_domain \
   --repository my_repo --format npm --package my_package \ 
   --restrictions publish=ALLOW,upstream=BLOCK
   ```

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

CodeArtifact 不允許發佈可連線上游儲存庫或公有儲存庫中存在的套件版本。例如，假設您想要將 Maven 套件發佈`com.mycompany.mypackage:1.0`至儲存庫 `myrepo`，且`myrepo`具有與 Maven Central 外部連線的上游儲存庫。請考慮下列案例。

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

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

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