

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

# Amazon Keyspaces 中的静态加密
<a name="EncryptionAtRest"></a>

Amazon Keyspaces（Apache Cassandra 兼容）*静态加密*使用存储在 [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) 中的加密密钥对所有静态数据进行加密，以增强安全性。此功能减少保护敏感数据时涉及的操作负担和复杂性。通过静态加密，您可以构建安全敏感型应用程序，以满足针对数据保护的严格合规性和法规要求。

 Amazon Keyspaces 静态加密使用 256 位高级加密标准 (AES-256) 来加密数据。这有助于保护您的数据，防止对底层存储进行未经授权的访问。

Amazon Keyspaces 透明地加密和解密表和流中的数据。Amazon Keyspaces 使用信封加密和密钥层次结构来保护数据加密密钥。它与 AWS KMS 集成，用于存储和管理根加密密钥。有关加密密钥层次结构的更多信息，请参阅[静态加密：它在 Amazon Keyspaces 中如何运作](encryption.howitworks.md)。有关信封加密等 AWS KMS 概念的更多信息，请参阅《*AWS Key Management Service 开发人员指南*》中的[AWS KMS 管理服务概念](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html)。

 创建新表时，您可以选择以下 *AWS KMS 密钥（KMS 密钥）*之一：
+ AWS 拥有的密钥 — 这是默认的加密类型。此密钥由 Amazon Keyspaces 拥有（不另外收费）。
+ 客户自主管理型密钥：此密钥存储在您的账户中，由您创建、拥有和管理。您可以完全控制客户管理的密钥（AWS KMS 收费）。

Amazon Keyspaces 使用与底层表相同的密钥自动加密变更数据捕获 (CDC) 流。有关 CDC 的更多信息，请参阅[在 Amazon Keyspaces 中处理变更数据捕获 (CDC) 流](cdc.md)。

 您可以随时在客户管理的密钥 AWS 拥有的密钥 和客户管理的密钥之间切换。您可以在创建新表时指定客户自主管理型密钥，也可以通过控制台或使用 CQL 语句以编程方式更改现有表的 KMS 密钥。要了解如何操作，请参阅[静态加密：如何使用客户自主管理型密钥加密 Amazon Keyspaces 中的表](encryption.customermanaged.md)。

 使用默认选项提供静态加密 AWS 拥有的密钥 ，不收取额外费用。但是，使用客户自主管理型密钥需支付 AWS KMS 费用。有关定价的更多信息，请参阅 [AWS KMS 定价](https://aws.amazon.com/kms/pricing)。

Amazon Keyspaces 的静态加密功能适用于所有地区 AWS 区域，包括 AWS 中国（北京）和 AWS 中国（宁夏）地区。有关更多信息，请参阅 [静态加密：它在 Amazon Keyspaces 中如何运作](encryption.howitworks.md)。

**Topics**
+ [静态加密：它在 Amazon Keyspaces 中如何运作](encryption.howitworks.md)
+ [静态加密：如何使用客户自主管理型密钥加密 Amazon Keyspaces 中的表](encryption.customermanaged.md)

# 静态加密：它在 Amazon Keyspaces 中如何运作
<a name="encryption.howitworks"></a>

Amazon Keyspaces（Apache Cassandra 兼容）*静态加密*使用 256 位高级加密标准 (AES-256) 来加密数据。这有助于保护您的数据，防止对底层存储进行未经授权的访问。默认情况下，Amazon Keyspaces 表中的所有客户数据都进行了静态加密，服务器端加密是透明的，这意味着不需要对应用程序进行更改。

静态加密与 AWS Key Management Service (AWS KMS) 集成，用于管理用于加密表的加密密钥。在创建新表或更新现有表时，您可以选择以下 *AWS KMS 密钥*选项之一：
+ AWS 拥有的密钥 — 这是默认的加密类型。此密钥由 Amazon Keyspaces 拥有（不另外收费）。
+ 客户自主管理型密钥：此密钥存储在您的账户中，由您创建、拥有和管理。您可以完全控制客户管理的密钥（AWS KMS 收费）。

**AWS KMS 密钥（KMS 密钥）**  
静态加密使用密钥保护您的所有 Amazon Keyspaces 数据。 AWS KMS 默认情况下，Amazon Keyspaces 使用 [AWS 拥有的密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)，即在 Amazon Keyspaces 服务账户中创建并管理的多租户加密密钥。  
但是，您可以使用 AWS 账户中的[客户自主管理型密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)加密 Amazon Keyspaces 表。您可以为键空间中的每个表选择不同的 KMS 密钥。您为表选择的 KMS 密钥也用于加密其所有元数据和可恢复备份。  
您可以在创建或更新表时为表选择 KMS 密钥。您可以随时在 Amazon Keyspaces 控制台中或使用 [ALTER TABLE](cql.ddl.keyspace.md#cql.ddl.keyspace.alter) 语句更改表的 KMS 密钥。切换 KMS 密钥的过程是无缝的，不需要停机，也不会降低服务质量。

**密钥层次结构**  
Amazon Keyspaces 使用密钥层次结构来加密数据。在这个密钥层次结构中，KMS 密钥是根密钥。它用于加密和解密 Amazon Keyspaces 表加密密钥。表加密密钥用于加密 Amazon Keyspaces 在内部使用的加密密钥（用于在执行读取和写入操作时加密和解密数据）。  
利用加密密钥层次结构，您可以对 KMS 密钥进行更改，而无需重新加密数据，也不会影响应用程序和正在进行的数据操作。  

![\[显示了根密钥、表加密密钥和用于静态加密的数据加密密钥的密钥层次结构。\]](http://docs.aws.amazon.com/zh_cn/keyspaces/latest/devguide/images/keyspaces_encryption.png)


**表密钥**  
Amazon Keyspaces 表密钥用作密钥加密密钥。Amazon Keyspaces 使用表密钥来保护内部数据加密密钥，后者用于加密存储在表、日志文件和可恢复备份中的数据。Amazon Keyspaces 会为表中的每个底层结构生成唯一的数据加密密钥。但是，多个表行可能受同一个数据加密密钥的保护。  
首次将 KMS 密钥设置为客户托管密钥时， AWS KMS 会生成*数据密钥*。 AWS KMS 数据密钥是指 Amazon Keyspaces 中的表密钥。  
当您访问加密表时，Amazon Keyspaces 会向发送使用 KMS 密钥解密表密钥的请求。 AWS KMS 然后，它会使用明文表密钥来解密 Amazon Keyspaces 数据加密密钥，并使用明文数据加密密钥来解密表数据。  
Amazon Keyspaces 在外部使用和存储表密钥和数据加密密钥。 AWS KMS它会借助[高级加密标准](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) 加密和 256 位加密密钥保护所有密钥。然后，它会将加密密钥与加密数据存储在一起，这样您就可以根据需要使用它们来解密表数据。

**表密钥缓存**  
为了避免调用 AWS KMS 每个 Amazon Keyspaces 操作，Amazon Keyspaces 会将每个连接的纯文本表密钥缓存在内存中。如果 Amazon Keyspaces 在闲置五分钟后收到缓存表密钥的请求，则它会向发送新的请求 AWS KMS 以解密该表密钥。此调用会捕获自上次请求解密表密钥以来对 AWS KMS 或 AWS Identity and Access Management (IAM) 中 KMS 密钥的访问策略所做的任何更改。

**信封加密**  
如果您更改了表的客户自主管理型密钥，Amazon Keyspaces 会生成新的表密钥。然后，它会使用新的表密钥来重新加密数据加密密钥。它还会使用新的表密钥来加密用于保护可恢复备份的先前表密钥。此过程称为信封加密。这将确保即使您轮换了客户自主管理型密钥，您仍然可以访问可恢复备份。有关信封加密的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[信封加密](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)。

**Topics**
+ [AWS 拥有的密钥](#keyspaces-owned)
+ [客户托管密钥](#customer-managed)
+ [静态加密使用注意事项](#encryption.usagenotes)

## AWS 拥有的密钥
<a name="keyspaces-owned"></a>

AWS 拥有的密钥 没有存储在你的 AWS 账户。它们是 KMS 密钥集合的一部分，这些密钥 AWS 拥有并管理多个密钥 AWS 账户。 AWS 服务可以 AWS 拥有的密钥 用来保护您的数据。

您无法查看、管理 AWS 拥有的密钥、使用或审核其使用情况。但是无需执行任何工作或更改任何计划即可保护用于加密数据的密钥。

您无需支付月费或使用费 AWS 拥有的密钥，也不会计入您账户的 AWS KMS 配额。

## 客户托管密钥
<a name="customer-managed"></a>

客户管理的密钥 AWS 账户 是您创建、拥有和管理的密钥。您对此类 KMS 密钥拥有完全控制权。

使用客户托管密钥可获得以下功能：
+ 您可以创建和管理客户自主管理型密钥，包括设置和维护[密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)、[IAM 策略](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)和[授权](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)来控制对客户自主管理型密钥的访问。您可以[启用和禁用](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html)客户自主管理型密钥、启用和禁用[自动密钥轮换](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)，以及计划在客户自主管理型密钥不再使用时[删除客户自主管理型密钥](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html)。您可以为自己管理的客户自主管理型密钥创建标签和别名。
+ 您可以使用具有[导入的密钥材料](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html)的客户托管密钥，或者您拥有和管理的[自定义密钥存储](https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html)中的客户托管密钥。
+ 您可以使用 AWS CloudTrail 和 Amazon CloudWatch Logs 来跟踪 Amazon Keyspaces AWS KMS 代表您发送的请求。有关更多信息，请参阅 [步骤 6：使用配置监控 AWS CloudTrail](encryption.customermanaged.md#encryption-cmk-trail)。

客户托管的密钥每[次 API 调用都会产生费用](https://aws.amazon.com/kms/pricing/)，而 AWS KMS 配额适用于这些 KMS 密钥。有关更多信息，请参阅 [AWS KMS 资源或请求限额](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)。

当您将客户自主管理型密钥指定为表的根加密密钥时，系统将使用创建备份时为表指定的加密密钥对可恢复备份进行加密。如果表的 KMS 密钥进行了轮换，则密钥信封加密可确保最新的 KMS 密钥有权访问所有可恢复备份。

Amazon Keyspaces 必须有权访问您的客户自主管理型密钥才能让您有权访问您的表数据。如果加密密钥的状态设置为“已禁用”或将按计划删除，Amazon Keyspaces 将无法加密或解密数据。因此，您无法对表执行读取和写入操作。一旦服务检测到您的加密密钥无法访问，Amazon Keyspaces 会立即向您发送电子邮件通知以提醒您。

您必须在七天内恢复对加密密钥的访问权限，否则 Amazon Keyspaces 会自动删除您的表。作为预防措施，Amazon Keyspaces 会在删除表之前为表数据创建可恢复备份。Amazon Keyspaces 会将可恢复备份保留 35 天。35 天后，您将无法再恢复表数据。您无需为可恢复备份付费，但需要支付标准[恢复费用](https://aws.amazon.com/keyspaces/pricing)。

您可以使用这个可恢复备份将数据恢复到新表。要启动恢复操作，必须启用用于表的最后一个客户自主管理型密钥，且 Amazon Keyspaces 必须有权访问它。

**注意**  
当您创建使用客户自主管理型密钥进行加密的表时，如果该密钥在创建过程完成之前不可访问或将按计划删除，则会发生错误。创建表操作将失败，并且您将收到电子邮件通知。

## 静态加密使用注意事项
<a name="encryption.usagenotes"></a>

在 Amazon Keyspaces 中使用静态加密时，请注意以下事项。
+ 服务器端静态加密已在所有 Amazon Keyspaces 表上启用且无法禁用。整个表都进行了静态加密，您无法选择特定的列或行进行加密。
+ 默认情况下，Amazon Keyspaces 使用单服务默认密钥（AWS 拥有的密钥）来加密您的所有表。如果此密钥不存在，系统会为您创建一个。服务默认密钥无法禁用。
+ 静态加密仅加密持久存储介质上的静态数据。如果对于正在传输的数据或正在使用的数据而言，数据安全性很重要，则必须执行额外措施：
  + 传输中数据：Amazon Keyspaces 中的所有数据都在传输中加密。默认情况下，与 Amazon Keyspaces 的通信将通过安全套接字层 (SSL)/传输层安全性协议 (TLS) 加密进行保护。
  + 正在使用的数据：在将数据发送到 Amazon Keyspaces 之前使用客户端加密保护数据。
  + 客户自主管理型密钥：表中的静态数据始终使用客户自主管理型密钥进行加密。但是，对多行执行原子更新的操作 AWS 拥有的密钥 在处理期间会临时使用加密数据。这包括范围删除操作以及同时访问静态和非静态数据的操作。
+ 一个客户自主管理型密钥最多可以有 50000 个[授权](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)。与客户自主管理型密钥关联的每个 Amazon Keyspaces 表使用 2 个授权。删除表会释放一个授权。第二个授权用于创建表的自动快照，防止在 Amazon Keyspaces 无意中失去对客户自主管理型密钥的访问权限时发生数据丢失。此授权将在删除表后 42 天释放。

# 静态加密：如何使用客户自主管理型密钥加密 Amazon Keyspaces 中的表
<a name="encryption.customermanaged"></a>

您可以使用控制台或 CQL 语句 AWS KMS key 为新表指定，并更新 Amazon Keyspaces 中现有表的加密密钥。以下主题概述如何对新表和现有表实施客户自主管理型密钥。

**Topics**
+ [先决条件：使用 Amazon Keyspaces 创建客户托管密钥 AWS KMS 并向其授予权限](#encryption.createCMKMS)
+ [步骤 3：为新表指定客户自主管理型密钥](#encryption.tutorial-creating)
+ [步骤 4：更新现有表的加密密钥](#encryption.tutorial-update)
+ [步骤 5：在日志中使用 Amazon Keyspaces 加密上下文](#encryption-context)
+ [步骤 6：使用配置监控 AWS CloudTrail](#encryption-cmk-trail)

## 先决条件：使用 Amazon Keyspaces 创建客户托管密钥 AWS KMS 并向其授予权限
<a name="encryption.createCMKMS"></a>

在使用[客户托管](encryption.howitworks.md#customer-managed)密钥保护 Amazon Keyspaces 表之前，必须先在 AWS Key Management Service (AWS KMS) 中创建密钥，然后授权 Amazon Keyspaces 使用该密钥。

### 步骤 1：使用创建客户托管密钥 AWS KMS
<a name="encryption-create-key"></a>

要创建用于保护 Amazon Keyspaces 表的客户托管密钥，您可以按照使用控制台或 API [创建对称加密 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)中的步骤进行操作。 AWS 

### 步骤 2：授权使用您的客户自主管理型密钥
<a name="encryption-authz"></a>

要选择一个[客户自主管理型密钥](encryption.howitworks.md#customer-managed)来保护 Amazon Keyspaces 表，必须先让针对该密钥的策略为 Amazon Keyspaces 授予代表您使用该密钥的权限。您可以全面控制针对客户自主管理型密钥的策略和授权。您可以在[密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)、[IAM 策略](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)或[授权](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)中提供这些权限。

Amazon Keyspaces 无需额外授权即可使用默认的 [AWS 拥有的密钥](encryption.howitworks.md#keyspaces-owned)来保护 AWS 账户中的 Amazon Keyspaces 表。

以下主题介绍如何使用允许 Amazon Keyspaces 表使用客户自主管理型密钥的 IAM 策略和授权来配置所需的权限。

**Topics**
+ [针对客户自主管理型密钥的密钥策略](#encryption-customer-managed-policy)
+ [示例 密钥策略](#encryption-customer-managed-policy-sample)
+ [使用授权来授权 Amazon Keyspaces](#encryption-grants)

#### 针对客户自主管理型密钥的密钥策略
<a name="encryption-customer-managed-policy"></a>

如果选择[客户自主管理型密钥](encryption.howitworks.md#customer-managed)来保护 Amazon Keyspaces 表，那么 Amazon Keyspaces 将获得代表做出此选择的主体使用客户自主管理型密钥的权限。该主体（用户或角色）必须拥有 Amazon Keyspaces 所需的客户自主管理型密钥权限。

Amazon Keyspaces 至少需要以下客户自主管理型密钥权限：
+ [kms:Encrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)
+ [kms: ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html) \$1（代表 kms:ReEncryptFrom 和 kms:ReEncryptTo）
+ kms: GenerateDataKey \$1（对于 [kms: GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 和 [kms: GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)）
+ [kms: DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)
+ [kms: CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)

#### 示例 密钥策略
<a name="encryption-customer-managed-policy-sample"></a>

例如，以下示例密钥策略仅提供所需的权限。该策略具有以下效果：
+ 允许 Amazon Keyspaces 在加密操作中使用客户自主管理型密钥并创建授权，但仅当它代表账户中拥有 Amazon Keyspaces 使用权限的主体行事时才可如此。如果策略语句中指定的主体无权使用 Amazon Keyspaces，调用将失败，即使调用来自 Amazon Keyspaces 服务也是如此。
+ 只有当请求来自 Amazon [Keyspaces 代表政策声明中列出的委托人时，kms: ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service) 条件密钥才允许权限。这些主体不能直接调用这些操作。请注意，`kms:ViaService` 值 `cassandra.*.amazonaws.com`在“区域”位置中有一个星号 (\$1)。Amazon Keyspaces 要求该权限独立于任何特定的权限。 AWS 区域
+ 为客户自主管理型密钥管理员（可代入 `db-team` 角色的用户）授予对客户自主管理型密钥的只读访问权限，以及撤销授权的权限，包括 [Amazon Keyspaces 保护表所需的授权](#encryption-grants)。
+ 为 Amazon Keyspaces 授予对客户自主管理型密钥的只读访问权限。在此情况下，Amazon Keyspaces 可以直接调用这些操作，而不必代表账户主体行事。

在使用示例密钥策略之前，请将示例委托人替换为您的实际委托人。 AWS 账户

```
{
  "Id": "key-policy-cassandra",
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid" : "Allow access through Amazon Keyspaces for all principals in the account that are authorized to use Amazon Keyspaces",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::111122223333:user/db-lead"},
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey",
        "kms:CreateGrant"
      ],
      "Resource": "*",      
      "Condition": { 
         "StringLike": {
           "kms:ViaService" : "cassandra.*.amazonaws.com"
         }
      }
    },
    {
      "Sid":  "Allow administrators to view the customer managed key and revoke grants",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/db-team"
       },
      "Action": [
        "kms:Describe*",
        "kms:Get*",
        "kms:List*",
        "kms:RevokeGrant"
      ],
      "Resource": "*"
    }
  ]
}
```

#### 使用授权来授权 Amazon Keyspaces
<a name="encryption-grants"></a>

除密钥策略之外，Amazon Keyspaces 还使用授权来设置对客户自主管理型密钥的权限。要查看有关您账户中的客户托管密钥的授权，请使用 [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) 操作。Amazon Keyspaces 不需要授权或任何其他权限即可使用 [AWS 拥有的密钥](encryption.howitworks.md#keyspaces-owned)来保护您的表。

Amazon Keyspaces 在执行后台系统维护和持续数据保护任务时使用授予权限。它还使用授权来生成表密钥。

每个授权特定于一个表。如果该账户包含使用同一客户自主管理型密钥加密的多个表，则每个表都有每种类型的授权。该授权受到 [Amazon Keyspaces 加密上下文](https://docs.aws.amazon.com/kms/latest/developerguide/encryption-context.html)的限制，其中包括表名和 ID。 AWS 账户 该授权包含在不再需要授权时[停用授权](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html)的权限。

要创建授权，Amazon Keyspaces 必须拥有代表创建加密表的用户调用 `CreateGrant` 的权限。

该密钥策略还可以允许账户[撤销对客户自主管理型密钥的授权](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)。但是，如果您撤销对某个活动的加密表的授权，Amazon Keyspaces 将无法保护和维护该表。

## 步骤 3：为新表指定客户自主管理型密钥
<a name="encryption.tutorial-creating"></a>

按照以下步骤，使用 Amazon Keyspaces 控制台或 CQL 指定新表的客户自主管理型密钥。

### 使用客户自主管理型密钥创建加密表（控制台）
<a name="encryption.tutorial-console"></a>

1. [登录并在家中打开 Amazon Keyspaces 控制台。 AWS 管理控制台 https://console.aws.amazon.com/keyspaces/](https://console.aws.amazon.com/keyspaces/home)

1. 在导航窗格中，选择**表**，然后选择**创建表**。

1. 在**创建表**页面的**表详细信息**部分中，选择一个键空间并为新表提供一个名称。

1. 在**架构**部分，为您的表创建架构。

1. 在**表设置**部分，选择**自定义设置**。

1. 继续进入**加密设置**。

   在此步骤中，您将为表选择加密设置。

   在 **“选择一个**” 下的 “**静态加密**” 部分 AWS KMS key，选择 **“选择其他 KMS 密钥（高级）**” 选项，然后在搜索字段中选择 AWS KMS key 或输入 Amazon 资源名称 (ARN)。
**注意**  
如果您选择的密钥无法访问或缺少所需的权限，请参阅 AWS Key Management Service 开发人员指南中的[密钥访问疑难解答](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html)。

1. 选择 **Create (创建)** 以创建加密表。

### 创建使用客户自主管理型密钥进行静态加密 (CQL) 的新表
<a name="encryption.tutorial-cql"></a>

要创建使用客户自主管理型密钥进行静态加密 (CQL) 的新表，可以使用 `CREATE TABLE` 语句，如以下示例所示。确保将密钥 ARN 替换为一个有效密钥的 ARN，该有效密钥拥有授予 Amazon Keyspaces 的权限。

```
CREATE TABLE my_keyspace.my_table(id bigint, name text, place text STATIC, PRIMARY KEY(id, name)) WITH CUSTOM_PROPERTIES = {
        'encryption_specification':{
                'encryption_type': 'CUSTOMER_MANAGED_KMS_KEY', 
                'kms_key_identifier':'arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111'
            }
    };
```

如果您收到 `Invalid Request Exception`，则需要确认客户自主管理型密钥有效，并且 Amazon Keyspaces 拥有所需的权限。要确认密钥配置是否正确，请参阅《 AWS Key Management Service 开发人员指南》中的[密钥访问疑难解答](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html)。

## 步骤 4：更新现有表的加密密钥
<a name="encryption.tutorial-update"></a>

您也可以随时使用 Amazon Keyspaces 控制台或 CQL 在客户托管的 KMS 密钥 AWS 拥有的密钥 和客户托管的 KMS 密钥之间更改现有表的加密密钥。

### 使用新的客户自主管理型密钥更新现有表（控制台）
<a name="encryption.tutorial-update-console"></a>

1. [登录并在家中打开 Amazon Keyspaces 控制台。 AWS 管理控制台 https://console.aws.amazon.com/keyspaces/](https://console.aws.amazon.com/keyspaces/home)

1.  在导航窗格中，选择**表**。

1. 选择要更新的表，然后选择**其他设置**选项卡。

1. 在**静态加密**部分中，选择**管理加密**以编辑表的加密设置。

   在 **“选择一个**” 下 AWS KMS key，选择 **“选择其他 KMS 密钥（高级）**” 选项，然后在搜索字段中选择 AWS KMS key 或输入 Amazon 资源名称 (ARN)。
**注意**  
如果您选择的密钥无效，请参阅 AWS Key Management Service 开发人员指南中的[密钥访问疑难解答](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html)。

   或者，您可以 AWS 拥有的密钥 为使用客户托管密钥加密的表选择一个。

1. 选择**保存更改**以保存对表所做的更改。

### 更新用于现有表的加密密钥
<a name="encryption.tutorial-update-cql"></a>

要更改现有表的加密密钥，请使用 `ALTER TABLE` 语句指定用于静态加密的客户自主管理型密钥。确保将密钥 ARN 替换为一个有效密钥的 ARN，该有效密钥拥有授予 Amazon Keyspaces 的权限。

```
ALTER TABLE my_keyspace.my_table WITH CUSTOM_PROPERTIES = {     
              'encryption_specification':{ 
                      'encryption_type': 'CUSTOMER_MANAGED_KMS_KEY', 
                      'kms_key_identifier':'arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111'     
                  } 
         };
```

如果您收到 `Invalid Request Exception`，则需要确认客户自主管理型密钥有效，并且 Amazon Keyspaces 拥有所需的权限。要确认密钥配置是否正确，请参阅《 AWS Key Management Service 开发人员指南》中的[密钥访问疑难解答](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html)。

要将加密密钥更改回默认的静态加密选项 AWS 拥有的密钥，您可以使用如下示例所示的`ALTER TABLE`语句。

```
ALTER TABLE my_keyspace.my_table WITH CUSTOM_PROPERTIES = {
                'encryption_specification':{
                      'encryption_type' : 'AWS_OWNED_KMS_KEY' 
                    } 
         };
```

## 步骤 5：在日志中使用 Amazon Keyspaces 加密上下文
<a name="encryption-context"></a>

[加密上下文](https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html) 是一组包含任意非机密数据的键值对。当您在加密数据的请求中包含加密上下文时，会以加密 AWS KMS 方式将加密上下文绑定到加密数据。要解密数据，您必须传入相同的加密上下文。

Amazon Keys AWS KMS paces 在所有加密操作中使用相同的加密上下文。如果您使用[客户自主管理型密钥](encryption.howitworks.md#customer-managed)来保护 Amazon Keyspaces 表，则可以使用加密上下文在审计记录和日志中标识客户自主管理型密钥的使用。它还以纯文本形式出现在日志中，例如和 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)A [ma CloudWatch ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) zon Logs 的日志中。

在请求中 AWS KMS，Amazon Keyspaces 使用了包含三个密钥值对的加密上下文。

```
"encryptionContextSubset": {
    "aws:cassandra:keyspaceName": "my_keyspace",
    "aws:cassandra:tableName": "mytable"
    "aws:cassandra:subscriberId": "111122223333"
}
```
+ **键空间**：第一个键值对标识包含 Amazon Keyspaces 要加密的表的键空间。键是 `aws:cassandra:keyspaceName`。值是键空间的名称。

  ```
  "aws:cassandra:keyspaceName": "<keyspace-name>"
  ```

  例如：

  ```
  "aws:cassandra:keyspaceName": "my_keyspace"
  ```
+ **表**：第二个键值对标识 Amazon Keyspaces 要加密的表。键是 `aws:cassandra:tableName`。值为表的名称。

  ```
  "aws:cassandra:tableName": "<table-name>"
  ```

  例如：

  ```
  "aws:cassandra:tableName": "my_table"
  ```
+ **账户**：第三个键值对标识 AWS 账户。键是 `aws:cassandra:subscriberId`。该值为账户 ID。

  ```
  "aws:cassandra:subscriberId": "<account-id>"
  ```

  例如：

  ```
  "aws:cassandra:subscriberId": "111122223333"
  ```

## 步骤 6：使用配置监控 AWS CloudTrail
<a name="encryption-cmk-trail"></a>

如果您使用[客户托管密钥](encryption.howitworks.md#customer-managed)来保护您的 Amazon Keyspaces 表，则可以使用 AWS CloudTrail 日志来跟踪 Amazon Keyspaces 代表您发送 AWS KMS 的请求。

本节将讨论 `GenerateDataKey`、`DescribeKey`、`Decrypt` 和 `CreateGrant` 请求。此外，当您删除表时，Amazon Keyspaces 会使用[RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html)操作来移除授权。

**注意**  
当您使用 Amazon Keyspaces 时，某些操作可能会生成`invokedBy`字段为 CloudTrail 的事件。`dynamodb.amazonaws.com`这是意料之中的，而且之所以发生，是因为亚马逊密钥空间与亚马逊 DynamoDB 集成以提供其服务。

**GenerateDataKey**  
Amazon Keyspaces 会创建一个唯一表密钥来加密静态数据。它向发送*[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)*请求 AWS KMS ，为该表指定 KMS 密钥。  
记录 `GenerateDataKey` 操作的事件与以下示例事件类似。用户是 Amazon Keyspaces 服务账户。参数包括客户自主管理型密钥的 Amazon 资源名称 (ARN)、需要 256 位密钥的密钥说明符以及标识键空间、表和 AWS 账户的[加密上下文](#encryption-context)。  

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2021-04-16T04:56:05Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKey",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": {
        "keySpec": "AES_256",
        "encryptionContext": {
            "aws:cassandra:keyspaceName": "my_keyspace",
            "aws:cassandra:tableName": "my_table",
            "aws:cassandra:subscriberId": "123SAMPLE012"
        },
        "keyId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111"
    },
    "responseElements": null,
    "requestID": "5e8e9cb5-9194-4334-aacc-9dd7d50fe246",
    "eventID": "49fccab9-2448-4b97-a89d-7d5c39318d6f",
    "readOnly": true,
    "resources": [
        {
            "accountId": "123SAMPLE012",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "eventCategory": "Management",
    "recipientAccountId": "123SAMPLE012",
    "sharedEventID": "84fbaaf0-9641-4e32-9147-57d2cb08792e"
}
```

**DescribeKey**  
Amazon Keyspaces 使用[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)操作来确定您选择的 KMS 密钥是否存在于账户和区域中。  
记录 `DescribeKey` 操作的事件与以下示例事件类似。用户是 Amazon Keyspaces 服务账户。参数包括客户自主管理型密钥的 ARN 和需要 256 位密钥的密钥说明符。  

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDAZ3FNIIVIZZ6H7CFQG",
        "arn": "arn:aws:iam::123SAMPLE012:user/admin",
        "accountId": "123SAMPLE012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "admin",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2021-04-16T04:55:42Z"
            }
        },
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2021-04-16T04:55:58Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "DescribeKey",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": {
        "keyId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111"
    },
    "responseElements": null,
    "requestID": "c25a8105-050b-4f52-8358-6e872fb03a6c",
    "eventID": "0d96420e-707e-41b9-9118-56585a669658",
    "readOnly": true,
    "resources": [
        {
            "accountId": "123SAMPLE012",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "eventCategory": "Management",
    "recipientAccountId": "123SAMPLE012"
}
```

**Decrypt**  
当您访问 Amazon Keyspaces 表时，Amazon Keyspaces 需要解密表密钥，以便解密层次结构中位于其下方的密钥。然后，解密表中的数据。为了解密表密钥，Amazon Keyspaces 会向其发送[解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)请求 AWS KMS ，该请求指定表的 KMS 密钥。  
记录 `Decrypt` 操作的事件与以下示例事件类似。用户是您中访问该表的委托 AWS 账户 人。这些参数包括加密的表密钥（作为密文 blob）和用于标识表的[加密上下文](#encryption-context)和。 AWS 账户 AWS KMS 从密文中获取客户托管密钥的 ID。  

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2021-04-16T05:29:44Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": {
        "encryptionContext": {
            "aws:cassandra:keyspaceName": "my_keyspace",
            "aws:cassandra:tableName": "my_table",
            "aws:cassandra:subscriberId": "123SAMPLE012"
        },
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT"
    },
    "responseElements": null,
    "requestID": "50e80373-83c9-4034-8226-5439e1c9b259",
    "eventID": "8db9788f-04a5-4ae2-90c9-15c79c411b6b",
    "readOnly": true,
    "resources": [
        {
            "accountId": "123SAMPLE012",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "eventCategory": "Management",
    "recipientAccountId": "123SAMPLE012",
    "sharedEventID": "7ed99e2d-910a-4708-a4e3-0180d8dbb68e"
}
```

**CreateGrant**  
如果您使用[客户自主管理型密钥](encryption.howitworks.md#customer-managed)来保护 Amazon Keyspaces 表，则 Amazon Keyspaces 会使用[授权](#encryption-grants)以允许服务执行持续数据保护和维护以及持久性任务。[AWS 拥有的密钥](encryption.howitworks.md#keyspaces-owned)不需要这些授权。  
Amazon Keyspaces 创建的授权特定于表。CreateGrant 请求[CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)的委托人是创建了表的用户。  
记录 `CreateGrant` 操作的事件与以下示例事件类似。参数包括表的客户自主管理型密钥的 ARN、被授权主体和停用主体（Amazon Keyspaces 服务）以及授权涵盖的操作。它还包括要求所有加密操作都使用指定[加密上下文](#encryption-context)的约束。  

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDAZ3FNIIVIZZ6H7CFQG",
        "arn": "arn:aws:iam::arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111:user/admin",
        "accountId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111",
        "accessKeyId": "AKIAI44QH8DHBEXAMPLE",
        "userName": "admin",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2021-04-16T04:55:42Z"
            }
        },
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2021-04-16T05:11:10Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "CreateGrant",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": {
        "keyId": "a7d328af-215e-4661-9a69-88c858909f20",
        "operations": [
            "DescribeKey",
            "GenerateDataKey",
            "Decrypt",
            "Encrypt",
            "ReEncryptFrom",
            "ReEncryptTo",
            "RetireGrant"
        ],
        "constraints": {
            "encryptionContextSubset": {
                "aws:cassandra:keyspaceName": "my_keyspace",
                "aws:cassandra:tableName": "my_table",
                "aws:cassandra:subscriberId": "123SAMPLE012"
            }
        },
        "retiringPrincipal": "cassandratest.us-east-1.amazonaws.com",
        "granteePrincipal": "cassandratest.us-east-1.amazonaws.com"
    },
    "responseElements": {
        "grantId": "18e4235f1b07f289762a31a1886cb5efd225f069280d4f76cd83b9b9b5501013"
    },
    "requestID": "b379a767-1f9b-48c3-b731-fb23e865e7f7",
    "eventID": "29ee1fd4-28f2-416f-a419-551910d20291",
    "readOnly": false,
    "resources": [
        {
            "accountId": "123SAMPLE012",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "eventCategory": "Management",
    "recipientAccountId": "123SAMPLE012"
}
```