静态加密 AWS HealthLake - AWS HealthLake

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

静态加密 AWS HealthLake

HealthLake 默认提供加密,使用服务拥有的 AWS Key Management Service (AWS KMS) 密钥保护敏感的静态客户数据。还支持客户管理的 KMS 密钥,从数据存储中导入和导出文件都需要这些密钥。要了解有关客户管理的 KMS 密钥的更多信息,请参阅 Amazon 密钥管理服务。在创建数据存储时,客户可以选择 AWS 拥有的 KMS 密钥或客户管理的 KMS 密钥。创建数据存储后,无法更改加密配置。如果数据存储使用的是 AWS 拥有的 KMS 密钥,则该密钥将表示为 AWS_OWNED _KMS_KEY,并且您不会看到用于静态加密的特定密钥。

AWS 拥有的 KMS 密钥

HealthLake 默认使用这些密钥自动加密潜在的敏感信息,例如个人身份信息或静态私人健康信息 (PHI) 数据。AWS 拥有的 KMS 密钥不会存储在您的账户中。它们是 AWS 拥有和管理的 KMS 密钥集合的一部分,可在多个 AWS 账户中使用。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 APIs

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

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

要将客户托管密钥用于您的 HealthLake 资源,必须在密钥策略中允许 kms: CreateGrant 操作。这会向客户托管密钥添加授权,该密钥控制对指定 KMS 密钥的访问权限,从而允许用户访问 kms: gran t 操作所需的权限。 HealthLake 有关更多信息,请参阅使用授权

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

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

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

  • 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 策略的权限。

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

有关密钥策略的更多信息,请参阅 AWS Key Management Service 开发人员指南中的启用 IAM 策略

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

如何在 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 日志中的日志条目在 userA CloudTrail gent 字段中显示 healthlake.amazonaws.com,以明确区分由发出的请求。 HealthLake

以下示例是 CreateGrant、 GenerateDataKey、Decrypt 和 DescribeKey 监视 AWS KMS 操作 CloudTrail 的事件,这些操作被调用 HealthLake 以访问由您的客户托管密钥加密的数据。

以下内容显示了 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 Key Management Service 基本概念的更多信息,请参阅 AWS KMS 文档。

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