

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

# 在 Amazon ECR 中为图片签名
签名图片

Amazon ECR 与 AWS Signer 集成，为您提供两种签名容器映像的方式：*托管签名*（自动，推荐）和*手动签名*（客户端）。您可以将容器镜像和签名存储在私有存储库中。

## 选择签名方法


Amazon ECR 支持两种签名容器镜像的方法：

**托管签名**（推荐）  
当图像推送到 Amazon ECR 时，托管签名会自动生成加密签名。此方法简化了设置。对于大多数用户来说，托管签名是推荐的方法。有关更多信息，请参阅 [托管签名](managed-signing.md)。

**手动签名**  
手动签名使用标记 CLI 和 AWS Signer 插件对图像进行签名，然后再将其推送到 Amazon ECR。此方法可以更好地控制签名过程，当您需要在推送工作流程之外对图像进行签名或需要对签名操作进行精细控制时，此方法非常有用。有关更多信息，请参阅 [手动签名](image-signing-manual.md)。

## 注意事项


使用 Amazon ECR 图像签名时，应考虑以下几点：
+ 存储库中存储的签名计入每个存储库的最大镜像数量的服务限额。在每个存储库的图像配额中，每个签名算作 1 个工件。有关更多信息，请参阅 [Amazon ECR 服务配额](service-quotas.md)。
+ 当存储库中存在引用构件时，Amazon ECR 生命周期策略将在主题映像删除后的 24 小时内自动清理这些构件。

# 托管签名
托管签名

当图像推送到 Amazon ECR 时，Amazon ECR 托管签名会使用签名器生成加密签名，从而自动对您的容[AWS 器](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html)映像进行签名。这样就无需安装和配置客户端工具，并允许您将签名作为注册表配置进行集中管理。

## 先决条件


要配置托管签名，您可以使用 Amazon ECR 创建签名配置，该配置引用一个或多个签名者签名配置文件，并可选择使用存储库筛选器来限制哪些存储库应对其映像进行签名。配置完成后，Amazon ECR 托管签名会在推送图像时自动使用推送图像的实体的身份对图像进行签名。

在配置托管签名之前，必须具备以下条件：
+ **签名者签名档案**-创建至少一个签[名者签名](https://docs.aws.amazon.com/signer/latest/developerguide/signing-profiles.html)档案。签名资料是一种独特的 AWS 签名者资源，可用于在 Amazon ECR 中执行签名操作。签名配置文件使您能够对代码工件（例如容器镜像和 AWS Lambda 部署包）进行签名和验证。每个签名配置文件都指定要登录的签名平台、平台 ID 和其他特定于平台的信息。例如，签名档案 ARN 如下所示：。`arn:partition:signer:region:account-id:/signing-profiles/profile-name`
+ **IAM 权限** — 推送映像的 IAM 委托人必须拥有必要的 IAM 权限才能访问相关的签名者签名资料和相关 ECR 存储库。您需要修改 IAM 委托人的基于身份的策略，使其包括 ECR 存储库操作和签名者签名操作的权限。以下示例策略显示了所需的权限：

```
{
   "Version": "2012-10-17",		 	 	 
   "Statement": [
   {
       "Sid":"UploadSignaturePermissions",
       "Effect":"Allow",
       "Action":[
           "ecr:CompleteLayerUpload",
           "ecr:UploadLayerPart",
           "ecr:InitiateLayerUpload",
           "ecr:BatchCheckLayerAvailability",
           "ecr:PutImage"
       ],
       "Resource":"arn:aws:ecr:region:account-id:repository/repository-name"
   },
   {
       "Sid": "SignPermissions",
       "Effect": "Allow",
       "Action": [
           "signer:SignPayload"
       ],
       "Resource": "arn:aws:signer:region:account-id:/signing-profiles/signing-profile-name"
   }
   ]
}
```

使用 Amazon ECR 托管签名，您可以创建多个签名规则（每个注册表最多 10 个），以创建更强的安全边界。例如，您可能运行多个构建管道，并希望限制每个管道可以签署哪些存储库。在每条规则中，您可以配置签名配置文件并指定存储库名称过滤器。当推送新图像时，Amazon ECR 会匹配哪个签名规则和签名配置文件可以对图像进行签名。如果有多个匹配项，Amazon ECR 会生成多个签名。

**注意**  
如果您手动验证签名，则仍需要安装 Notation CLI。

**注意**  
Amazon ECR 托管签名适用于所有支持使用签名 AWS 者进行容器镜像签名的 AWS 区域。

## 开始使用


按照以下步骤配置托管签名。您可以向 Amazon ECR 提供对签名者签名资料的引用，并可选择提供筛选条件，以限制哪些存储库应对其映像进行签名。

------
#### [ AWS 管理控制台 ]

使用以下步骤使用配置托管签名 AWS 管理控制台。

1. 打开 [Amazon ECR 控制台](https://console.aws.amazon.com/ecr/private-registry/repositories)。在左侧导航窗格中，选择**私有注册表**、**功能和设置**、**托管签名**。

1. 在**签名规则**页面上，选择**创建规则**。

1. 在 “**签名个人资料**” 页面的 **“选择 AWS 签名者个人资料”** 下，选择 “**创建新的 AWS 签名者个人资料**”，输入**个人资料名称**，然后根据需要更改**签名有效期**。然后选择**下一步**。

1. 在 “**筛选器**” 页面的 **“选择存储库”** 下，输入**存储库名称筛选器**。然后选择**下一步**。

1. 在 “**查看并创建**” 页面上，验证您输入的**AWS 签名者个人资料**和**存储库名称过滤器**。如果一切正确，请选择 “**保存**”。

------
#### [ AWS CLI ]

使用以下 AWS CLI 命令配置托管签名。
+ **创建签名规则**

  使用您的签名配置文件 ARN 创建签名配置。使用以下内容创建 JSON 文件：

  ```
  {
      "rules": [ 
          { 
              "signingProfileArn": "arn:aws:signer:region:account-id:/signing-profiles/profile-name",
              "repositoryFilters": [ 
                  { 
                      "filter": "test*",
                      "filterType": "WILDCARD_MATCH"
                  }
              ]
          }
      ]
  }
  ```

  然后运行以下命令：

  ```
  aws ecr --region region \
      put-signing-configuration \
      --signing-configuration file://signing-config.json
  ```

  您应该会看到包含签名配置的 API 响应。
+ **查看您的签名配置**

  检索您的签名配置：

  ```
  aws ecr --region region \
      get-signing-configuration
  ```

  您应该会看到包含签名配置的 API 响应。
+ **检查镜像签名状态**

  将图像推送到您的存储库。例如：

  ```
  docker pull ubuntu
  
  IMAGE_NAME="account-id.dkr.ecr.region.amazonaws.com/repository-name"
  IMAGE_TAG="${IMAGE_NAME}:test-1"
  
  docker tag ubuntu $IMAGE_TAG
  docker push $IMAGE_TAG
  ```

  推送后，使用您的图片标签查看签名状态：

  ```
  aws ecr --region region \
      describe-image-signing-status \
      --repository-name repository-name \
      --image-id imageTag=test-1
  ```

  如果存储库名称与签名配置中定义的存储库筛选条件相匹配，则您应该会在 API 响应中看到签名状态。如果状态为成功，您应该会看到签名已推送到您的存储库。
+ **删除您的签名配置**

  删除您的签名配置：

  ```
  aws ecr --region region \
      delete-signing-configuration
  ```

  您应该会看到包含已删除签名配置的 API 响应。

------

## 注意事项


以下限制和功能适用于托管签名：
+ **不支持跨区域签名** — 签名配置文件必须与您的 Amazon ECR 注册表位于同一区域。您不能使用一个区域的签名配置文件对位于其他区域的注册表中的图像进行签名。
+ **支持跨账户签名** — 签名资料可以与您的 Amazon ECR 注册表位于不同的账户中。这使组织能够集中管理签名配置文件，同时允许其他账户的开发者使用它们。有关更多信息，请参阅*AWS Signer 开发者*指南中的[为签名者设置跨账户签名](https://docs.aws.amazon.com/signer/latest/developerguide/signing-profile-cross-account.html)。
+ **签名无法签**名-您不能自己签署签名。只能对容器镜像进行签名。

# 签名验证
签名验证

在对容器镜像进行签名后，您可以验证签名以确保镜像未被篡改且来自可信来源。Amazon ECR 支持多种验证签名的方法：

## 使用 Amazon EKS 进行托管验证


Amazon EKS 为自动签名验证提供了原生集成。当您在 Amazon EKS 集群中配置签名验证时，该服务会在允许容器运行之前自动验证图像签名。有关配置签名[验证的更多信息，请参阅 *Amazon EKS 用户指南*中的部署期间验证容器映像签名](https://docs.aws.amazon.com/eks/latest/userguide/image-verification.html)。

## 适用于亚马逊 ECS 的 Lambda 准入控制器


Amazon ECS 提供服务生命周期挂钩，允许您在服务部署期间运行自定义逻辑。这些挂钩可以在部署过程中的特定时刻触发 AWS Lambda 函数，使您能够在允许服务启动之前验证容器映像签名。有关更多信息，请参阅*AWS Signer 开发人员指南*中的[验证 Amazon ECS 的容器镜像签名](https://docs.aws.amazon.com/signer/latest/developerguide/ecs-verification.html)。

## 使用记法 CLI 进行手动验证


您可以使用标记 CLI 手动验证签名。此方法要求您在本地计算机或验证环境中安装和配置 Notation CLI。有关使用 Notation CLI [验证图像的详细说明，请参阅*AWS Signer 开发者指南*中的登录后在本地验证镜](https://docs.aws.amazon.com/signer/latest/developerguide/image-verification.html)像。

## 为符号客户端配置身份验证


如果您使用手动签名或使用 Notation CLI 手动验证签名，则必须配置符号客户端，使其能够向 Amazon ECR 进行身份验证。如果您在安装 Notation 客户端的同一主机上安装了 Docker，那么 Notation 将重用您为 Docker 客户端使用的相同身份验证方法。Docker `login` 和`logout`命令将允许符号`sign`和`verify`命令使用相同的凭据，而且您不必单独对符号进行身份验证。有关配置 Notation 客户端进行身份验证的详细信息，请参阅 Notary Project 文档中的 [Authenticate with OCI-compliant registries](https://notaryproject.dev/docs/user-guides/how-to/registry-authentication/)。

如果您没有使用 Docker 或其他使用 Docker 凭证的工具，那么我们建议使用 Amazon ECR Docker 凭证助手作为您的凭证存储。有关如何安装和配置 Amazon ECR 凭证助手的更多信息，请参阅 [Amazon ECR Docker 凭证助手](https://github.com/awslabs/amazon-ecr-credential-helper)。

# 手动签名
手动签名

手动签名使用标记 CLI 和 AWS Signer 插件对图像进行签名，然后再将其推送到 Amazon ECR。此方法可以更好地控制签名过程，当您需要在推送工作流程之外对图像进行签名或需要对签名操作进行精细控制时，此方法非常有用。

有关使用 Notation CLI 签名容器镜像的详细说明 AWS Signer，请参阅[在 Signer 中对容器镜像进行签名](https://docs.aws.amazon.com/signer/latest/developerguide/container-workflow.html)和*AWS Signer 开发者指南*中的相关主题。

## 先决条件


在您开始之前，必须满足以下先决条件。
+ 安装并配置最新版本的 AWS CLI。有关更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[安装或更新最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。
+ 安装符号CLI和符号 AWS Signer 插件。有关更多信息，请参阅《AWS Signer 开发人员指南》**中的[对容器镜像进行签名的先决条件](https://docs.aws.amazon.com/signer/latest/developerguide/image-signing-prerequisites.html)。
+ 签署存储在 Amazon ECR 私有存储库中的容器镜像。有关更多信息，请参阅 [将映像推送至 Amazon ECR 私有存储库](image-push.md)。