编辑程序包来源控制 - CodeArtifact

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

编辑程序包来源控制

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

任何想要允许不同程序包的新版本同时来自内部来源(例如直接发布)和外部来源(例如公有存储库)的团队都应考虑配置程序包来源控制。默认情况下,根据程序包的第一个版本添加到存储库的方式来配置程序包来源控制。有关程序包来源控制设置及其默认值的信息,请参阅程序包来源控制设置

要在使用 put-package-origin-configuration API 操作后删除程序包记录,请使用 delete-package(请参阅删除软件包或软件包版本)。

常见的程序包访问控制场景

本节包括将软件包版本添加到 CodeArtifact 存储库时的一些常见场景。根据第一个程序包版本的添加方式为新程序包设置程序包来源控制设置。

在以下场景中,内部程序包是直接从程序包管理器发布到存储库的程序包,例如由您或您的团队创作和维护的程序包。外部程序包是存在于公有存储库中的程序包,可以通过外部连接将其摄取到您的存储库中。

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

在此场景中,考虑一个内部程序包 packageA。您的团队将 PackageA 的第一个软件包版本发布到存储库。 CodeArtifact 由于这是该程序包的第一个程序包版本,因此程序包来源控制设置会自动设置为发布:允许上游:阻止。当软件包存在于您的存储库中后,会将同名的包发布到与您的存储库连接的公共 CodeArtifact 存储库中。这可能是针对内部程序包的企图依赖项替换攻击,也可能只是巧合。无论如何,配置程序包来源控制来阻止摄取新的外部版本,从而保护自己免受潜在的攻击。

在下图中,RepoA 是您的 CodeArtifact 存储库,它与公共存储库有外部连接。您的存储库包含 packageA 的版本 1.1 和 2.1,但版本 3.0 已发布到公有存储库。通常,repoA 会在程序包管理器请求程序包后摄取版本 3.0。由于软件包提取设置为 “阻止”,因此版本 3.0 不会提取到您的 CodeArtifact 存储库中,也无法供与其连接的包管理员使用。

一个简单的图形,显示了已阻止来自公有存储库的新外部程序包版本。

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

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

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

一个简单的图形,显示了已阻止来自公有存储库的新外部程序包版本。

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

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

程序包来源控制设置

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

注意

在包裹组上配置源控件时,可用的设置和值会有所不同。有关更多信息,请参阅 Package 组原产地控制

Publish

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

  • 允许:可以直接发布程序包版本。

  • 阻止:不可以直接发布程序包版本。

上游

此设置配置了在程序包管理器发出请求时,是从外部的公有存储库中摄取程序包版本,还是在上游存储库中保留程序包版本。

  • 允许:任何软件包版本都可以从配置为上游 CodeArtifact 存储库的其他存储库中保留,也可以通过外部连接从公共来源获取。

  • BLOCK:Package 版本不能从配置为上游存储 CodeArtifact 库的其他存储库中保留,也不能从具有外部连接的公共来源获取。

默认程序包来源控制设置

默认的包裹来源控制设置是根据包裹的关联包裹组的起源控制设置进行配置的。有关包裹组和包裹组来源控制的更多信息,请参阅在中使用软件包组 CodeArtifactPackage 组原产地控制

如果某个包与包组相关联,且每种限制类型的限制设置均为,则包的默认包源控制将基于该软件包的第一个版本添加到存储库中的方式。ALLOW

  • 如果第一个程序包版本由程序包管理器直接发布,则设置将为发布:允许上游:阻止

  • 如果第一个程序包版本是从公有来源摄取,则设置将为发布:阻止上游:允许

注意

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

否则,如果某个包与至少有一个限制设置为的包裹组相关联BLOCK,则该包的默认来源控制设置将设置为 “发布:允许” 和 “上游:允许”。

包裹来源控件如何与包裹组起源控件交互

由于包裹具有起源控制设置,并且其关联的包裹组具有起源控制设置,因此了解这两种不同的设置是如何相互作用的,这一点很重要。

这两个设置之间的交互作用是,设置为BLOCK总是胜过设置为ALLOW。下表列出了一些示例配置及其有效的起源控制设置。

Package 原产地控制设置 Package 组原产地控制设置 有效的原点控制设置

发布:允许

上游:允许

发布:允许

上游:允许

发布:允许

上游:允许

发布:屏蔽

上游:允许

发布:允许

上游:允许

发布:屏蔽

上游:允许

发布:允许

上游:允许

发布:允许

上游:阻止

发布:允许

上游:阻止

这意味着,如果一个包的源设置为 “发布:允许” 和 “上游:允许”,那么它实际上是在服从关联包组的起源控制设置。

编辑程序包来源控制

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

添加或编辑程序包来源控制(控制台)
  1. 打开 AWS CodeArtifact 控制台,网址为 https://console.aws.amazon.com/codesuite/codeartifact/home

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

  3. 程序包表中,搜索并选择要编辑的程序包。

  4. 在程序包摘要页面的来源控制中,选择编辑

  5. 编辑来源控制中,选择要为此程序包设置的程序包来源控制。必须同时设置两个程序包来源控制设置(“发布”和“上游”)。

    • 要允许直接发布程序包版本,请在发布中选择允许。要阻止发布程序包版本,请选择阻止

    • 要允许从外部存储库摄取程序包和从上游存储库提取程序包,请在上游来源中选择允许。要阻止所有从外部存储库和上游存储库进行的程序包版本摄取和提取,请选择阻止

添加或编辑程序包来源控制 (AWS CLI)
  1. 如果还没有,请 AWS CLI 按照中的步骤进行配置使用进行设置 AWS CodeArtifact

  2. 使用 put-package-origin-configuration 命令来添加或编辑程序包来源控制。替换以下字段:

    • my_dom ain 替换为包含要更新的软件包的 CodeArtifact 域名。

    • my_repo 替换为包含要更新的软件包的 CodeArtifact 存储库。

    • npm 替换为要更新的程序包的程序包格式。

    • my_package 替换为要更新的程序包的名称。

    • ALLOWBLOCK 替换为期望的程序包来源控制设置。

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

发布和上游存储库

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

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

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