本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
静态加密
Amazon ECR 将镜像存储在 Amazon ECR 管理的 Amazon S3 存储桶中。默认情况下,Amazon ECR 使用具有 Amazon S3 托管加密密钥的服务器端加密,从而使用 AES-256 加密算法对静态数据进行加密。这不需要您采取任何行动,且不会另外收取费用。有关更多信息,请参阅 Amazon Simple Storage Service 用户指南中的借助使用 Amazon S3 托管式加密密钥的服务器端加密 (SSE-S3) 保护数据。
为了更好地控制 Amazon ECR 存储库的加密,您可以使用服务器端加密,并使用存储在 Amazon Key Management Service ()Amazon KMS中的 KMS 密钥。在使用 Amazon KMS 加密数据时,您可以使用由 Amazon ECR 管理的默认 Amazon 托管式密钥密钥,也可以指定自己的 KMS 密钥(称为客户托管密钥)。有关更多信息,请参阅《亚马逊简单存储服务用户指南》中的使用服务器端加密和存储在 Amazon KMS (SSE-KMS) 中的 KMS 密钥保护数据。
每个 Amazon ECR 存储库都有一个加密配置,该配置在创建存储库时进行设置。您可以在每个存储库上使用不同的加密配置。有关更多信息,请参阅 创建 Amazon ECR 私有存储库来存储图像。
在启用 Amazon KMS 加密的情况下创建存储库时,将使用 KMS 密钥对存储库的内容进行加密。此外,Amazon ECR 还会向 KMS 密钥添加 Amazon KMS 授权,并将 Amazon ECR 存储库作为被授权者委托人。
以下内容提供了对 Amazon ECR 如何与 Amazon KMS 集成以加密和解密存储库的高层级理解:
-
创建存储库时,Amazon ECR 会向发送DescribeKey调用, Amazon KMS 以验证和检索加密配置中指定的 KMS 密钥的亚马逊资源名称 (ARN)。
-
Amazon ECR 向发送了两个CreateGrant请求 Amazon KMS ,要求在 KMS 密钥上创建授权,以允许 Amazon ECR 使用数据密钥加密和解密数据。
-
推送图像时,会向其发出GenerateData密钥请求 Amazon KMS ,指定用于加密图像层和清单的 KMS 密钥。
-
Amazon KMS 生成新的数据密钥,使用指定的 KMS 密钥对其进行加密,然后发送要与图像层元数据和图像清单一起存储的加密数据密钥。
-
拉取图像时,会向发出解密请求 Amazon KMS,指定加密的数据密钥。
-
Amazon KMS 解密加密的数据密钥并将解密后的数据密钥发送到 Amazon S3。
-
数据密钥用于在提取镜像层之前对其进行解密。
-
删除存储库后,Amazon ECR 会向发送两个RetireGrant请求,要求停 Amazon KMS 用为该存储库创建的授权。
注意事项
在 Amazon ECR 中使用 Amazon KMS 加密功能时,应考虑以下几点。
-
如果您创建采用 KMS 加密的 Amazon ECR 存储库,但未指定 KMS 密钥,则 Amazon ECR 会默认使用 Amazon 托管式密钥 带有别名
aws/ecr
的。首次创建启用 KMS 加密的存储库时,在您的账户中创建此 KMS 密钥。 -
当您将 KMS 加密与自己的 KMS 密钥结合使用时,密钥必须与您的存储库位于同一个区域中。
-
Amazon ECR 代表您创建的授权不应被撤销。如果您撤销授予 Amazon ECR 使用您账户中 Amazon KMS 密钥的权限,Amazon ECR 将无法访问这些数据、加密推送到存储库的新映像,也无法在提取时对其进行解密。当您撤销 Amazon ECR 授权时,更改将立即生效。要撤销访问权限,则应删除存储库,而不是撤销该授权。删除存储库后,Amazon ECR 会代表您停用授权。
-
使用 Amazon KMS 密钥需要付费。有关更多信息,请参阅Amazon Key Management Service 定价
。
所需的 IAM 权限
创建或删除使用 Amazon KMS进行服务器端加密的 Amazon ECR 存储库时,所需的权限取决于您正在使用的特定 KMS 密钥。
使用适用于 Amazon ECR 时需要 Amazon 托管式密钥 的 IAM 权限
默认情况下,如果为 Amazon ECR 存储库启用了 Amazon KMS 加密,但未指定 KMS 密钥,则使用 Amazon 托管式密钥 适用于 Amazon ECR 的。当使用 Amazon ECR 的 Amazon托管 KMS 密钥加密存储库时,任何有权创建存储库的委托人也可以在存储库上启用 Amazon KMS 加密。但是,删除存储库的 IAM 委托人必须具有 kms:RetireGrant
权限。这样可以停用创建存储库时添加到 Amazon 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 权限
使用客户托管密钥创建启用 Amazon KMS 加密功能的存储库时,创建存储库的用户或角色必须拥有 KMS 密钥策略和 IAM 策略的权限。
创建自己的 KMS 密钥时,您可以使用原定设置密钥策略 Amazon KMS 创建,也可以指定自己的密钥策略。为确保账户所有者可以管理客户托管的密钥,KMS 密钥的密钥策略应允许账户的根用户 Amazon KMS 执行所有操作。可以向密钥策略添加额外的作用域权限,但至少应向根用户授予管理 KMS 密钥的权限。要允许 KMS 密钥仅用于源自 Amazon ECR 的请求,您可以将 kms: ViaService 条件密钥与值一起使用。ecr.
<region>
.amazonaws.com
以下示例密钥策略为拥有 KMS 密钥的 Amazon 账户(根用户)提供了对 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": "*" } ] }
除了必要的 Amazon ECR 权限外,创建存储库的 IAM 用户kms:CreateGrant
kms:RetireGrant
、IAM 角色或 Amazon 账户还必须拥有、和kms:DescribeKey
权限。
注意
kms:RetireGrant
权限必须添加到创建存储库的用户或角色的 IAM policy 中。kms:CreateGrant
和 kms:DescribeKey
权限可以添加到 KMS 密钥的密钥策略或创建存储库的用户或角色的 IAM policy 中。有关 Amazon KMS 权限工作原理的更多信息,请参阅《Amazon Key Management Service 开发者指南》中的 Amazon KMS
API 权限:操作和资源参考。
以下示例 IAM policy 可作为内联策略添加到用户,以确保用户拥有创建启用加密的存储库所需的最低权限,并在完成存储库时删除存储库。可以使用资源参数指定用于加密存储库的 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 policy 示例显示了使用控制台时列出 KMS 密钥和别名所需的权限。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "kms:ListKeys", "kms:ListAliases", "kms:DescribeKey" ], "Resource": "*" } }
监控 Amazon ECR 与 Amazon KMS的集成
您可以使用 Amazon CloudTrail 来跟踪 Amazon ECR 代表您发送 Amazon KMS 的请求。日志中的 CloudTrail 日志条目包含加密上下文密钥,便于识别。
Amazon ECR 加密上下文
加密上下文 是一组包含任意非机密数据的键值对。当您在加密数据的请求中包含加密上下文时,会以加密 Amazon KMS 方式将加密上下文绑定到加密数据。要解密数据,您必须传入相同的加密上下文。
在对的 “密GenerateData钥” 和 “解密” 请求中, 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 存储桶的 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
发生这种情况时,您可以自己取消对存储库的 Amazon KMS 授权。
手动取消对存储库的 Amazon KMS 授权
-
列出用于存储库的 Amazon KMS 密钥的授权。
key-id
值包含在您从控制台收到的错误中。您还可以使用list-keys
命令列出账户中特定区域中的客户托管的 KMS 密钥 Amazon 托管式密钥 和客户托管的 KMS 密钥。aws kms list-grants \ --key-id
b8d9ae76-080c-4043-9237-c815bfc21dfc
--regionus-west-2
输出包括
EncryptionContextSubset
以及存储库的 Amazon Resource Name (ARN)。这可用于确定添加到密钥中的哪个授权是您想要停用的授权。GrantId
值将在下一步中停用授权时使用。 -
取消为存储库添加的 Amazon KMS 密钥的每项授权。将的值替换为
GrantId
上一步输出中的授权 ID。aws kms retire-grant \ --key-id
b8d9ae76-080c-4043-9237-c815bfc21dfc
\ --grant-idGrantId
\ --regionus-west-2