静态加密 - Amazon ECR
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

静态加密

Amazon ECR 将图像存储在 Amazon S3 管理的 Amazon ECR 存储桶中。默认情况下, Amazon ECR 使用具有 Amazon S3托管加密密钥的服务器端加密,该加密密钥使用 AES-256 加密算法对静态数据进行加密。这不需要您执行任何操作,并且无需额外付费。有关更多信息,请参阅 中的使用具有 Amazon S3 托管加密密钥的服务器端加密 (SSE-S3 Amazon Simple Storage Service 开发人员指南保护数据。

要更好地控制Amazon ECR存储库的加密,您可以使用具有 AWS Key Management Service (AWS KMS) 中存储的客户主密钥 (CMKs) 的服务器端加密。使用 AWS KMS 加密数据时,您可以使用由 管理的默认 AWS托管 Amazon ECRCMK,也可以指定您自己的 CMK(称为客户托管 CMK)。有关更多信息,请参阅 中的使用具有 AWS Key Management Service 中存储的服务器端加密 (SSE-KMS)CMKs Amazon Simple Storage Service 开发人员指南保护数据。

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

在创建存储库时启用AWS KMS加密,使用 CMK 加密存储库的内容。此外, 向 CMK Amazon ECR 添加AWS KMS授权,并将Amazon ECR存储库作为被授权委托人。

以下内容高度了解 如何与 Amazon ECR 集成AWS KMS以加密和解密您的存储库:

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

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

  3. 在推送映像时,会向 发出GenerateDataKey请求AWS KMS,以指定用于加密映像层和清单的 CMK。

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

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

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

  7. 中的数据密钥,用于在拉取图像层之前解密图像层。

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

Considerations

在将AWS KMS加密与 结合使用时,应考虑以下几点Amazon ECR。

  • 如果您使用 KMS 加密创建Amazon ECR存储库,并且未指定 CMK, Amazon ECR 默认AWS使用具有别名的 aws/ecr托管 CMK。当您首次创建启用了 KMS 加密的存储库时,将在您的账户中创建此 CMK。

  • 当您将 KMS 加密与您自己的 CMK 结合使用时,密钥必须与您的 存储库位于同一区域。

  • AWS KMS 强制实施每个 CMK 500 个授权的限制。因此,每个 CMK 的Amazon ECR存储库数量限制为 500 个。

  • 不应撤销 代表您Amazon ECR创建的授权。如果您撤销授予 使用您账户中的Amazon ECR密钥AWS KMS的权限的授权,则 Amazon ECR 无法访问此数据,对推送到存储库的新映像进行加密,或在推送时解密它们。当您撤销 的授权时Amazon ECR,更改将立即生效。要撤销访问权限,您应删除存储库,而不是撤销授权。删除存储库后, 将代表您Amazon ECR停用授权。

  • 使用 AWS KMS 密钥会产生关联的成本。有关更多信息,请参阅 AWS Key Management Service 定价.

所需的 IAM 权限

使用 创建或删除具有服务器端加密的 Amazon ECR 存储库时AWS KMS,所需的权限取决于您使用的特定客户主密钥 (CMK)。

使用适用于 的 IAM 托管 CMK 时所需的AWS权限 Amazon ECR

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

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

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

使用客户托管 CMK 时所需的IAM权限

在创建使用客户托管 CMK 启用了AWS KMS加密的存储库时,CMK 密钥策略和创建存储库的用户或角色的IAM策略都有必需的权限。

在创建您自己的 CMK 时,您可以使用 AWS KMS 创建的默认密钥策略,也可以指定您自己的密钥策略。要确保账户所有者可管理客户托管 CMK,该 CMK 的密钥策略应允许账户的根用户执行所有 AWS KMS 操作。其他范围限定的权限可以添加到密钥策略中,但至少应该向根用户授予管理 CMK 的权限。要仅允许将 CMK 用于源自 的请求Amazon ECR,您可以将 kms:ViaService 条件键ecr.<region>.amazonaws.com 值结合使用。

以下示例密钥策略向拥有 CMK 的 AWS 账户(根用户)授予对 CMK 的完全访问权限。有关此示例密钥策略的更多信息,请参阅 中的允许访问 AWS 账户并启用 IAM AWS Key Management Service Developer Guide策略

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

创建存储库IAM的用户IAM、角色或AWS账户必须具有 kms:CreateGrantkms:RetireGrantkms:DescribeKey 权限以及必要的Amazon ECR权限。

注意

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

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

{ "Version": "2012-10-17", "Id": "ecr-kms-permissions", "Statement": [ { "Sid": "Allow access to create and retire the grants associated with the key as well as describe the key", "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:RetireGrant", "kms:DescribeKey" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/b8d9ae76-080c-4043-92EXAMPLE" } ] }

允许用户在创建存储库时在控制台CMKs中列出

使用 Amazon ECR 控制台创建存储库时,您可以授予 权限,使用户能够在为存储库启用加密时列出CMKs区域中托管的客户。以下IAM策略示例显示了使用 控制台时列出 CMKs 和 别名所需的权限。

{ "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 以加密方式将加密上下文绑定到加密的数据。要解密数据,您必须传入相同的加密上下文。

在发送到 的 GenerateDataKeyDecrypt 请求中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" }

您可以使用加密上下文在审核记录和日志中标识这些加密操作(如 AWS CloudTrail 和 Amazon CloudWatch Logs),并将加密上下文用作在策略和授权中进行授权的条件。

Amazon ECR 加密上下文包含两个名称–值对。

  • s3 – 第一个名称–值对标识存储桶。密钥为 aws:s3:arn。 该值是Amazon S3存储桶的 Amazon 资源名称 (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 资源名称 (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"

Troubleshooting

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

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 命令列出在您的账户的特定区域中管理CMKs的 AWS 托管账户CMKs和客户。

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

    输出包含一个 EncryptionContextSubset ,其中包含存储库的 Amazon 资源名称 (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