静态加密 - Amazon ECR

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

静态加密

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

为了更好地控制 Amazon ECR 存储库的加密,您可以使用服务器端加密,并使用存储在 AWS Key Management Service ()AWS KMS中的 KMS 密钥。在使用 AWS KMS 加密数据时,您可以使用由 Amazon ECR 管理的默认 AWS 托管式密钥密钥,也可以指定自己的 KMS 密钥(称为客户托管密钥)。有关更多信息,请参阅《亚马逊简单存储服务用户指南》中的使用服务器端加密和存储在 AWS KMS (SSE-KMS) 中的 KMS 密钥保护数据

每个 Amazon ECR 存储库都有一个加密配置,该配置在创建存储库时进行设置。您可以在每个存储库上使用不同的加密配置。有关更多信息,请参阅 创建私有存储库

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

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

  1. 创建存储库时,Amazon ECR 会向发送DescribeKey调用, AWS KMS 以验证和检索加密配置中指定的 KMS 密钥的亚马逊资源名称 (ARN)。

  2. Amazon ECR 向发送了两个CreateGrant请求 AWS KMS ,要求在 KMS 密钥上创建授权,以允许 Amazon ECR 使用数据密钥加密和解密数据。

  3. 推送图像时,系统会向发出GenerateDataKey请求 AWS KMS ,指定用于加密图像层和清单的 KMS 密钥。

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

  5. 拉取图像时,会向发出解密请求 AWS KMS,指定加密的数据密钥。

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

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

  8. 删除存储库后,Amazon ECR 会向发送两个RetireGrant请求,要求停 AWS KMS 用为该存储库创建的授权。

注意事项

在 Amazon ECR 中使用 AWS 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 定价

所需的 IAM 权限

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

使用适用于 Amazon ECR 时需要 AWS 托管式密钥 的 IAM 权限

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

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

{ "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 权限

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

创建自己的 KMS 密钥时,您可以使用原定设置密钥策略 AWS KMS 创建,也可以指定自己的密钥策略。为确保账户所有者可以管理客户托管的密钥,KMS 密钥的密钥策略应允许账户的根用户 AWS KMS 执行所有操作。可以向密钥策略添加额外的作用域权限,但至少应向根用户授予管理 KMS 密钥的权限。要允许 KMS 密钥仅用于源自 Amazon ECR 的请求,您可以将 kms: ViaService 条件密钥与值一起使用。ecr.<region>.amazonaws.com

以下示例密钥策略为拥有 KMS 密钥的 AWS 账户(根用户)提供了对 KMS 密钥的完全访问权限。有关此示例密钥策略的更多信息,请参阅AWS Key Management Service 开发人员指南中的允许访问 AWS 账户和启用 IAM 策略

{ "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:CreateGrantkms:RetireGrant、IAM 角色或 AWS 账户还必须拥有、和kms:DescribeKey权限。

注意

kms:RetireGrant 权限必须添加到创建存储库的用户或角色的 IAM policy 中。kms:CreateGrantkms:DescribeKey 权限可以添加到 KMS 密钥的密钥策略或创建存储库的用户或角色的 IAM policy 中。有关 AWS KMS 权限工作原理的更多信息,请参阅《AWS Key Management Service 开发者指南》中的 AWS KMS API 权限:操作和资源参考

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

{ "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 密钥

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

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

监控 Amazon ECR 与 AWS KMS的集成

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

Amazon ECR 加密上下文

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

在对的请求GenerateDataKey解密请求中, 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

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"

故障排除

使用控制台删除 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 值将在下一步中停用授权时使用。

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

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