

亚马逊 CodeCatalyst 不再向新买家开放。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [如何从中迁移 CodeCatalyst](migration.md)。

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

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

在 Amazon 中 CodeCatalyst，可以通过直接发布软件包版本、从上游存储库中提取包版本或通过网关从外部公共存储库摄取包版本来将其添加到包存储库中。如果您允许通过直接发布和从公有存储库摄取来添加程序包的版本，则您会容易受到依赖项替换攻击。有关更多信息，请参阅[依赖项替换攻击](#dependency-substitution-attacks)。为了保护自己免受依赖项替换攻击，请对存储库中的程序包配置程序包来源控制，从而限制将该程序包的版本添加到存储库的方式。

您应考虑配置程序包来源控制以使不同程序包的新版本同时来自内部来源（例如直接发布）和外部来源（例如公有存储库）。默认情况下，根据程序包的第一个版本添加到存储库的方式来配置程序包来源控制。

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

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

**发布**

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

**上游**

此设置配置了在程序包管理器发出请求时，是从外部的公有存储库中摄取程序包版本，还是在上游存储库中保留程序包版本。
+ **允许**：任何软件包版本都可以从配置为上游 CodeCatalyst 存储库的其他存储库中保留，也可以通过外部连接从公共来源获取。
+ **BLOCK**：Package 版本不能从配置为上游存储 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。由于软件包提取设置为 “**阻止**”，因此版本 3.0 不会提取到您的 CodeCatalyst 软件包存储库中，也无法供与其连接的包管理员使用。

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


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

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

在下图中，*RepoA* 是您的 CodeCatalyst 软件包存储库，与存储库有上游连接。`npm-public-registry-gateway`您的程序包存储库包含从公有存储库中摄取的版本 3.0。您想将版本 1.2 发布到您的程序包存储库。通常，您可以将版本 1.2 发布到 *repoA*，但是由于发布设置为**阻止**，因此无法发布版本 1.2。

![\[显示软件包发布已被阻止的简单图形。\]](http://docs.aws.amazon.com/zh_cn/codecatalyst/latest/userguide/images/packages/package-origin-controls-two.png)


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

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

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

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

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

1. 在导航窗格中，选择**程序包**。

1. 选择包含要编辑的程序包的程序包存储库。

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

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

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

1. 选择**保存**。

## 发布和上游存储库
<a name="package-publishing-upstreams"></a>

在中 CodeCatalyst，您无法发布存在于可访问的上游存储库或公共存储库中的软件包版本。例如，假设您要将 npm 程序包 `lodash@1.0` 发布到存储库 `myrepo`，并且 `myrepo` 有一个与 npmjs.com 进行外部连接的上游存储库。考虑以下场景。

1. `lodash` 上的程序包来源控制设置为**发布：允许**和**上游：允许**。如果存在`lodash@1.0`于上游存储库或 npmjs.com 中，则`myrepo`通过发出 CodeCatalyst 409 冲突错误来拒绝任何向其发布的尝试。您仍然可以发布另一个版本，例如 `lodash@1.1`。

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

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

## 依赖项替换攻击
<a name="dependency-substitution-attacks"></a>

程序包管理器简化了打包和共享可重用代码的过程。这些程序包可能是组织为了在其应用程序中使用而开发的私有程序包，也可能是公有程序包（通常是在组织外部开发并由公有程序包存储库分发的开源程序包）。在请求程序包时，开发人员依靠他们的程序包管理器来提取其依赖项的新版本。依赖项替换攻击也称为依赖项混淆攻击，该攻击利用了这样一个事实，即程序包管理器通常无法区分程序包的合法版本和恶意版本。

依赖项替换攻击是被称为软件供应链攻击的黑客攻击的其中一种形式。软件供应链攻击是一种利用软件供应链中任何地方的漏洞进行的攻击。

依赖项替换攻击可以针对任何人，包括使用内部开发的程序包和从公有存储库提取的程序包的用户。攻击者识别内部程序包名称，然后策略性地将同名的恶意代码放置在公有程序包存储库中。通常，恶意代码在版本号较高的程序包中发布。因为程序包管理器认为恶意程序包是程序包的最新版本，所以从这些公有源中提取恶意代码。这种行为会导致期望程序包和恶意程序包之间发生“混淆”或“替换”，进而导致代码被篡改。

为了防止依赖替换攻击，Amazon CodeCatalyst 提供了包裹来源控制。程序包来源控制是用于控制如何将程序包添加到存储库的设置。将新软件包的第一个软件包版本添加到 CodeCatalyst 存储库时，会自动配置控件。这些控件可以确保软件包版本不能既直接发布到您的存储库，也不能从公共来源获取，从而保护您免受依赖关系替换攻击。有关程序包来源控制以及如何更改该设置的更多信息，请参阅[编辑程序包来源控制](#package-origin-controls)。