

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 数据加密
<a name="security-encryption"></a>

数据保护指在数据传输（发往和离开 Amazon Redshift 时）和处于静态（存储在 Amazon Redshift 数据中心的磁盘上时）期间保护数据。可以使用 SSL 或使用客户端加密保护传输中的数据。您可以通过以下选项在 Amazon Redshift 中保护静态数据。
+ **使用服务器端加密** – 您请求 Amazon Redshift 在将数据保存到数据中心的磁盘上之前加密对象，并在下载对象时进行解密。
+ **使用客户端加密** – 您可以在客户端加密数据并将加密的数据上载到 Amazon Redshift。在这种情况下，您需要管理加密过程、加密密钥和相关的工具。

# 静态加密
<a name="security-server-side-encryption"></a>

服务器端加密是静态数据加密，即，Amazon Redshift 在将数据写入其数据中心时选择性地对其进行加密，并在您访问时进行解密。只要您验证了您的请求并且拥有访问权限，您访问加密和未加密数据的方式就没有区别。

Amazon Redshift 通过加密为静态数据提供保护。（可选）您可以通过高级加密标准 AES-256，为存储在集群中磁盘上的所有数据以及 Amazon S3 中的所有备份提供保护。

要管理用于加密和解密 Amazon Redshift 资源的密钥，您可以使用 [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/)。AWS KMS 将安全、高度可用的硬件和软件结合起来，提供可扩展到云的密钥管理系统。利用 AWS KMS，您可创建加密密钥并定义控制这些密钥的使用方式的策略。AWS KMS 支持 AWS CloudTrail，因此，您可审核密钥使用情况以验证密钥是否使用得当。您可将 AWS KMS 密钥与 Amazon Redshift 和支持的 AWS 服务结合使用。有关支持 AWS KMS 的服务的列表，请参阅《AWS Key Management Service 开发人员指南》**中的 [AWS 服务如何使用 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/services.html)。

如果您选择使用 AWS Secrets Manager 来管理预置集群或无服务器命名空间的管理员密码，Amazon Redshift 还可接受额外的 AWS KMS 密钥，可供 AWS Secrets Manager 用于加密您的凭证。此额外的密钥可以是从 AWS Secrets Manager 自动生成的密钥，也可以是您提供的自定义密钥。

Amazon Redshift 查询编辑器 v2 安全存储输入到查询编辑器中的信息，如下所示：
+ 用于加密查询编辑器 v2 数据的 KMS 密钥的 Amazon 资源名称 (ARN)。
+ 数据库连接信息。
+ 文件和文件夹的名称和内容。

Amazon Redshift 查询编辑器 v2 使用 KMS 密钥或服务账户 KMS 密钥的数据块级加密来加密信息。Amazon Redshift 数据的加密由 Amazon Redshift 集群属性控制。

**Topics**
+ [Amazon Redshift 数据库加密](working-with-db-encryption.md)

# Amazon Redshift 数据库加密
<a name="working-with-db-encryption"></a>

在 Amazon Redshift 中，默认对数据库进行加密以保护静态数据。数据库加密将应用于集群及其快照。

您可以修改未加密的集群以使用 AWS Key Management Service（AWS KMS）加密。为此，您可以使用 AWS 拥有的密钥或客户托管式密钥。当您修改集群以启用 AWS KMS 加密时，Amazon Redshift 会自动将您的数据迁移到新加密的集群。从加密集群创建的快照也会被加密。您还可以通过修改集群和更改 **Encrypt database**（加密数据库）选项将加密的集群迁移到未加密的集群。有关更多信息，请参阅 [更改集群加密](changing-cluster-encryption.md)。

尽管在创建集群后，您仍可以将默认加密集群转换为未加密集群，但建议您将包含敏感数据的集群保持加密状态。此外，根据管理数据的准则或法规，您可能需要使用加密。例如，支付卡行业数据安全标准 (PCI DSS)、萨班斯-奥克斯利法 (SOX)、健康保险流通与责任法案 (HIPAA) 以及其他此类法规为处理特定类型数据提供了准则。

Amazon Redshift 使用加密密钥层次结构来加密数据库。您可以使用 AWS Key Management Service (AWS KMS) 或硬件安全模块 (HSM) 来管理该层次结构中的顶级加密密钥。Amazon Redshift 用于加密的流程因您管理密钥的方式而异。Amazon Redshift 自动集成了 AWS KMS 但没有集成 HSM。当您使用 HSM 时，必须使用客户端和服务器证书在 Amazon Redshift 和 HSM 之间配置受信任的连接。

**重要**  
 禁用客户自主管理型 KMS 密钥后，Amazon Redshift 可能会失去对预置集群或无服务器命名空间的 KMS 密钥的访问权限。在这些情况下，Amazon Redshift 对 Amazon Redshift 数据仓库进行备份，并将其置于 `inaccessible-kms-key` 状态达 14 天。如果您在这段时间内恢复 KMS 密钥，Amazon Redshift 将恢复访问权限，仓库将正常运行。如果 14 天的期限结束时没有恢复 KMS 密钥，Amazon Redshift 将删除该数据仓库。当仓库处于 `inaccessible-kms-key` 状态时，仓库具有以下特征：  
 不能对数据仓库运行任何查询。
 如果数据仓库是数据共享的生产者仓库，则无法从使用者仓库对其运行数据共享查询。
 无法创建跨区域快照副本。
有关恢复已禁用的 KMS 密钥的信息，请参阅《AWS Key Management Service Developer Guide》**中的 [Enable and disable keys](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html)。如果删除了仓库的 KMS 密钥，则可以在删除 `inaccessible-kms-key` 状态的仓库之前使用备份创建新的数据仓库。

## 改进加密过程以提高性能和可用性
<a name="resize-classic-encryption"></a>

### 使用 RA3 节点加密
<a name="resize-classic-encryption-ra3"></a>

 对 RA3 节点加密过程的更新大幅改进了体验。读取和写入查询都可以在此过程中运行，而加密对性能的影响较小。此外，加密完成的速度要快得多。更新的过程步骤包括还原操作，以及将集群元数据迁移到目标集群的操作。例如，改进的体验适用于诸如 AWS KMS 的加密类型。当您拥有 PB 级的数据量时，操作时间从几周缩短到几天。

在加密集群之前，如果您计划继续运行数据库工作负载，则可以通过添加具有弹性大小调整功能的节点来提高性能并加快此过程。在加密过程中不能使用弹性大小调整功能，因此，请在加密之前执行此操作。请注意，添加节点通常会导致成本增加。

### 使用其他节点类型加密
<a name="resize-classic-encryption-ds2"></a>

当您加密使用 DC2 节点的集群时，您无法像使用 RA3 节点那样运行写入查询。只能运行读取查询。

### 使用 RA3 节点进行加密的用法说明
<a name="resize-classic-encryption-usage"></a>

以下见解和资源有助于您做好准备进行加密并监控整个加密过程。
+ **开始加密后运行查询** - 加密开始后，大约十五分钟内即可进行读取和写入。完成完整加密过程需要的时间取决于集群上的数据量和工作负载级别。
+ **加密需要多长时间？** – 加密数据的时间取决于多个因素：包括正在运行的工作负载数量、所用的计算资源、节点的数量，以及节点的类型。我们建议您首先在测试环境中执行加密。根据经验，如果您处理的数据量达到 PB 级，则可能需要 1-3 天才能完成加密。
+ **我如何知道加密已完成？** – 启用加密功能后，第一张快照的完成即确认加密已完成。
+ **回滚加密** - 如果您需要回滚加密操作，最好是从加密启动之前进行的最新备份中还原。在最后一次备份之后，必须重新应用任何新的更新（更新/删除/插入）。
+ **执行表还原** – 请注意，您无法将表从未加密集群还原到加密集群。
+ **加密单节点集群** – 加密单节点集群具有性能限制。此过程所花的时间比多节点集群加密要长。
+ **加密后创建备份** – 加密集群中的数据时，只有在集群完全加密后才会创建备份。此过程所需的时间量可能会有所不同。备份所需的时间可能为数小时到数天，具体取决于集群大小。加密完成后，可能有一段延迟，然后才会创建备份。

  注意，由于在加密过程中发生备份和还原操作，因此不会保留使用 `BACKUP NO` 创建的任何表或实体化视图。有关更多信息，请参阅 [CREATE TABLE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html) 或 [CREATE MATERIALIZED VIEW](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-create-sql-command.html)。

**Topics**
+ [改进加密过程以提高性能和可用性](#resize-classic-encryption)
+ [使用 AWS KMS 的加密](#working-with-aws-kms)
+ [使用硬件安全模块的加密](#working-with-HSM)
+ [加密密钥轮换](#working-with-key-rotation)
+ [更改集群加密](changing-cluster-encryption.md)
+ [迁移到 HSM 加密的集群](migrating-to-an-encrypted-cluster.md)
+ [轮换加密密钥](manage-key-rotation-console.md)

## 使用 AWS KMS 的加密
<a name="working-with-aws-kms"></a>

当您选择 AWS KMS 对 Amazon Redshift 进行密钥管理时，加密密钥层次结构有四层。按层次顺序，这些密钥是根密钥、集群加密密钥（CEK）、数据库加密密钥（DEK）和数据加密密钥。

当您启动集群时，Amazon Redshift 会返回 Amazon Redshift 或您的 AWS 账户所创建或有权在 AWS KMS 中使用的 AWS KMS keys 的列表。在加密层次结构中选择要用作根密钥的 KMS 密钥。

默认情况下，Amazon Redshift 会选择自动生成的 AWS 拥有的密钥作为您的 AWS 账户的根密钥，以便在 Amazon Redshift 中使用。

如果不希望使用默认密钥，在 Amazon Redshift 中启动集群之前，您必须在 AWS KMS 中单独拥有（或创建）一个客户托管式 KMS 密钥。客户托管式密钥可为您提供更大灵活度，包括创建、转动、禁用、定义访问控制，以及审计用于保护数据的加密密钥的能力。有关创建 KMS 密钥的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

如果您希望使用其他 AWS 账户中的 AWS KMS 密钥，则您必须有权使用该密钥并在 Amazon Redshift 中指定其 Amazon Resource Name (ARN)。有关在 AWS KMS 中访问密钥的更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[控制对您的密钥的访问](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html)。

当您选择根密钥之后，Amazon Redshift 会请求 AWS KMS 生成数据密钥，并使用所选的根密钥对其进行加密。此数据密钥在 Amazon Redshift 中用作 CEK。AWS KMS 将已加密的 CEK 导出到 Amazon Redshift 中，该 CEK 以及对 KMS 密钥的授权和 CEK 的加密上下文在独立于该集群的网络中的磁盘内部存储。只有加密的 CEK 才会导出到 Amazon Redshift；KMS 密钥仍保留在 AWS KMS 中。Amazon Redshift 还会通过安全通道将已加密的 CEK 传递到集群中，并将其加载到内存中。然后，Amazon Redshift 会调用 AWS KMS 以解密 CEK，并将已解密的 CEK 加载到内存中。有关授予、加密上下文和其他 AWS KMS 相关概念，请参阅 *AWS Key Management Service 开发人员指南*中的[概念](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html)。

接着，Amazon Redshift 会随机生成一个密钥以用作 DEK，并将其加载到集群的内存中。已解密的 CEK 用于加密 DEK，然后，Amazon Redshift 便会通过安全通道从该集群传递 DEK，以使其在独立于该集群的网络中的磁盘内部存储。与 CEK 一样，DEK 的加密版本和解密版本都会加载到集群中的内存中。然后，DEK 的解密版本将用于加密为数据库中的每个数据块随机生成的各个加密密钥。

当该集群重启时，Amazon Redshift 先使用内部存储的加密版 CEK 和 DEK，将其重新加载到内存中，然后调用 AWS KMS 以再次使用 KMS 密钥解密 CEK，以便其加载到内存中。然后使用解密的 CEK 再次解密 DEK，并将解密的 DEK 加载到内存中，并根据需要用于加密和解密数据块密钥。

有关创建使用 AWS KMS 密钥加密的 Amazon Redshift 集群的更多信息，请参阅[创建集群](create-cluster.md)。

### 将 AWS KMS 加密的快照复制到另一个 AWS 区域
<a name="configure-snapshot-copy-grant"></a>

AWS KMS 密钥特定于 AWS 区域。如果要允许将 Amazon Redshift 快照从一个加密的源集群复制到另一个 AWS 区域，并为目标中的快照使用您自己的 AWS KMS 密钥，您需要为 Amazon Redshift 配置授予，以便在目标 AWS 区域中使用根密钥。此授予使 Amazon Redshift 能够在目标 AWS 区域中加密快照。如果您希望通过 AWS 区域拥有的密钥对目标中的快照进行加密，则无需在目标 AWS 区域中配置任何授予。有关跨区域快照复制的更多信息，请参阅[将快照复制到其它 AWS 区域](cross-region-snapshot-copy.md)。

**注意**  
如果您启用已加密集群中的快照复制功能，并针对根密钥使用 AWS KMS，则无法重命名集群，因为集群名称是加密上下文的一部分。如果您必须重命名集群，则可以禁用在源 AWS 区域中复制快照，重命名集群，然后再次配置并启用快照复制。

配置复制快照的授权的过程如下所示。

1. 在目标 AWS 区域中，通过执行以下操作创建快照复制授权：
   +  如果您没有 AWS KMS 密钥可用，请创建一个。有关创建 AWS KMS 密钥的更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。
   + 指定快照复制授权的名称。此名称必须在您的 AWS 账户的 AWS 区域中唯一。
   + 为您创建的授权指定 AWS KMS 密钥 ID。如果您未指定密钥 ID，则该授予会应用于您的默认密钥。

1. 在源 AWS 区域中，启用快照复制并指定您在目标 AWS 区域中创建的快照复制授权的名称。

前述流程仅适用于您使用 AWS CLI、Amazon Redshift API 或开发工具包启用快照复制功能的情况。如果您使用控制台，在您启用跨区域快照复制时，Amazon Redshift 将提供相应的工作流程以配置授权。有关使用控制台为 AWS KMS 加密的集群配置跨区域快照复制的更多信息，请参阅[为 AWS KMS 加密的集群配置跨区域快照副本](xregioncopy-kms-encrypted-snapshot.md)。

快照复制到目标 AWS 区域之前，Amazon Redshift 使用源 AWS 区域中的根密钥解密快照并使用 Amazon Redshift 内部管理的随机生成的 RSA 密钥临时对其进行重新加密。然后，Amazon Redshift 将快照通过安全通道复制到目标 AWS 区域，使用内部托管式 RSA 密钥解密快照，然后使用目标 AWS 区域中的根密钥重新加密快照。

## 使用硬件安全模块的加密
<a name="working-with-HSM"></a>

如果您不使用 AWS KMS 管理密钥，则可以使用硬件安全模块 (HSM) 在 Amazon Redshift 中管理密钥。

**重要**  
DC2 和 RA3 节点类型不支持 HSM 加密。

HSM 是直接控制密钥生成和管理的设备。HSM 使密钥管理独立于应用程序和数据库层，以提供更强的安全性。Amazon Redshift 支持 AWS CloudHSM Classic 进行密钥管理。使用 HSM 管理加密密钥的加密流程与 AWS KMS 不同。

**重要**  
Amazon Redshift 仅支持 AWS CloudHSM Classic。我们不支持较新的 AWS CloudHSM 服务。  
AWS CloudHSM Classic 不对新客户开放。有关更多信息，请参阅 [CloudHSM Classic 定价](https://aws.amazon.com/cloudhsm/pricing-classic/)。AWS CloudHSMClassic 并非在所有 AWS 区域可用。有关可用 AWS 区域的更多信息，请参阅 [AWS 区域列表](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。

当您配置集群以使用 HSM 时，Amazon Redshift 会向 HSM 发出请求，以生成并存储要用作 CEK 的密钥。不过，与 AWS KMS 不同，HSM 不会将 CEK 导出到 Amazon Redshift 中。Amazon Redshift 会在集群中随机生成 DEK，并将其传递到 HSM 中，由 CEK 进行加密。HSM 会将已加密的 DEK 返回到 Amazon Redshift 中，由随机生成的内部根密钥进行加密并在独立于该集群的网络中的磁盘内部存储。Amazon Redshift 还会将解密版 DEK 加载到集群的内存中，以便 DEK 可用于加密和解密数据块的各个密钥。

如果该集群重启，则 Amazon Redshift 会使用内部根密钥解密内部存储的双重加密 DEK，以将内部存储的 DEK 还原为 CEK 加密状态。然后，CEK 加密的 DEK 会传递到 HSM 进行加密并传递回 Amazon Redshift，以便再次加载到内存中用于各个数据块密钥。

### 在 Amazon Redshift 和 HSM 之间配置受信任的连接
<a name="configure-trusted-connection"></a>

如果您选择使用 HSM 管理集群密钥，则需要在 Amazon Redshift 和 HSM 之间配置受信任的网络连接。执行此操作需要配置客户端和服务器证书。在加密和解密操作过程中，受信任的连接用于在 HSM 和 Amazon Redshift 之间传递加密密钥。

Amazon Redshift 会通过随机生成的私有和公有键前缀创建公有客户端证书。这些都进行了加密，并在内部存储。您可以在 HSM 中下载并注册公有客户端证书，并将其分配给适用的 HSM 分区。

您需要为 Amazon Redshift 提供 HSM IP 地址、HSM 分区名称、HSM 分区密码以及公有 HSM 服务器证书，该证书使用内部根密钥进行了加密。Amazon Redshift 会完成配置流程并验证其能否连接到 HSM。如果无法使用，则集群将进入 INCOMPATIBLE\$1HSM 状态，并且不会创建集群。在这种情况下，您必须删除不完整的集群，然后重试。

**重要**  
当您将集群修改为使用其他 HSM 分区时，Amazon Redshift 将验证它是否能连接到新分区，但不会验证是否存在有效的加密密钥。在使用新分区之前，您必须将密钥复制到新分区。如果集群已重新启动，而 Amazon Redshift 无法找到有效密钥，重新启动将失败。有关更多信息，请参阅[在 HSM 中复制密钥](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cli-clone-hapg.html)。

初始配置之后，如果 Amazon Redshift 无法连接到 HSM，则系统会记录一个事件。有关这些事件的更多信息，请参阅 [Amazon Redshift 事件通知](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-event-notifications.html)。

## 加密密钥轮换
<a name="working-with-key-rotation"></a>

在 Amazon Redshift 中，您可以轮换已加密集群的加密密钥。当您启动密钥轮换流程时，Amazon Redshift 会轮换指定集群以及该集群的任何自动或手动快照的 CEK。Amazon Redshift 还会轮换指定集群的 DEK，但不会轮换快照的 DEK，而这些快照在 Amazon Simple Storage Service（Amazon S3）内部存储并使用现有 DEK 进行了加密。

在轮换进行过程中，该集群将处于 ROTATING\$1KEYS 状态一直到轮换完成为止，届时，该集群将还原为 AVAILABLE 状态。Amazon Redshift 会在密钥轮换过程中处理解密和重新加密。

**注意**  
如果没有源集群，则无法轮换快照的密钥。在删除集群之前，请考虑其快照是否依赖密钥轮换。

由于集群在密钥轮换过程中暂时不可用，因此您应该只在数据需求需要时或在怀疑密钥可能已被破坏时轮换密钥。作为最佳实践，您应该查看存储的数据的类型，并计划对该数据进行加密的密钥的轮换频率。轮换密钥的频率取决于贵公司的数据安全策略以及关于敏感数据和监管合规的任何行业标准。确保您的计划平衡安全需求和集群的可用性考虑因素。

有关轮换密钥的更多信息，请参阅[轮换加密密钥](manage-key-rotation-console.md)。

# 更改集群加密
<a name="changing-cluster-encryption"></a>

可以使用 AWS 拥有的密钥或客户自主管理型密钥来修改未加密的集群，以使用 AWS Key Management Service（AWS KMS）加密。当您修改集群以启用 AWS KMS 加密时，Amazon Redshift 会自动将您的数据迁移到新加密的集群。还可以通过使用 AWS CLI（而不是 AWS 管理控制台）修改集群，来将加密的集群迁移到未加密的集群。

在迁移操作过程中，您的集群在只读模式下可用，并且集群状态显示为**调整大小**。

如果您的集群配置为启用跨 AWS 区域快照副本，您必须在更改加密之前将其禁用。有关更多信息，请参阅[将快照复制到其它 AWS 区域](cross-region-snapshot-copy.md)和[为 AWS KMS 加密的集群配置跨区域快照副本](xregioncopy-kms-encrypted-snapshot.md)。您无法通过修改集群启用硬件安全模块 (HSM) 加密。而是创建一个新的 HSM 加密集群，并将您的数据迁移到新集群。有关更多信息，请参阅 [迁移到 HSM 加密的集群](migrating-to-an-encrypted-cluster.md)。

------
#### [ Amazon Redshift console ]

1. 登录到 AWS 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。

1. 在导航菜单上，选择 **Clusters（集群）**，然后选择要修改加密的集群。

1. 选择 **Properties (属性)**。

1. 在 **Database configurations**（数据库配置）部分，选择 **Edit**（编辑），然后选择 **Edit encryption**（编辑加密）。

1. 选择其中一个加密选项，然后选择 **Save changes（保存更改）**。

------
#### [ AWS CLI ]

若要修改未加密的集群以使用 AWS KMS，请运行 `modify-cluster` CLI 命令并指定 `–-encrypted`，如下所示。预设情况下，使用默认 KMS 密钥。要指定客户托管式密钥，请包含 `--kms-key-id` 选项。

```
aws redshift modify-cluster --cluster-identifier <value> --encrypted --kms-key-id <value>
```

要从集群中删除加密，请运行以下 CLI 命令。

```
aws redshift modify-cluster --cluster-identifier <value> --no-encrypted
```

------

# 迁移到 HSM 加密的集群
<a name="migrating-to-an-encrypted-cluster"></a>

要将未加密的集群迁移到使用硬件安全模块 (HSM) 加密的集群，请创建新的加密集群并将数据移动到新集群。您不能通过修改集群迁移到 HSM 加密的集群。

要从未加密的集群迁移到 HSM 加密的集群，首先从现有的源集群中卸载数据。然后使用所选的加密设置将数据重新加载到新的目标集群中。有关启动加密集群的更多信息，请参阅[Amazon Redshift 数据库加密](working-with-db-encryption.md)。

在迁移过程中，源集群可用于只读查询，直到最后一步。最后一步是重命名目标集群和源集群，用于切换端点，以便将所有流量路由到新的目标集群。在重命名后重新启动之前，目标集群不可用。在传输数据时，暂停源集群上的所有数据加载和其他写入操作。<a name="prepare-for-migration"></a>

**准备迁移**

1. 确定与 Amazon Redshift 交互的所有关联系统，例如业务情报 (BI) 工具以及提取、转换和加载 (ETL) 系统。

1. 确定用于测试迁移的验证查询。

   例如，您可以使用以下查询来查找用户定义表的数目。

   ```
   select count(*)
   from pg_table_def
   where schemaname != 'pg_catalog';
   ```

   以下查询返回所有用户定义表的列表以及每个表中的行数。

   ```
   select "table", tbl_rows
   from svv_table_info;
   ```

1. 选择迁移的好时机。要查找集群使用率最低的时间，请监控 CPU 利用率和数据库连接数量等集群指标。有关更多信息，请参阅 [查看集群性能数据](performance-metrics-perf.md)。

1. 删除未使用的表。

   要创建表列表和查询每个表的次数，请运行以下查询。

   ```
   select database,
   schema,
   table_id,
   "table",
   round(size::float/(1024*1024)::float,2) as size,
   sortkey1,
   nvl(s.num_qs,0) num_qs
   from svv_table_info t
   left join (select tbl,
   perm_table_name,
   count(distinct query) num_qs
   from stl_scan s
   where s.userid > 1
   and   s.perm_table_name not in ('Internal worktable','S3')
   group by tbl,
   perm_table_name) s on s.tbl = t.table_id
   where t."schema" not in ('pg_internal');
   ```

1. 启动新的加密集群。

   对目标集群使用与源集群相同的端口号。有关启动加密集群的更多信息，请参阅[Amazon Redshift 数据库加密](working-with-db-encryption.md)。

1. 设置卸载和加载过程。

   您可以使用 [Amazon Redshift 卸载/复制实用工具](https://github.com/awslabs/amazon-redshift-utils/tree/master/src/UnloadCopyUtility)来帮助您在集群之间迁移数据。该实用工具会将源集群的数据导出到 Simple Storage Service（Amazon S3）上的某个位置。使用 AWS KMS 加密数据。然后，该实用工具会自动将数据导入到目标中。或者，您可以使用该实用程序在迁移完成后清除 Simple Storage Service（Amazon S3）。

1. 运行测试以验证您的过程并估计必须暂停写入操作的时间。

   在卸载和加载操作期间，通过暂停数据加载和其他写入操作来维护数据一致性。使用最大的表之一，运行卸载和加载过程，以帮助您估计时间。

1. 创建数据库对象，如 schema、视图和表。要帮助您生成必要的数据定义语言 (DDL) 语句，您可以使用 AWS GitHub 存储库中的 [AdminViews](https://github.com/awslabs/amazon-redshift-utils/tree/master/src/AdminViews) 中的脚本。<a name="migration-your-cluster"></a>

**要迁移集群**

1. 停止源集群上的所有 ETL 流程。

   要确认进程中未执行任何写入操作，请使用 Amazon Redshift 管理控制台来监控写入 IOPS。有关更多信息，请参阅 [查看集群性能数据](performance-metrics-perf.md)。

1. 运行您之前确定的验证查询，以便在迁移前收集有关未加密源集群的信息。

1. （可选）创建一个工作负载管理 (WLM) 队列，以使用源集群和目标集群中的最大可用资源。例如，创建名为 `data_migrate` 的队列并将队列配置为内存 95%，并发性为 4。有关更多信息，请参阅 *Amazon Redshift 数据库开发人员指南*中的[基于用户组和查询组将查询路由至队列中](https://docs.aws.amazon.com/redshift/latest/dg/tutorial-wlm-routing-queries-to-queues.html)。

1. 使用 `data_migrate` 队列，运行 UnloadCopyUtility。

   使用 Amazon Redshift 控制台监控 UNLOAD 和 COPY 进程。

1. 再次运行验证查询，并验证结果是否与源集群的结果匹配。

1. 重命名源集群和目标集群以交换端点。为避免中断，请在工作时间以外执行此操作。

1. 验证您是否可以使用所有 SQL 客户端（如 ETL 和报告工具）连接到目标集群。

1. 关闭未加密的源集群。

# 轮换加密密钥
<a name="manage-key-rotation-console"></a>

您可以借助 Amazon Redshift 控制台以使用以下过程来轮换加密密钥。

**要为集群轮换加密密钥**

1. 登录到 AWS 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。

1. 在导航菜单上，选择 **Clusters（集群）**，然后选择要更新加密密钥的集群。

1. 对于 **Actions**（操作），选择 **Rotate encryption**（轮换加密）以显示 **Rotate encryption keys**（轮换加密密钥）页面。

1. 正在 **Rotate encryption keys（轮换加密密钥）**页面上，选择 **Rotate encryption keys（轮换加密密钥）**。

# 传输中加密
<a name="security-encryption-in-transit"></a>

可以配置环境来保护传输中数据的机密性和完整性。

以下详细信息适用于加密在 Amazon Redshift 集群和 SQL 客户端之间通过 JDBC/ODBC 传输的数据：
+ 您可以通过 Java 数据库连接 (JDBC) 和开放式数据库连接 (ODBC) 这两种连接将 SQL 客户端工具连接到 Amazon Redshift 集群。
+ Amazon Redshift 支持安全套接字层 (SSL) 连接来加密数据和服务器证书，以验证客户端连接到的服务器证书。客户端连接到 Amazon Redshift 集群的领导节点。有关更多信息，请参阅 [配置连接的安全选项](connecting-ssl-support.md)。
+ 为了支持 SSL 连接，Amazon Redshift 会在每个集群中创建并安装 AWS Certificate Manager (ACM) 颁发的证书。有关更多信息，请参阅 [将 SSL 连接过渡到 ACM 证书](connecting-transitioning-to-acm-certs.md)。
+ 为保护AWS云中的传输中数据，Amazon Redshift 使用硬件加速的 SSL 与 Amazon S3 或 Amazon DynamoDB 通信以执行 COPY、UNLOAD、备份和还原操作。

以下详细信息适用于加密在 Amazon Redshift 集群与 Amazon S3 或 DynamoDB 之间传输的数据：
+ Amazon Redshift 使用硬件加速的 SSL 与 Amazon S3 或 DynamoDB 通信以执行 COPY、UNLOAD、备份和还原操作。
+ Redshift Spectrum 支持使用受 AWS Key Management Service (KMS) 管理的账户默认密钥的 Amazon S3 服务器端加密 (SSE)。
+ 可以使用 Amazon S3 和 AWS KMS 来加密 Amazon Redshift 加载。有关更多信息，请参阅[使用 Amazon S3 和 AWS KMS 加密您的 Amazon Redshift 加载](https://aws.amazon.com/blogs/big-data/encrypt-your-amazon-redshift-loads-with-amazon-s3-and-aws-kms/)。

以下详细信息适用于对在 AWS CLI、SDK 或 API 客户端与 Amazon Redshift 端点之间传输的数据进行加密和签名：
+ Amazon Redshift 为加密传输中的数据提供了 HTTPS 端点。
+ 为了保护向 Amazon Redshift 出的 API 请求的完整性，API 调用必须由调用者签名。调用由 X.509 证书或客户的 AWS 秘密访问密钥根据前面版本 4 签名流程 (Sigv4) 签名。有关更多信息，请参阅《AWS 一般参考》**中的[签名版本 4 签名流程](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)。
+ 使用 AWS CLI 或 AWS 开发工具包之一向 AWS 发出请求。这些工具会自动使用您在配置工具时指定的访问密钥为您签署请求。

以下详细信息适用于加密在 Amazon Redshift 集群与 Amazon Redshift 查询编辑器 V2 之间传输的数据：
+ 数据通过 TLS-加密通道在查询编辑器 V2 与 Amazon Redshift 集群之间传输。

# 通过 Amazon Redshift 执行 VPC 加密控制功能
<a name="security-vpc-encryption-controls"></a>

Amazon Redshift 支持 [VPC 加密控制](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-encryption-controls.html)，这是一项安全功能，可助您对某个区域中的 VPC 内部以及跨 VPC 的所有流量强制执行传输中加密。本文档介绍如何在 Amazon Redshift 集群和无服务器工作组中执行 VPC 加密控制功能。

VPC 加密控制功能提供了集中化控制能力，以便在您的 VPC 内部监控并强制执行传输中加密。在强制模式下启用此功能后，它可确保所有网络流量都在硬件层（使用 AWS Nitro System）或应用层（使用 TLS/SSL）进行加密。

Amazon Redshift 与 VPC 加密控制功能集成，助您满足医疗保健（HIPAA）、政府（FedRAMP）和金融（PCI DSS）等行业的合规要求。

## VPC 加密控制功能与 Amazon Redshift 的协作方式
<a name="security-vpc-encryption-controls-sypnosis"></a>

VPC 加密控制功能在两种模式下运行：
+ 监控模式：可清晰呈现流量的加密状态，并帮助识别允许非加密流量的资源。
+ 强制模式：禁止在 VPC 中创建或使用允许非加密流量的资源。所有流量都必须在硬件层（基于 Nitro 的实例）或应用层（TLS/SSL）进行加密。

## 使用 VPC 加密控制功能的要求
<a name="security-vpc-encryption-controls-requirements"></a>

**实例类型要求**

Amazon Redshift 要求使用基于 Nitro 的实例来支持 VPC 加密控制功能。所有现代 Redshift 实例类型都支持必要的加密功能。

**SSL/TLS 要求**

在强制模式下启用 VPC 加密控制功能时，require\$1ssl 参数必须设置为 true 且不能禁用。这可确保所有客户端连接均采用加密的 TLS 连接。

## 迁移到 VPC 加密控制功能
<a name="security-vpc-encryption-controls-migration"></a>

**对于现有集群和工作组**

在包含现有 Redshift 集群或无服务器工作组的 VPC 上，无法在强制模式下启用 VPC 加密控制功能。如果您已有集群或工作组，请按以下步骤操作来使用加密控制功能：

1. 创建现有集群或命名空间的快照

1. 创建一个新的 VPC，并在强制模式下启用 VPC 加密控制功能

1. 通过使用下列操作之一，从快照还原至新 VPC：
   + 对于预调配集群：使用 `restore-from-cluster-snapshot` 操作
   + 对于无服务器：在工作组上使用 `restore-from-snapshot` 操作

**在 VPC 中创建新的集群或工作组并启用加密控制功能时，必须将 require\$1ssl 参数设置为 true。**

Amazon Redshift 要求使用基于 Nitro 的实例来支持 VPC 加密控制功能。所有现代 Redshift 实例类型都支持必要的加密功能。

**SSL/TLS 要求**

在强制模式下启用 VPC 加密控制功能时，require\$1ssl 参数必须设置为 true 且不能禁用。这可确保所有客户端连接均采用加密的 TLS 连接。

## 注意事项和限制
<a name="security-vpc-encryption-controls-limitations"></a>

在 Amazon Redshift 中使用 VPC 加密控制功能时，需注意以下几点：

**VPC 状态限制**
+ 当 VPC 加密控制功能处于 `enforce-in-progress` 状态时，集群和工作组创建操作将被阻止
+ 您必须等到 VPC 进入 `enforce` 模式后，再创建新的资源

**SSL 配置**
+ require\$1ssl 参数：对于在已实施加密的 VPC 中创建的集群与工作组，该参数的值必须始终为 `true`
+ 在已实施加密的 VPC 中创建集群或工作组后，`require_ssl` 在其生命周期内不能禁用

**区域可用性**

在以下区域内，Amazon Redshift Serverless 不支持在强制模式下启用 VPC 加密控制功能：
+ 南美洲（圣保罗）
+ 欧洲（苏黎世）

# 密钥管理
<a name="security-key-management"></a>

您可以配置环境以使用密钥保护数据：
+ Amazon Redshift 自动与 AWS Key Management Service (AWS KMS) 集成以进行密钥管理。AWS KMS 使用信封加密。有关更多信息，请参阅[信封加密](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)。
+ 在 AWS KMS 中管理加密密钥时，Amazon Redshift 使用基于密钥的四层架构进行加密。此架构包括随机生成的 AES-256 数据加密密钥、数据库密钥、集群密钥和根密钥。有关更多信息，请参阅 [Amazon Redshift 如何使用 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/services-redshift.html)。
+ 您可以在 AWS KMS 中创建自己的客户托管式密钥。有关更多信息，请参阅[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。
+ 您也可为新 AWS KMS keys 导入自己的密钥材料。有关更多信息，请参阅[将密钥材料导入 AWS Key Management Service (AWS KMS) 中](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html)。
+ Amazon Redshift 支持在外部硬件安全模块 (HSM) 中管理加密密钥。HSM 可以为本地，也可以为 AWS CloudHSM。当您使用 HSM 时，必须使用客户端和服务器证书在 Amazon Redshift 和 HSM 之间配置受信任的连接。Amazon Redshift 仅支持 AWS CloudHSM Classic 进行密钥管理。有关更多信息，请参阅 [使用硬件安全模块的加密](working-with-db-encryption.md#working-with-HSM)。有关 AWS CloudHSM 的信息，请参阅[什么是 AWS CloudHSM？](https://docs.aws.amazon.com/cloudhsm/latest/userguide/introduction.html) 
+ 您可以轮换已加密集群的加密密钥。有关更多信息，请参阅 [加密密钥轮换](working-with-db-encryption.md#working-with-key-rotation)。