View a markdown version of this page

在 REST 中加密 AWS HealthLake - AWS HealthLake

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

在 REST 中加密 AWS HealthLake

HealthLake 默认情况下提供加密,以使用服务拥有的 AWS 密钥管理服务 (AWS KMS) 密钥保护静态的敏感客户数据。 Customer-managed 还支持 KMS 密钥,是从数据存储导入和导出文件所必需的。要了解有关 Customer-managed KMS 密钥的更多信息,请参阅亚马逊密钥管理服务。在创建数据存储时,客户可以选择 AWS 拥有的 Customer-managed KMS 密钥或 KMS 密钥。创建数据存储后,无法更改加密配置。如果数据存储使用的是 AWS 拥有的 KMS 密钥,则该密钥将表示为 AWS_OWNED_KMS_KEY,您不会看到用于静态加密的特定密钥。

AWS 拥有的 KMS 密钥

HealthLake 默认情况下,使用这些密钥自动加密潜在的敏感信息,例如静态的个人身份或私人健康信息 (PHI) 数据。AWS 拥有的 KMS 密钥不存储在您的账户中。它们是 AWS 拥有和管理的用于多个 AWS 账户的 KMS 密钥集合的一部分。AWS 服务可以使用 AWS 拥有的 KMS 密钥来保护您的数据。您无法查看、管理、使用 AWS 拥有的 KMS 密钥或审计其使用情况。但是无需执行任何工作或更改任何计划即可保护用于加密数据的密钥。

如果您使用 AWS 拥有的 KMS 密钥,则无需支付月费或使用费,而且这些密钥不计入您账户的 AWS KMS 配额。有关更多信息,请参阅 AWS 拥有的密钥。

客户托管式(KMS 密钥)

HealthLake 支持使用您创建、拥有和管理的对称客户管理的 KMS 密钥在现有 AWS 自有加密的基础上添加第二层加密。由于您可以完全控制这层加密,因此可以执行以下任务:

  • 建立和维护密钥政策、IAM Policy 和授权

  • 轮换密钥加密材料

  • 启用和禁用密钥政策

  • 添加 标签

  • 创建密钥别名

  • 安排密钥删除

您还可以使用 CloudTrail 跟踪代表您 HealthLake 发送给 AWS KMS 的请求。需额外 AWS KMS 收费。有关更多信息,请参阅客户拥有的密钥。

创建客户托管密钥

您可以使用 AWS 管理控制台或 AWS KMS API 创建对称的客户管理密钥。

按照 AWS 密钥管理服务开发人员指南中的创建对称客户托管密钥的步骤进行操作。

密钥政策控制对客户托管密钥的访问。每个客户托管式密钥必须只有一个密钥策略,其中包含确定谁可以使用密钥以及如何使用密钥的声明。创建客户托管式密钥时,可以指定密钥策略。有关更多信息,请参阅 AWS 密钥管理服务开发人员指南中的管理对客户托管密钥的访问权限。

要将您的客户管理密钥用于您的 HealthLake 资源,密钥策略中必须允许 kms: CreateGrant 操作。这为控制对指定 KMS 密钥的访问权限的客户管理密钥增加了授权,这使用户可以访问所需的 kms: grant 操作。 HealthLake 有关更多信息,请参阅使用补助金。

要将您的客户管理的 KMS 密钥 HealthLake 用于您的资源,密钥策略中必须允许以下 API 操作:

  • kms:向特定客户管理的 KMS 密钥CreateGrant 添加授权,该密钥允许访问授予操作。

  • kms:DescribeKey 提供验证密钥所需的客户管理密钥详细信息。这是所有操作所必需的。

  • kms:GenerateDataKey 为所有写入操作提供静态加密资源的访问权限。

  • KMS: Decrypt 提供对加密资源的读取或搜索操作的访问权限。

以下是允许用户创建由该密钥加密的数据存储并与之交互的 AWS HealthLake 策略声明示例:

"Statement": [ { "Sid": "Allow access to create data stores and do CRUD/search in AWS HealthLake", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:HealthLakeFullAccessRole" }, "Action": [ "kms:DescribeKey", "kms:CreateGrant", "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "healthlake.amazonaws.com", "kms:CallerAccount": "111122223333" } } } ]

使用客户托管 KMS 密钥时所需的 IAM 权限

使用客户管理的 KMS 密钥创建启用 AWS KMS 加密的数据存储时,创建 HealthLake 数据存储的用户或角色需要密钥策略和 IAM 策略的权限。

您可以使用 kms: ViaService 条件密钥将 KMS 密钥的使用限制为仅限来自 HealthLake的请求。

有关密钥策略的更多信息,请参阅 AWS 密钥管理服务开发人员指南中的启用 IAM 策略。

创建存储库的 IAM 用户、IAM 角色或 AWS 账户必须拥有 kms: CreateGrant、kms: GenerateDataKey 和 kms: DescribeKey 权限以及必要的 HealthLake 权限。

如何在 AWS KMS 中 HealthLake 使用补助金

HealthLake 需要获得授权才能使用您的客户管理的 KMS 密钥。当您创建使用客户管理的 KMS 密钥加密的数据存储时,通过向 AWS KMS 发送CreateGrant请求来代表您 HealthLake 创建授权。AWS KMS 中的赠款用于授予对客户账户中的 KMS 密钥的 HealthLake 访问权限。

代表您 HealthLake 创建的补助金不应被撤销或取消。如果您撤销或撤销授予在账户中使用 AWS KMS 密钥的 HealthLake 权限,则 HealthLake 无法访问这些数据,无法加密推送到数据存储的新 FHIR 资源,也无法在提取时对其进行解密。当您撤销或取消的补助金时 HealthLake,变更会立即发生。要撤消访问权限,应删除数据存储而不是撤消授权。删除数据存储后,将代表 HealthLake 您撤回补助金。

监控您的加密密钥 HealthLake

在使用 CloudTrail 客户管理的 KMS 密钥时,您可以使用跟踪代表您 HealthLake 发送的请求。 AWS KMS 日志中的日志条目在 UserAgent 字段中显示 healthlake.amazonaws.com,以明确区分发出的请求。 CloudTrail HealthLake

以下示例是 CreateGrant、 GenerateDataKey、Decrypt 和监控 DescribeKey 为访问客户管理密钥加密的数据而 HealthLake 调用的 AWS KMS 操作 CloudTrail 的事件。

下文显示了 CreateGrant 如何使用允许 HealthLake 访问客户提供的 KMS 密钥,从而 HealthLake 允许使用该 KMS 密钥加密所有客户的静态数据。

用户无需创建自己的补助金。 HealthLake 通过向 AWS KMS 发送 CreateGrant 请求来代表您创建补助金。授予权限 AWS KMS 用于授予对客户账户中 AWS KMS 密钥的 HealthLake访问权限。

{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "EXAMPLEROLE:Sampleuser01", "arn": "arn:aws:sts::111122223333:assumed-role/Sampleuser01, "accountId": "111122223333", "accessKeyId": "EXAMPLEKEYID", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "EXAMPLEROLE", "arn": "arn:aws:iam::111122223333:role/Sampleuser01", "accountId": "111122223333", "userName": "Sampleuser01" }, "webIdFederationData": {}, "attributes": { "creationDate": "2021-06-30T19:33:37Z", "mfaAuthenticated": "false" } }, "invokedBy": "healthlake.amazonaws.com" }, "eventTime": "2021-06-30T20:31:15Z", "eventSource": "kms.amazonaws.com", "eventName": "CreateGrant", "awsRegion": "us-east-1", "sourceIPAddress": "healthlake.amazonaws.com", "userAgent": "healthlake.amazonaws.com", "requestParameters": { "operations": [ "CreateGrant", "Decrypt", "DescribeKey", "Encrypt", "GenerateDataKey", "GenerateDataKeyWithoutPlaintext", "ReEncryptFrom", "ReEncryptTo", "RetireGrant" ], "granteePrincipal": "healthlake.us-east-1.amazonaws.com", "keyId": "arn:aws:kms:us-east-1:111122223333:key/EXAMPLE_KEY_ARN", "retiringPrincipal": "healthlake.us-east-1.amazonaws.com" }, "responseElements": { "grantId": "EXAMPLE_ID_01" }, "requestID": "EXAMPLE_ID_02", "eventID": "EXAMPLE_ID_03", "readOnly": false, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-east-1:111122223333:key/EXAMPLE_KEY_ARN" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }

以下示例显示如何使用 GenerateDataKey 来确保用户在存储数据之前具有加密数据的必要权限。

{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "EXAMPLEUSER", "arn": "arn:aws:sts::111122223333:assumed-role/Sampleuser01", "accountId": "111122223333", "accessKeyId": "EXAMPLEKEYID", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "EXAMPLEROLE", "arn": "arn:aws:iam::111122223333:role/Sampleuser01", "accountId": "111122223333", "userName": "Sampleuser01" }, "webIdFederationData": {}, "attributes": { "creationDate": "2021-06-30T21:17:06Z", "mfaAuthenticated": "false" } }, "invokedBy": "healthlake.amazonaws.com" }, "eventTime": "2021-06-30T21:17:37Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-east-1", "sourceIPAddress": "healthlake.amazonaws.com", "userAgent": "healthlake.amazonaws.com", "requestParameters": { "keySpec": "AES_256", "keyId": "arn:aws:kms:us-east-1:111122223333:key/EXAMPLE_KEY_ARN" }, "responseElements": null, "requestID": "EXAMPLE_ID_01", "eventID": "EXAMPLE_ID_02", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-east-1:111122223333:key/EXAMPLE_KEY_ARN" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }

以下示例显示如何 HealthLake 调用 Decrypt 操作以使用存储的加密数据密钥访问加密数据。

{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "EXAMPLEUSER", "arn": "arn:aws:sts::111122223333:assumed-role/Sampleuser01", "accountId": "111122223333", "accessKeyId": "EXAMPLEKEYID", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "EXAMPLEROLE", "arn": "arn:aws:iam::111122223333:role/Sampleuser01", "accountId": "111122223333", "userName": "Sampleuser01" }, "webIdFederationData": {}, "attributes": { "creationDate": "2021-06-30T21:17:06Z", "mfaAuthenticated": "false" } }, "invokedBy": "healthlake.amazonaws.com" }, "eventTime": "2021-06-30T21:21:59Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-east-1", "sourceIPAddress": "healthlake.amazonaws.com", "userAgent": "healthlake.amazonaws.com", "requestParameters": { "encryptionAlgorithm": "SYMMETRIC_DEFAULT", "keyId": "arn:aws:kms:us-east-1:111122223333:key/EXAMPLE_KEY_ARN" }, "responseElements": null, "requestID": "EXAMPLE_ID_01", "eventID": "EXAMPLE_ID_02", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-east-1:111122223333:key/EXAMPLE_KEY_ARN" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }

以下示例显示如何 HealthLake 使用该 DescribeKey 操作来验证 AWS KMS 客户拥有的 AWS KMS 密钥是否处于可用状态,以及如何帮助用户排除其无法运行的问题。

{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "EXAMPLEUSER", "arn": "arn:aws:sts::111122223333:assumed-role/Sampleuser01", "accountId": "111122223333", "accessKeyId": "EXAMPLEKEYID", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "EXAMPLEROLE", "arn": "arn:aws:iam::111122223333:role/Sampleuser01", "accountId": "111122223333", "userName": "Sampleuser01" }, "webIdFederationData": {}, "attributes": { "creationDate": "2021-07-01T18:36:14Z", "mfaAuthenticated": "false" } }, "invokedBy": "healthlake.amazonaws.com" }, "eventTime": "2021-07-01T18:36:36Z", "eventSource": "kms.amazonaws.com", "eventName": "DescribeKey", "awsRegion": "us-east-1", "sourceIPAddress": "healthlake.amazonaws.com", "userAgent": "healthlake.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-east-1:111122223333:key/EXAMPLE_KEY_ARN" }, "responseElements": null, "requestID": "EXAMPLE_ID_01", "eventID": "EXAMPLE_ID_02", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-east-1:111122223333:key/EXAMPLE_KEY_ARN" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }

了解详情

以下资源提供有关静态数据加密的更多信息。

有关 AWS 密钥管理服务基本概念的更多信息,请参阅 AWS KMS 文档。

有关安全最佳实践的更多信息, AWS KMS 请参阅文档。