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

静态加密

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 托管式密钥(由 Amazon ECR 管理),或者指定自己的 KMS 密钥(称为客户管理的密钥)。有关更多信息,请参阅 Amazon Simple Storage Service 用户指南中的借助使用在 Amazon KMS (SSE-KMS) 中存储 KMS 密钥的服务器端加密保护数据

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

创建启用 Amazon KMS 加密的存储库时,KMS 密钥用于加密存储库的内容。此外,Amazon ECR 添加 KMS 密钥的 Amazon KMS 授权,其中 Amazon ECR 存储库作为被授权委托人。

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

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

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

  3. 推送镜像时,GenerateDataKey 请求会发送到 Amazon KMS,其指定用于加密镜像层和清单的 KMS 密钥。

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

  5. 推送镜像时,Decrypt 请求会发送到 Amazon KMS,同时指定加密的数据密钥。

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

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

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

注意事项

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

  • 如果您使用 KMS 加密创建 Amazon ECR 存储库,并且未指定 KMS 密钥,则 Amazon ECR 预设情况下将使用带有别名 aws/ecr 的 Amazon 托管式密钥。首次创建启用 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 ECR 的 Amazon 托管式密钥。当使用 Amazon ECR 的 Amazon 托管 KMS 密钥加密存储库时,任何有权创建存储库的委托人也可以启用 Amazon KMS 加密。但是,删除存储库的 IAM 委托人必须具有 kms:RetireGrant 权限。这可在停用在创建存储库中已添加到 Amazon KMS 密钥的授权。

以下示例 IAM 策略可作为内联策略添加到用户,以确保用户具有删除启用加密的存储库所需的最低权限。可以使用资源参数指定用于加密存储库的 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 账户(根用户)。有关此示例密钥策略更多信息,请参阅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 账户必须具有 kms:CreateGrantkms:RetireGrantkms:DescribeKey 权限以及必要的 Amazon 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": "*" } }

监控 Amazon ECR 与 Amazon KMS 的集成

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

Amazon ECR 加密上下文

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

在其发送给 Amazon KMS 的 GenerateDataKeyDecrypt 请求中,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 CloudTrail 和 Amazon CloudWatch Logs),并将加密上下文用作在策略和授权中进行授权的条件。

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 授权

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

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

    输出包括 EncryptionContextSubset 以及存储库的 Amazon Resource Name (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