

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 编辑程序包来源控制
<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。由于软件包提取设置为 “**阻止**”，因此版本 3.0 不会提取到您的 CodeArtifact 存储库中，也无法供与其连接的包管理员使用。

![\[一个简单的图形，显示了已阻止来自公有存储库的新外部程序包版本。\]](http://docs.aws.amazon.com/zh_cn/codeartifact/latest/ug/images/package-origin-controls-one.png)


**已为现有外部程序包发布内部程序包版本**

在此场景中，在外部的公有存储库中有一个名为 *packageB* 的程序包，已将该公有存储库连接到您的存储库。当连接到您的存储库的程序包管理器请求 *packageB* 时，从公有存储库中将程序包版本摄取到您的存储库中。由于这是 *packageB* 添加到存储库中的第一个程序包版本，因此程序包来源设置配置为**发布：阻止**和**上游：允许**。稍后，您尝试将具有相同程序包名称的版本发布到存储库。要么你不知道这个公共包并试图用同名发布一个不相关的包，要么你正在尝试发布一个经过补丁的版本，要么你正在尝试直接发布外部已经存在的确切包版本。 CodeArtifact 将拒绝您尝试发布的版本，但允许您显式覆盖拒绝并在必要时发布该版本。

在下图中，*RepoA* 是您的 CodeArtifact 存储库，它与公共存储库有外部连接。您的存储库包含从公有存储库中摄取的版本 3.0。您想将版本 1.1 发布到您的存储库。通常，您可以将版本 1.2 发布到 *repoA*，但是由于发布设置为**阻止**，因此无法发布版本 1.2。

![\[一个简单的图形，显示了已阻止来自公有存储库的新外部程序包版本。\]](http://docs.aws.amazon.com/zh_cn/codeartifact/latest/ug/images/package-origin-controls-two.png)


**发布现有外部程序包的已修补程序包版本**

在此场景中，在外部的公有存储库中有一个名为 *packageB* 的程序包，已将该公有存储库连接到您的存储库。当连接到您的存储库的程序包管理器请求 *packageB* 时，从公有存储库中将程序包版本摄取到您的存储库中。由于这是 *packageB* 添加到存储库中的第一个程序包版本，因此程序包来源设置配置为**发布：阻止**和**上游：允许**。您的团队确定需要将此程序包的已修补程序包版本发布到存储库。为了能够直接发布程序包版本，您的团队将程序包来源控制设置更改为**发布：允许**和**上游：阻止**。此程序包的版本现在可以直接发布到您的存储库并从公有存储库中摄取。在您的团队发布已修补的程序包版本后，您的团队会将程序包来源设置恢复为**发布：阻止**和**上游：允许**。

## 程序包来源控制设置
<a name="package-origin-control-settings"></a>

使用程序包来源控制，您可以配置将程序包版本添加到存储库的方式。以下列表包括可用的程序包来源控制设置和值。

**注意**  
对程序包组配置来源控制时，可用的设置和值会有所不同。有关更多信息，请参阅 [程序包组来源控制](package-group-origin-controls.md)。

**发布**

此设置配置了是否可以使用程序包管理器或类似工具将程序包版本直接发布到存储库。
+ **允许**：可以直接发布程序包版本。
+ **阻止**：不可以直接发布程序包版本。

**上游**

此设置配置了在程序包管理器发出请求时，是从外部的公有存储库中摄取程序包版本，还是在上游存储库中保留程序包版本。
+ **允许**：任何软件包版本都可以从配置为上游 CodeArtifact 存储库的其他存储库中保留，也可以通过外部连接从公共来源获取。
+ **BLOCK**：Package 版本不能从配置为上游存储 CodeArtifact 库的其他存储库中保留，也不能从具有外部连接的公共来源获取。

## 默认程序包来源控制设置
<a name="default-package-origin-control-settings"></a>

默认程序包来源控制设置是根据程序包的关联程序包组的来源控制设置进行配置的。有关程序包组和程序包组来源控制的更多信息，请参阅[在 CodeArtifact 中使用程序包组](package-groups.md)和[程序包组来源控制](package-group-origin-controls.md)。

如果程序包与程序包组关联，且每种限制类型的限制设置均为 `ALLOW`，则程序包的默认程序包来源控制将基于该程序包第一个版本添加到存储库中的方式。
+ 如果第一个程序包版本由程序包管理器直接发布，则设置将为**发布：允许**和**上游：阻止**。
+ 如果第一个程序包版本是从公有来源摄取，则设置将为**发布：阻止**和**上游：允许**。

**注意**  
2022 年 5 月左右之前存在于 CodeArtifact 存储库中的软件包的默认源控制为 “**发布：允许**” 和 “**上游：允许**”。必须手动为此类程序包设置程序包来源控制。从那时起，新的程序包开始采用当前的默认值，并于 2022 年 7 月 14 日推出该功能时开始强制执行。有关设置程序包来源控制的更多信息，请参阅[编辑程序包来源控制](#edit-package-origin-controls)。

否则，如果程序包与至少有一个限制设置设为 `BLOCK` 或 `ALLOW_SPECIFIC_REPOSITORIES` 的程序包组关联，则该程序包的默认来源控制设置将设为**发布：允许**和**上游：允许**。

## 程序包来源控制如何与程序包组来源控制交互
<a name="package-origin-controls-interaction-package-groups"></a>

由于程序包具有来源控制设置，其关联的程序包组也具有来源控制设置，因此了解这两种不同设置的彼此交互方式非常重要。

这两个设置之间的交互是：`BLOCK` 的设置始终优于 `ALLOW` 的设置。下表列出了一些示例配置及其有效的来源控制设置。


| 程序包来源控制设置 | 程序包组来源控制设置 | 有效的来源控制设置 | 
| --- | --- | --- | 
| 发布：允许上游：允许 | 发布：允许上游：允许 | 发布：允许上游：允许 | 
| 发布：阻止上游：允许 | 发布：允许上游：允许 | 发布：阻止上游：允许 | 
| 发布：允许上游：允许 | 发布：允许上游：阻止 | 发布：允许上游：阻止 | 

这意味着，如果一个程序包的来源设置设为**发布：允许**和**上游：允许**，那么它实际上是在遵循关联程序包组的来源控制设置。

## 编辑程序包来源控制
<a name="edit-package-origin-controls"></a>

根据程序包的第一个程序包版本添加到存储库的方式来自动配置程序包来源控制，有关更多信息，请参阅[默认程序包来源控制设置](#default-package-origin-control-settings)。要为 CodeArtifact 存储库中的软件包添加或编辑包源控件，请执行以下过程中的步骤。

**添加或编辑程序包来源控制（控制台）**

1. 在 [https://console.aws.amazon.com/codesuite/codeartifact](https://console.aws.amazon.com/codesuite/codeartifact/home) /hom AWS CodeArtifact e 打开控制台。

1. 在导航窗格中，选择**存储库**，然后选择包含了待编辑程序包的存储库。

1. 在**程序包**表中，搜索并选择要编辑的程序包。

1. 在程序包摘要页面的**来源控制**中，选择**编辑**。

1. 在**编辑来源控制**中，选择要为此程序包设置的程序包来源控制。必须同时设置两个程序包来源控制设置（“发布”和“上游”）。
   + 要允许直接发布程序包版本，请在**发布**中选择**允许**。要阻止发布程序包版本，请选择**阻止**。
   + 要允许从外部存储库摄取程序包和从上游存储库提取程序包，请在**上游来源**中选择**允许**。要阻止所有从外部存储库和上游存储库进行的程序包版本摄取和提取，请选择**阻止**。

**添加或编辑程序包来源控制 (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*替换为要更新的软件包的名称。
   + *BLOCK*用你想要的包裹来源控制设置替换*ALLOW*和。

   ```
   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` 上的程序包来源控制设置为**发布：允许**和**上游：允许**。如果存在`com.mycompany.mypackage:1.0`于上游存储库或 Maven Central 中，则 CodeArtifact 会拒绝任何向其发布的尝试，并出现 409 冲突错误。`myrepo`您仍然可以发布另一个版本，例如 `com.mycompany.mypackage:1.1`。

1. `com.mycompany.mypackage` 上的程序包来源控制设置为**发布：允许**和**上游：阻止**。您可以将 `com.mycompany.mypackage` 的任何版本发布到由于无法访问程序包版本而尚不存在该版本的存储库中。

1. `com.mycompany.mypackage` 上的程序包来源控制设置为**发布：阻止**和**上游：允许**。您不能直接将任何程序包版本发布到您的存储库。