

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

# 静态加密
<a name="encryption-at-rest"></a>

**重要**  
 使用 AWS KMS (DSSE-KMS) 的双层服务器端加密仅在区域中 AWS GovCloud (US) 可用。

Amazon ECR 将镜像存储在 Amazon ECR 管理的 Amazon S3 存储桶中。默认情况下，Amazon ECR 使用具有 Amazon S3 托管加密密钥的服务器端加密，从而使用 AES-256 加密算法对静态数据进行加密。这不需要您采取任何行动，且不会另外收取费用。有关更多信息，请参阅 *Amazon Simple Storage Service 用户指南*中的[借助使用 Amazon S3 托管式加密密钥的服务器端加密 (SSE-S3) 保护数据](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html)。

为了更好地控制 Amazon ECR 存储库的加密，您可以使用服务器端加密，并使用存储在 AWS Key Management Service ()AWS KMS中的 KMS 密钥。在使用 AWS KMS 加密数据时，您可以使用由 Amazon ECR 管理的默认 AWS 托管式密钥密钥，也可以指定自己的 KMS 密钥（称为客户托管密钥）。有关更多信息，请参阅《*亚马逊简单存储服务*[用户指南》中的使用服务器端加密和存储在 AWS KMS (SSE-KMS) 中的 KMS 密钥保护数据](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html)。

 您可以选择使用双层服务器端加密（）对您的 Amazon ECR 映像应用两层加 AWS KMS 密。DSSE-KMS DSSE-KMS选项类似于SSE-KMS，但应用的是两个单独的加密层，而不是一层。有关更多信息，请参阅[使用带 AWS KMS 密钥的双层服务器端加密 (DSS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingDSSEncryption.html) E-KMS)。

每个 Amazon ECR 存储库都有一个加密配置，该配置在创建存储库时进行设置。您可以在每个存储库上使用不同的加密配置。有关更多信息，请参阅 [创建 Amazon ECR 私有存储库以存储映像](repository-create.md)。

在启用 AWS KMS 加密的情况下创建存储库时，将使用 KMS 密钥对存储库的内容进行加密。此外，Amazon ECR 还会向 KMS 密钥添加 AWS KMS 授权，并将 Amazon ECR 存储库作为被授权者委托人。

以下内容提供了对 Amazon ECR 如何与 AWS KMS 集成以加密和解密存储库的高层级理解：

1. 创建存储库时，Amazon ECR 会向发送[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)调用， AWS KMS 以验证和检索加密配置中指定的 KMS 密钥的亚马逊资源名称 (ARN)。

1. Amazon ECR 向发送了两个[CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)请求 AWS KMS ，要求在 KMS 密钥上创建授权，以允许 Amazon ECR 使用数据密钥加密和解密数据。

1. 推送图像时，系统会向发出[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)请求 AWS KMS ，指定用于加密图像层和清单的 KMS 密钥。

1. AWS KMS 生成新的数据密钥，使用指定的 KMS 密钥对其进行加密，然后发送要与图像层元数据和图像清单一起存储的加密数据密钥。

1. 拉取图像时，会向发出[解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)请求 AWS KMS，指定加密的数据密钥。

1. AWS KMS 解密加密的数据密钥并将解密后的数据密钥发送到 Amazon S3。

1. 数据密钥用于在提取镜像层之前对其进行解密。

1. 删除存储库后，Amazon ECR 会向发送两个[RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html)请求，要求停 AWS KMS 用为该存储库创建的授权。

## 注意事项
<a name="encryption-at-rest-considerations"></a>

在 Amazon ECR 中使用 AWS KMS 基于基础的加密（SSE-KMS或DSSE-KMS）时，应考虑以下几点。
+ 如果您创建采用 KMS 加密的 Amazon ECR 存储库，但未指定 KMS 密钥，则 Amazon ECR 会默认使用 AWS 托管式密钥 带有别名`aws/ecr`的。首次创建启用 KMS 加密的存储库时，在您的账户中创建此 KMS 密钥。
+  创建存储库后，将无法更改存储库加密配置。
+ 当您将 KMS 加密与自己的 KMS 密钥结合使用时，密钥必须与您的存储库位于同一个区域中。
+ Amazon ECR 代表您创建的授权不应被撤销。如果您撤销授予 Amazon ECR 使用您账户中 AWS KMS 密钥的权限，Amazon ECR 将无法访问这些数据、加密推送到存储库的新映像，也无法在提取时对其进行解密。当您撤销 Amazon ECR 授权时，更改将立即生效。要撤销访问权限，则应删除存储库，而不是撤销该授权。删除存储库后，Amazon ECR 会代表您停用授权。
+ 使用 AWS KMS 密钥需要付费。有关更多信息，请参阅[AWS Key Management Service 定价](https://aws.amazon.com/kms/pricing/)。
+ 使用双层服务器端加密将产生费用。有关更多信息，请参阅 [Amazon ECR 定价](https://aws.amazon.com/ecr/pricing/)。

## 所需的 IAM 权限
<a name="encryption-at-rest-iam"></a>

创建或删除使用 AWS KMS进行服务器端加密的 Amazon ECR 存储库时，所需的权限取决于您正在使用的特定 KMS 密钥。

### 使用适用于 Amazon ECR 时需要 AWS 托管式密钥 的 IAM 权限
<a name="encryption-aws-managed-key"></a>

默认情况下，如果为 Amazon ECR 存储库启用了 AWS KMS 加密，但未指定 KMS 密钥，则使用 AWS 托管式密钥 适用于 Amazon ECR 的。当使用 Amazon ECR 的 AWS托管 KMS 密钥加密存储库时，任何有权创建存储库的委托人也可以在存储库上启用 AWS KMS 加密。但是，删除存储库的 IAM 委托人必须具有 `kms:RetireGrant` 权限。这样可以停用创建存储库时添加到 AWS KMS 密钥中的授权。

以下示例 IAM policy 可作为内联策略添加到用户，以确保用户具有删除启用加密的存储库所需的最低权限。可以使用资源参数指定用于加密存储库的 KMS 密钥。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "ecr-kms-permissions",
    "Statement": [
        {
            "Sid": "AllowAccessToRetireTheGrantsAssociatedWithTheKey",
            "Effect": "Allow",
            "Action": [
                "kms:RetireGrant"
            ],
            "Resource": "arn:aws:kms:us-west-2:111122223333:key/b8d9ae76-080c-4043-92EXAMPLE"
        }
    ]
}
```

------

### 使用客户托管密钥时所需的 IAM 权限
<a name="encryption-customer-managed-key"></a>

使用客户托管密钥创建启用 AWS KMS 加密功能的存储库时，创建存储库的用户或角色必须拥有 KMS 密钥策略和 IAM 策略的权限。

创建自己的 KMS 密钥时，您可以使用原定设置密钥策略 AWS KMS 创建，也可以指定自己的密钥策略。为确保账户所有者可以管理客户托管的密钥，KMS 密钥的密钥策略应允许账户的根用户 AWS KMS 执行所有操作。可以向密钥策略添加额外的作用域权限，但至少应向根用户授予管理 KMS 密钥的权限。要允许 KMS 密钥仅用于源自 Amazon ECR 的请求，您可以将 kms[: ViaService 条件密钥与值](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service)一起使用。`ecr.<region>.amazonaws.com`

以下示例密钥策略为拥有 KMS 密钥的 AWS 账户（根用户）提供了对 KMS 密钥的完全访问权限。有关此示例密钥策略的更多信息，请参阅*AWS Key Management Service 开发人员指南*[中的允许访问 AWS 账户和启用 IAM 策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-root-enable-iam)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "ecr-key-policy",
    "Statement": [
        {
            "Sid": "EnableIAMUserPermissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        }
    ]
}
```

------

除了必要的 Amazon ECR 权限外，创建存储库的 IAM 用户`kms:CreateGrant``kms:RetireGrant`、IAM 角色或 AWS 账户还必须拥有、和`kms:DescribeKey`权限。

**注意**  
`kms:RetireGrant` 权限必须添加到创建存储库的用户或角色的 IAM policy 中。`kms:CreateGrant` 和 `kms:DescribeKey` 权限可以添加到 KMS 密钥的密钥策略或创建存储库的用户或角色的 IAM policy 中。有关 AWS KMS 权限工作原理的更多信息，请参阅《*AWS Key Management Service 开发者指南》*中的 [AWS KMS API 权限：操作和资源参考](https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html)。

以下示例 IAM policy 可作为内联策略添加到用户，以确保用户拥有创建启用加密的存储库所需的最低权限，并在完成存储库时删除存储库。可以使用资源参数指定用于加密存储库的 AWS KMS key 。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "ecr-kms-permissions",
    "Statement": [
        {
            "Sid": "AllowAccessToCreateAndRetireTheGrantsAssociatedWithTheKeyAsWellAsDescribeTheKey",
            "Effect": "Allow",
            "Action": [
                "kms:CreateGrant",
                "kms:RetireGrant",
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:us-west-2:111122223333:key/b8d9ae76-080c-4043-92EXAMPLE"
        }
    ]
}
```

------

### 创建存储库时，允许用户在控制台中列出 KMS 密钥
<a name="encryption-at-rest-iam-example"></a>

使用 Amazon ECR 控制台创建存储库时，您可以授予权限，允许用户在启用存储库加密时于区域中列出客户托管的 KMS 密钥。以下 IAM policy 示例显示了使用控制台时列出 KMS 密钥和别名所需的权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:ListKeys",
      "kms:ListAliases",
      "kms:DescribeKey"
    ],
    "Resource": "*"
  }
}
```

------

## 监控 Amazon ECR 与之的互动 AWS KMS
<a name="encryption-at-rest-monitoring"></a>

您可以使用 AWS CloudTrail 来跟踪 Amazon ECR 代表您发送 AWS KMS 的请求。日志中的 CloudTrail 日志条目包含加密上下文密钥，便于识别。

### Amazon ECR 加密上下文
<a name="ecr-encryption-context"></a>

*加密上下文* 是一组包含任意非机密数据的键值对。当您在加密数据的请求中包含加密上下文时，会以加密 AWS KMS 方式将加密上下文绑定到加密数据。要解密数据，您必须传入相同的加密上下文。

在对的请求[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)和[解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)请求中， AWS KMS Amazon ECR 使用具有两个名称值对的加密上下文，用于标识存储库和正在使用的 Amazon S3 存储桶。如以下示例所示。名称不会变化，但与其组合的加密上下文会因每个值而异。

```
"encryptionContext": {
    "aws:s3:arn": "arn:aws:s3:::us-west-2-starport-manifest-bucket/EXAMPLE1-90ab-cdef-fedc-ba987BUCKET1/sha256:a7766145a775d39e53a713c75b6fd6d318740e70327aaa3ed5d09e0ef33fc3df",
    "aws:ecr:arn": "arn:aws:ecr:us-west-2:111122223333:repository/repository-name"
}
```

您可以使用加密上下文在审计记录和日志（例如和 Amazon CloudWatch Logs）中识别这些加密操作，并作为策略和授权中的授权条件。[AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)

Amazon ECR 加密上下文包含两个名称–值对。
+ **aws:s3:arn** – 第一个名称 - 值对标识存储桶。键是 `aws:s3:arn`。值是 Amazon S3 存储桶的 Amazon Resource Name (ARN)。

  ```
  "aws:s3:arn": "ARN of an Amazon S3 bucket"
  ```

  例如，如果存储桶的 ARN 是 `arn:aws:s3:::us-west-2-starport-manifest-bucket/EXAMPLE1-90ab-cdef-fedc-ba987BUCKET1/sha256:a7766145a775d39e53a713c75b6fd6d318740e70327aaa3ed5d09e0ef33fc3df`，加密上下文将包括以下对。

  ```
  "arn:aws:s3:::us-west-2-starport-manifest-bucket/EXAMPLE1-90ab-cdef-fedc-ba987BUCKET1/sha256:a7766145a775d39e53a713c75b6fd6d318740e70327aaa3ed5d09e0ef33fc3df"
  ```
+ **aws:ecr:arn** – 第二个名称 - 值对标识存储库的 Amazon Resource Name (ARN)。键是 `aws:ecr:arn`。值是存储库的 ARN。

  ```
  "aws:ecr:arn": "ARN of an Amazon ECR repository"
  ```

  例如，如果储存库的 ARN 是 `arn:aws:ecr:us-west-2:111122223333:repository/repository-name`，加密上下文将包括以下对。

  ```
  "aws:ecr:arn": "arn:aws:ecr:us-west-2:111122223333:repository/repository-name"
  ```

## 问题排查
<a name="encryption-at-rest-troubleshooting"></a>

使用控制台删除 Amazon ECR 存储库时，如果存储库已成功删除，但 Amazon ECR 无法停用添加到存储库 KMS 密钥的授权，您将收到以下错误消息。

```
The repository [{repository-name}] has been deleted successfully but the grants created by the kmsKey [{kms_key}] failed to be retired
```

发生这种情况时，您可以自己取消对存储库的 AWS KMS 授权。

**手动取消对存储库的 AWS KMS 授权**

1. 列出用于存储库的 AWS KMS 密钥的授权。`key-id` 值包含在您从控制台收到的错误中。您还可以使用`list-keys`命令列出账户中特定区域中的客户托管的 KMS 密钥 AWS 托管式密钥 和客户托管的 KMS 密钥。

   ```
   aws kms list-grants \
        --key-id b8d9ae76-080c-4043-9237-c815bfc21dfc 
        --region us-west-2
   ```

   输出包括 `EncryptionContextSubset` 以及存储库的 Amazon Resource Name (ARN)。这可用于确定添加到密钥中的哪个授权是您想要停用的授权。`GrantId` 值将在下一步中停用授权时使用。

1. 取消为存储库添加的 AWS KMS 密钥的每项授权。将的值替换为*GrantId*上一步输出中的授权 ID。

   ```
   aws kms retire-grant \
        --key-id b8d9ae76-080c-4043-9237-c815bfc21dfc \
        --grant-id GrantId \
        --region us-west-2
   ```