ElastiCache 传输中加密(TLS) - Amazon ElastiCache for Redis
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

ElastiCache 传输中加密(TLS)

为了帮助确保数据安全,Amazon ElastiCache 和 Amazon EC2 提供了禁止未经授权来访问服务器上数据的机制。通过传输中加密功能,ElastiCache 为您提供了在不同位置之间移动数据时用来保护数据的工具。

在创建复制组时,可通过将参数 TransitEncryptionEnabled 设置为 true(CLI:--transit-encryption-enabled)在复制组中启用传输中加密。无论您使用 Amazon Web Services Management Console、Amazon CLI 还是 ElastiCache API 创建复制组,都可以采用此做法。如果要启用传输中加密,还必须为 CacheSubnetGroup 提供值。

传输中加密概览

Amazon ElastiCache 传输中加密是一项可选功能,它允许您在数据最脆弱时候(从一个位置传输到另一个位置时)提高数据的安全性。由于在端点加密和解密数据时需要进行一些处理,因此启用传输中加密会对性能产生一些影响。应对使用和不使用传输中加密的数据进行基准测试,以确定对使用案例的性能影响。

ElastiCache 传输中加密可实现以下功能:

  • 加密连接 – 服务器和客户端连接均采用安全套接字层(SSL)加密。

  • 加密复制 – 对在主节点与副本节点之间移动的数据进行加密。

  • 服务器身份验证 – 客户端可通过身份验证确定它们连接到正确的服务器。

  • 客户端身份验证 – 使用 Redis AUTH 功能,服务器可以对客户端进行身份验证。

传输中加密的条件

在规划实现时,应记住有关 Amazon ElastiCache 传输中加密的以下限制:

  • 在运行以下 Redis 版本的复制组上支持传输中加密:3.2.6、4.0.10 和更高版本。

  • 运行 Redis 版本 7 及更高版本的复制组支持修改现有集群的传输中加密设置。

  • 只有在 Amazon VPC 中运行的复制组支持传输中加密。

  • 只有运行以下节点类型的复制组才支持传输中加密。

    • R6g、R5、R4、R3

    • M6g、M5、M4、M3

    • T4g、T3、T2

    有关更多信息,请参阅受支持的节点类型

  • 通过显式将参数 TransitEncryptionEnabled 设置为 true 可启用传输中加密。

  • 要连接到已启用传输中加密的复制组,必须为数据库启用传输层安全性协议(TLS)。要连接到未启用传输中加密的复制组,数据库不得启用 TLS。

传输中加密最佳实践

  • 由于在端点加密和解密数据时需要进行一些处理,因此实现传输中加密会降低性能。使用自己的数据,对传输中加密进行基准测试,然后与不加密情况进行比较,以确定其对实现性能的影响。

  • 由于创建新连接的成本可能非常高,您可以通过保留 TLS 连接来减小传输中加密对性能的影响。

启用传输中加密

您可以使用 Amazon Web Services Management Console、Amazon CLI 或 ElastiCache API 启用传输中加密。

 

使用 Amazon Web Services Management Console为新集群启用传输中加密

要在使用 Amazon Web Services Management Console 创建复制组时启用传输中加密,请进行以下选择:

  • 选择 Redis 作为引擎。

  • 选择 3.2.6、4.0.10 或更高的引擎版本。

  • Encryption in-transit(传输中加密)列表中选择 Yes(是)

有关这个分步过程,请参阅以下内容:

 

使用 Amazon CLI 为新集群启用传输中加密

要在使用 Amazon CLI 创建 Redis 复制组时启用传输中加密,请使用参数 transit-encryption-enabled

在 Redis(已禁用集群模式)集群上启用传输中加密(CLI)

使用 Amazon CLI 操作 create-replication-group 和以下参数创建启用传输中加密的有副本 Redis 复制组:

关键参数:
  • --engine – 必须为 redis

  • --engine-version – 必须是 3.2.6、4.0.10 或更高版本。

  • --transit-encryption-enabled – 必填项。如果要启用传输中加密,还必须为 --cache-subnet-group 参数提供值。

  • --num-cache-clusters – 必须至少为 1。此参数的最大值为 6。

有关更多信息,请参阅下列内容:

在 Redis(已启用集群模式)集群上启用传输中加密(CLI)

使用 Amazon CLI 操作 create-replication-group 和以下参数创建启用了传输中加密的 Redis(已启用集群模式)复制组:

关键参数:
  • --engine – 必须为 redis

  • --engine-version – 必须是 3.2.6、4.0.10 或更高版本。

  • --transit-encryption-enabled – 必填项。如果要启用传输中加密,还必须为 --cache-subnet-group 参数提供值。

  • 使用以下参数集之一指定复制组的节点组配置:

    • --num-node-groups – 指定此复制组中的分片数(节点组)。此参数的最大值为 500。

      --replicas-per-node-group – 指定每个节点组中的副本节点数。此处指定的值适用于此复制组中的所有分片。此参数的最大值为 5。

    • --node-group-configuration – 分别指定每个分片的配置。

有关更多信息,请参阅下列内容:

 

使用 Amazon API 启用传输中加密

要在使用 ElastiCache API 创建 Redis 复制组时启用传输中加密,请将参数 TransitEncryptionEnabled 设置为 true,并针对单节点 Redis 复制组设置 CreateReplicationGroup,针对具有只读副本的复制组设置 CreateReplicationGroup

在 Redis(已禁用集群模式)集群上启用传输中加密(API)

使用 ElastiCache API 操作 CreateReplicationGroup 和以下参数创建启用了传输中加密的 Redis(已禁用集群模式)复制组:

关键参数
  • Engine – 必须为 redis

  • EngineVersion – 必须是 3.2.6、4.0.10 或更高版本。

  • TransitEncryptionEnabled – 必须设置为 true

    如果 TransitEncryptionEnabled 设置为 true,则还必须提供 CacheSubnetGroup 的值。

  • NumCacheClusters – 必须至少为 1。此参数的最大值为 6。

有关更多信息,请参阅下列内容:

在 Redis(已启用集群模式)集群上启用传输中加密(API)

使用 ElastiCache API 操作 CreateReplicationGroup 和以下参数创建启用了传输中加密的 Redis(已启用集群模式)复制组:

关键参数
  • Engine – 必须为 redis

  • EngineVersion – 必须是 3.2.6、4.0.10 或更高版本。

  • TransitEncryptionEnabled – 必须设置为 true

    如果 TransitEncryptionEnabled 设置为 true,则还必须提供 CacheSubnetGroup 的值。

  • 使用以下参数集之一指定复制组的节点组配置:

    • NumNodeGroups – 指定此复制组中的分片数(节点组)。此参数的最大值为 500,但可以通过服务限制提高请求将最大值增至 250。有关更多信息,请参阅 Amazon Service Limits

      ReplicasPerNodeGroup – 指定每个节点组中的副本节点数。此处指定的值适用于此复制组中的所有分片。此参数的最大值为 5。

    • NodeGroupConfiguration – 分别指定每个分片的配置。

有关更多信息,请参阅下列内容:

使用 Amazon Web Services Management Console为现有集群启用传输中加密

启用传输中加密分为两步,您必须先将传输加密模式设置为 preferred。此模式允许您的 Redis 客户端使用加密和未加密的连接进行连接。将所有 Redis 客户端迁移为使用加密连接后,您可以修改集群配置以将传输加密模式设置为 required。将传输加密模式设置为 required 将删除所有未加密的连接,并且仅允许加密连接。

第 1 步:将 Transit encryption mode(传输加密模式)设置为 Preferred(首选)
  1. 登录 Amazon Web Services Management Console 并打开 Amazon ElastiCache 控制台(https://console.aws.amazon.com/elasticache/)。

  2. 从左侧导航窗格上列出的 ElastiCache Resources(资源)中选择 Redis clusters(Redis 集群)。

  3. 选择要更新的 Redis cluster(Redis 集群)。

  4. 选择 Actions(操作)下拉列表,然后选择 Modify(修改)。

  5. Security(安全)部分的 Encryption in transit(传输中加密)下,选择 Enable(启用)。

  6. 选择 Preferred(首选)作为 Transit encryption mode(传输加密模式)。

  7. 选择 Preview changes(预览更改),然后保存更改。

将所有 Redis 客户端迁移为使用加密连接后:

第 2 步:将 Transit encryption mode(传输加密模式)设置为 Required(必需)
  1. 登录 Amazon Web Services Management Console 并打开 Amazon ElastiCache 控制台(https://console.aws.amazon.com/elasticache/)。

  2. 从左侧导航窗格上列出的 ElastiCache Resources(资源)中选择 Redis clusters(Redis 集群)。

  3. 选择要更新的 Redis cluster(Redis 集群)。

  4. 选择 Actions(操作)下拉列表,然后选择 Modify(修改)。

  5. Security(安全)部分中,选择 Required(必需)作为 Transit encryption mode(传输加密模式)。

  6. 选择 Preview changes(预览更改),然后保存更改。

使用 CLI 为现有集群启用传输中加密

启用传输中加密分为两步,您必须先将传输加密模式设置为 preferred。此模式允许您的 Redis 客户端使用加密和未加密的连接进行连接。将所有 Redis 客户端迁移为使用加密连接后,您可以修改集群配置以将传输加密模式设置为 required。将传输加密模式设置为 required 将删除所有未加密的连接,并且仅允许加密连接。

使用 Amazon CLI 操作 modify-replication-group 和以下参数更新禁用了传输中加密的 Redis(已启用集群模式)复制组。

启用传输中加密
  1. 使用以下参数将传输加密模式设置为 preferred

    • --transit-encryption-enabled – 必填项。

    • --transit-encryption-mode - 必须设置为 preferred

  2. 使用以下参数将传输加密模式设置为 required

    • --transit-encryption-enabled – 必填项。

    • --transit-encryption-mode - 必须设置为 required

使用 redis-cli 连接到启用了传输中加密的 Amazon ElastiCache for Redis 节点

要从启用了传输中加密的 ElastiCache for Redis 节点中访问数据,您可以使用利用安全套接字层(SSL)的客户端。您也可以在 Amazon Linux 和 Amazon Linux 2 上使用具有 TLS/SSL 的 redis-cli。

使用 redis-cli 连接到 Amazon Linux 2 或 Amazon Linux 上启用了传输中加密的 Redis 集群
  1. 下载并编译 redis-cli 实用工具。此实用工具包含在 Redis 软件发布版中。

  2. 在 EC2 实例的命令提示符处,键入以下命令:

    Amazon Linux 2

    sudo yum -y install openssl-devel gcc wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make distclean make redis-cli BUILD_TLS=yes sudo install -m 755 src/redis-cli /usr/local/bin/

    Amazon Linux

    sudo yum install gcc jemalloc-devel openssl-devel tcl tcl-devel clang wget wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make redis-cli CC=clang BUILD_TLS=yes sudo install -m 755 src/redis-cli /usr/local/bin/

    在 Amazon Linux 上,您可能还需要执行以下额外步骤:

    sudo yum install clang CC=clang make sudo make install
  3. 然后,建议您运行可选的 make-test 命令。

  4. 在 EC2 实例的命令提示符处,键入以下命令,并使用您的集群和端口的端点替换此示例中显示的相应内容。

    redis-cli -h Primary or Configuration Endpoint --tls -p 6379

    有关查找端点的更多信息,请参阅查找您的节点端点

    以下示例连接到已启用加密和身份验证的集群:

    redis-cli -h Primary or Configuration Endpoint --tls -a 'your-password' -p 6379

要解决此问题,您可以使用 stunnel 命令创建到 Redis 节点的 SSL 隧道。然后,您可以使用 redis-cli 连接到从隧道,以便从加密的 Redis 节点访问数据。

使用 redis-cli 连接到使用 stunnel 启用了传输中加密的 Redis 集群
  1. 使用 SSH 连接到您的客户端并安装 stunnel

    sudo yum install stunnel
  2. 运行以下命令可同时创建和编辑 '/etc/stunnel/redis-cli.conf' 文件,以将一个 ElastiCache for Redis 集群端点添加到一个或多个连接参数,并将下面提供的输出用作模板:

    vi /etc/stunnel/redis-cli.conf fips = no setuid = root setgid = root pid = /var/run/stunnel.pid debug = 7 delay = yes options = NO_SSLv2 options = NO_SSLv3 [redis-cli] client = yes accept = 127.0.0.1:6379 connect = primary.ssltest.wif01h.use1.cache.amazonaws.com:6379 [redis-cli-replica] client = yes accept = 127.0.0.1:6380 connect = ssltest-02.ssltest.wif01h.use1.cache.amazonaws.com:6379

    在此示例中,配置文件具有两个连接,即 redis-cliredis-cli-replica。参数设置如下所示:

    • client 设置为 yes(是)以指定此 Stunnel 实例是客户端。

    • accept 设置为客户端 IP。在此示例中,主 IP 设置为端口 6379 上的 Redis 默认 127.0.0.1。副本必须调用另一个端口并设置为 6380。您可以使用临时端口 1024-65535。有关更多信息,请参阅 Amazon VPC 用户指南中的临时端口

    • connect 设置为 Redis 服务器端点。有关更多信息,请参阅查找连接端点

  3. 启动 stunnel

    sudo stunnel /etc/stunnel/redis-cli.conf

    使用 netstat 命令确认隧道已启动。

    sudo netstat -tulnp | grep -i stunnel tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 3189/stunnel tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 3189/stunnel
  4. 使用隧道的本地端点连接到加密的 Redis 节点。

    • 如果在创建 ElastiCache for Redis 集群期间未使用 AUTH 密码,此示例将在 Amazon Linux 上使用 redis-cli 通过其完整路径连接到 ElastiCache for Redis 服务器:

      /home/ec2-user/redis-stable/src/redis-cli -h localhost -p 6379

      如果在创建 Redis 集群期间未使用 AUTH 密码,此示例将在 Amazon Linux 上使用 redis-cli 通过其完整路径连接到 Redis 服务器:

      /home/ec2-user/redis-stable/src/redis-cli -h localhost -p 6379 -a my-secret-password

    • 将目录更改为 redis-stable 并执行以下操作:

      如果在创建 ElastiCache for Redis 集群期间未使用 AUTH 密码,此示例将在 Amazon Linux 上使用 redis-cli 通过其完整路径连接到 ElastiCache for Redis 服务器:

      src/redis-cli -h localhost -p 6379

      如果在创建 Redis 集群期间未使用 AUTH 密码,此示例将在 Amazon Linux 上使用 redis-cli 通过其完整路径连接到 Redis 服务器:

      src/redis-cli -h localhost -p 6379 -a my-secret-password

    此示例使用 Telnet 连接到 Redis 服务器。

    telnet localhost 6379 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. auth MySecretPassword +OK get foo $3 bar
  5. 要停止并关闭 SSL 隧道,请对 Stunnel 过程执行 pkill 操作。

    sudo pkill stunnel

另请参阅