AWS Key Management Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon WorkSpaces 如何使用 AWS KMS

您可以使用 Amazon WorkSpaces 您的每个最终用户预置一个基于云的桌面 (WorkSpace)。当您启动新的 WorkSpace 时,可以选择对其卷进行加密,并决定使用哪个 AWS KMS 客户主密钥 (CMK) 进行加密。您可以选择适用于 Amazon WorkSpaces 的 AWS 托管 CMK (aws/workspaces) 或客户托管 CMK。

有关创建使用加密卷的 WorkSpace 的更多信息,请转到 Amazon WorkSpaces Administration Guide 中的加密 WorkSpace

使用 AWS KMS 的 Amazon WorkSpaces 加密概述

当您创建使用加密卷的 WorkSpace 时,Amazon WorkSpaces 将使用 Amazon Elastic Block Store (Amazon EBS) 创建和管理这些卷。这两种服务都使用您的 KMS 客户主密钥 (CMK) 来处理加密的卷。有关 EBS 卷加密的更多信息,请参阅以下文档:

当您启动使用加密卷的 WorkSpace 时,端到端过程的工作方式如下所示:

  1. 您指定用于加密的 CMK,以及 WorkSpace 的用户和目录。该操作创建一个授权,允许 Amazon WorkSpaces 将您的 CMK 仅用于此 WorkSpace—即仅用于与指定用户和目录相关联的 WorkSpace。

  2. Amazon WorkSpaces 为 WorkSpace 创建加密的 EBS 卷,并指定要使用的 CMK,以及该卷的用户和目录(与您在步骤 1 中指定的信息相同)。该操作创建一个授权,允许 Amazon EBS 将您的 CMK 仅用于此 WorkSpace 和卷—即仅用于与指定用户和目录相关联的 WorkSpace,以及指定的卷。

  3. Amazon EBS 请求使用您的 CMK 加密的卷数据密钥,并指定 WorkSpace 用户的 Sid 和目录 ID 以及卷 ID 作为加密上下文。

  4. AWS KMS 创建新的数据密钥,使用您的 CMK 对其进行加密,然后将加密的数据密钥发送到 Amazon EBS。

  5. Amazon WorkSpaces 使用 Amazon EBS 将加密的卷附加到您的 WorkSpace。Amazon EBS 将加密的数据密钥发送到具有 Decrypt 请求的 AWS KMS,并指定 WorkSpace 用户的 Sid、其目录 ID 和卷 ID(用作加密上下文)。

  6. AWS KMS 使用您的 CMK 解密数据密钥,然后将纯文本数据密钥发送到 Amazon EBS。

  7. Amazon EBS 使用纯文本数据密钥加密所有传入和传出加密卷的数据。只要卷附加在 WorkSpace 上,Amazon EBS 就会将纯文本数据密钥保存在内存中。

  8. Amazon EBS 将加密的数据密钥(在步骤 4 中收到)与卷元数据存储在一起,以供将来重启或重建 WorkSpace 时使用。

  9. 当使用 AWS 管理控制台删除 WorkSpace(或使用 Amazon WorkSpaces API 中的 TerminateWorkspaces 操作)时,Amazon WorkSpaces 和 Amazon EBS 将停用允许它们针对该 WorkSpace 使用 CMK 的授权。

Amazon WorkSpaces 加密上下文

Amazon WorkSpaces 不会直接使用您的客户主密钥 (CMK) 进行加密操作(例如 EncryptDecryptGenerateDataKey 等),这意味着 Amazon WorkSpaces 不会向 AWS KMS 发送包含加密上下文的请求。但是,当 Amazon EBS 为 WorkSpaces 的加密卷请求加密的数据密钥(使用 AWS KMS 的 Amazon WorkSpaces 加密概述中的步骤 3),以及请求该数据密钥的纯文本副本 (步骤 5) 时,将在请求中提供加密上下文。加密上下文提供了 AWS KMS 为确保数据完整性而使用的额外的身份验证数据。加密上下文也将写入您的 AWS CloudTrail 日志文件,这有助于您了解为什么使用给定的客户主密钥 (CMK)。Amazon EBS 会对加密上下文使用以下内容:

  • 与 WorkSpace 关联的 AWS Directory Service 用户的 sid

  • 与 WorkSpace 关联的 AWS Directory Service 目录的目录 ID

  • 加密卷的卷 ID

以下示例显示了 Amazon EBS 使用的加密上下文的 JSON 表示形式:

{ "aws:workspaces:sid-directoryid": "[S-1-5-21-277731876-1789304096-451871588-1107]@[d-1234abcd01]", "aws:ebs:id": "vol-1234abcd" }

为 Amazon WorkSpaces 提供代表您使用 CMK 的权限

您可以在适用于 Amazon WorkSpaces 的 AWS 托管 CMK (aws/workspaces) 或客户托管 CMK 下保护您的工作区数据。如果您使用客户托管 CMK,则需要为 Amazon WorkSpaces 提供代表您账户中的 Amazon WorkSpaces 管理员使用 CMK 的权限。默认情况下,适用于 Amazon WorkSpaces 的 AWS 托管 CMK 具有必需权限。

要准备您的客户托管 CMK 以便与 Amazon WorkSpaces 结合使用,请使用以下过程。

Amazon WorkSpaces 管理员还需要使用 Amazon WorkSpaces 的权限。有关这些权限的更多信息,请参阅 Amazon WorkSpaces Administration Guide 中的控制对 Amazon WorkSpaces 资源的访问

第 1 部分:将 WorkSpaces 管理员添加为 CMK 的密钥用户

要为 Amazon WorkSpaces 管理员提供其所需的权限,您可以使用 AWS 管理控制台或 AWS KMS API。

添加 WorkSpaces 管理员作为 CMK 的密钥用户(控制台)

  1. 登录 AWS 管理控制台并通过以下网址打开 AWS Key Management Service (AWS KMS) 控制台:https://console.amazonaws.cn/kms

  2. 要更改 AWS 区域,请使用页面右上角的区域选择器。

  3. 在导航窗格中,选择 Customer managed keys (客户托管密钥)

  4. 选择首选客户托管 CMK 的密钥 ID 或别名。

  5. Key policy (密钥策略) 部分中的 Key users (密钥用户) 下,选择 Add (添加)

  6. 在 IAM 用户和角色列表中,选择与您的 WorkSpaces 管理员对应的用户和角色,然后选择 Attach (附加)

添加 WorkSpaces 管理员作为 CMK 的密钥用户(KMS API)

  1. 使用 GetKeyPolicy 操作获取现有密钥策略,然后将策略文档保存到文件中。

  2. 在您的首选文本编辑器中打开策略文档。将与您的 WorkSpaces 管理员对应的 IAM 用户和角色添加到向密钥用户授予权限的策略语句。然后保存文件。

  3. 使用 PutKeyPolicy 操作将密钥策略应用于 CMK。

第 2 部分:为 WorkSpaces 管理员提供额外权限

如果您使用客户托管 CMK 来保护您的 Amazon WorkSpaces 数据,除了默认密钥策略的密钥用户部分中的权限以外,WorkSpaces 管理员还需要在 CMK 上创建授权的权限。此外,如果他们使用 AWS 管理控制台通过加密的卷来创建 WorkSpaces,则 WorkSpaces 管理员需要具有列出别名和列出密钥的权限。有关创建 IAM 用户策略的更多信息,请参阅 IAM 用户指南 中的托管策略与内联策略

要为您的 WorkSpaces 管理员提供这些权限,请使用 IAM 策略。为每个 WorkSpaces 管理员将与以下示例类似的策略语句添加到 IAM 策略。将示例 CMK ARN (arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab) 替换为有效值。如果您的 WorkSpace 管理员仅使用 Amazon WorkSpaces API(而不是控制台),则可以省略包含 "kms:ListAliases""kms:ListKeys" 权限的第二个策略语句。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:CreateGrant", "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" }, { "Effect": "Allow", "Action": [ "kms:ListAliases", "kms:ListKeys" ], "Resource": "*" } ] }