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

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

静态加密

重要

双层服务器端加密,使用 ( Amazon KMS DSSE-KMS) 仅在 Amazon GovCloud (US) 地区可用。

亚马逊ECR将图像存储在亚马逊ECR管理的 Amazon S3 存储桶中。默认情况下,Amazon ECR 使用服务器端加密和 Amazon S3 托管的加密密钥,使用 -256 加密算法对您的静态数据进行AES加密。这不需要您采取任何行动,且不会另外收取费用。有关更多信息,请参阅《亚马逊简单存储服务用户指南》中的使用 Amazon S3 托管加密密钥 (SSE-S3) 的服务器端加密保护数据

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

您可以选择使用双层服务器端加密对您的 Amazon ECR 图像应用两层加密,其中包括 ( Amazon KMS DSSE-KMS). DSSE-KMS 选项类似于 SSE-KMS,但应用两个单独的加密层,而不是一层。有关更多信息,请参阅使用带 Amazon KMS 密钥的双层服务器端加密 (DSSE-KMS)

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

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

以下内容概述了如何与 Amaz ECR on 集成 Amazon KMS 以加密和解密您的存储库:

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

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

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

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

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

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

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

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

注意事项

使用 Amazon KMS 基于基础的加密时应考虑以下几点 (SSE-KMS 或者 DSSE-KMS) 与亚马逊合作ECR。

  • 如果您创建使用KMS加密功能的 Amazon ECR 存储库,但未指定KMS密钥,则aws/ecr默认情况下,Amazon 会ECR使用 Amazon 托管式密钥 带别名的。此KMS密钥是在您首次创建启用KMS加密的存储库时在您的账户中创建的。

  • 创建存储库后,将无法更改存储库加密配置。

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

  • Amazon 代表您ECR创建的补助金不应被撤销。如果您撤销授予亚马逊使用您账户中 Amazon KMS 密钥的ECR权限,亚马逊将ECR无法访问这些数据,也无法加密推送到存储库的新图像,也无法在提取时对其进行解密。当您撤销对 Amazon 的拨款时ECR,更改会立即生效。要撤销访问权限,则应删除存储库,而不是撤销该授权。删除存储库后,Amaz ECR on 会代表您取消授权。

  • 使用 Amazon KMS 密钥会产生一定的费用。有关更多信息,请参阅 Amazon Key Management Service 定价

  • 使用双层服务器端加密将产生费用。有关更多信息,请参阅 Amazon ECR 定价

所需IAM权限

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

使用 Amazon 版 Amazon 托管式密钥 时所需的IAM权限 ECR

默认情况下,当对亚马逊ECR存储库启用 Amazon KMS 加密但未指定KMS密钥时,将使用 f Amazon 托管式密钥 or ECR Amazon。当使用 Amazon ECR 的 Amazon托管KMS密钥加密存储库时,任何有权创建存储库的委托人也可以在存储库上启用 Amazon KMS 加密。但是,删除存储库的IAM委托人必须拥有该kms:RetireGrant权限。这样可以停用创建存储库时添加到 Amazon KMS 密钥中的授权。

以下示例IAM策略可以作为内联策略添加到用户,以确保他们拥有删除启用加密的存储库所需的最低权限。可以使用 resource 参数指定用于加密存储库的密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权限

使用客户托管密钥创建启用 Amazon KMS 加密功能的存储库时,密KMS钥策略和创建存储库的用户或角色的IAM策略都需要权限。

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

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

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

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

注意

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

以下示例IAM策略可以作为内联策略添加到用户,以确保他们拥有创建启用加密的存储库并在完成存储库后删除存储库所需的最低权限。可以使用资源参数指定用于加密存储库的 Amazon 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策略示例显示了使用控制台时列出KMS密钥和别名所需的权限。

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

监控亚马逊与之的ECR互动 Amazon KMS

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

Amazon ECR 加密环境

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

在对的请求GenerateDataKey解密请求中, Amazon 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)中识别这些加密操作,并作为策略和授权中的授权条件。Amazon CloudTrail

Amazon ECR 加密上下文由两个名称/值对组成。

  • aws:s3:arn – 第一个名称 - 值对标识存储桶。键是 aws:s3:arn。该值是 Amazon S3 存储桶的亚马逊资源名称 (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 — 第二个名称-值对标识存储库的亚马逊资源名称 ()。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

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

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

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

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

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

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