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(首选)
-
登录 Amazon Web Services Management Console 并打开 Amazon ElastiCache 控制台(https://console.aws.amazon.com/elasticache/
)。 -
从左侧导航窗格上列出的 ElastiCache Resources(资源)中选择 Redis clusters(Redis 集群)。
-
选择要更新的 Redis cluster(Redis 集群)。
-
选择 Actions(操作)下拉列表,然后选择 Modify(修改)。
-
在 Security(安全)部分的 Encryption in transit(传输中加密)下,选择 Enable(启用)。
-
选择 Preferred(首选)作为 Transit encryption mode(传输加密模式)。
-
选择 Preview changes(预览更改),然后保存更改。
将所有 Redis 客户端迁移为使用加密连接后:
第 2 步:将 Transit encryption mode(传输加密模式)设置为 Required(必需)
-
登录 Amazon Web Services Management Console 并打开 Amazon ElastiCache 控制台(https://console.aws.amazon.com/elasticache/
)。 -
从左侧导航窗格上列出的 ElastiCache Resources(资源)中选择 Redis clusters(Redis 集群)。
-
选择要更新的 Redis cluster(Redis 集群)。
-
选择 Actions(操作)下拉列表,然后选择 Modify(修改)。
-
在 Security(安全)部分中,选择 Required(必需)作为 Transit encryption mode(传输加密模式)。
-
选择 Preview changes(预览更改),然后保存更改。
使用 CLI 为现有集群启用传输中加密
启用传输中加密分为两步,您必须先将传输加密模式设置为 preferred
。此模式允许您的 Redis 客户端使用加密和未加密的连接进行连接。将所有 Redis 客户端迁移为使用加密连接后,您可以修改集群配置以将传输加密模式设置为 required
。将传输加密模式设置为 required
将删除所有未加密的连接,并且仅允许加密连接。
使用 Amazon CLI 操作 modify-replication-group
和以下参数更新禁用了传输中加密的 Redis(已启用集群模式)复制组。
启用传输中加密
-
使用以下参数将传输加密模式设置为
preferred
-
--transit-encryption-enabled
– 必填项。 -
--transit-encryption-mode
- 必须设置为preferred
。
-
-
使用以下参数将传输加密模式设置为
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 集群
下载并编译 redis-cli 实用工具。此实用工具包含在 Redis 软件发布版中。
在 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
然后,建议您运行可选的
make-test
命令。在 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 集群
-
使用 SSH 连接到您的客户端并安装
stunnel
。sudo yum install stunnel
-
运行以下命令可同时创建和编辑
'/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-cli
和redis-cli-replica
。参数设置如下所示: -
启动
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
-
使用隧道的本地端点连接到加密的 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
-
-
要停止并关闭 SSL 隧道,请对 Stunnel 过程执行
pkill
操作。sudo pkill stunnel