ElastiCache 传输中加密(TLS)
为了帮助确保数据安全,Amazon ElastiCache 和 Amazon EC2 提供了禁止未经授权来访问服务器上数据的机制。通过传输中加密功能,ElastiCache 为您提供了在不同位置之间移动数据时用来保护数据的工具。
所有 Valkey 或 Redis OSS 无服务器缓存均启用了传输中加密。对于自行设计的集群,在创建复制组时,您可将参数 TransitEncryptionEnabled
设置为 true
(CLI:--transit-encryption-enabled
),以此在复制组中启用传输中加密。无论您使用 AWS Management Console、AWS CLI 还是 ElastiCache API 创建复制组,都可以采用此做法。
所有无服务器缓存均启用了传输中加密。对于自行设计的集群,在使用 CreateCacheCluster
(CLI:create-cache-cluster
)操作创建缓存群集时,您可以将参数 TransitEncryptionEnabled
设置为 true
(CLI:--transit-encryption-enabled
),从而在缓存群集上启用传输中加密。
主题
- 传输中加密概览
- 传输中加密的条件(Valkey 和 Redis OSS)
- 传输中加密的条件(Memcached)
- 传输中加密最佳实践
- 更多 Valkey 和 Redis OSS 选项
- 为 Memcached 启用传输中加密
- 启用传输中加密
- 使用 valkey-cli 连接到使用传输中加密的 ElastiCache(Valkey)或 Amazon ElastiCache(Redis OSS)
- 使用 Python 在自行设计的 Redis OSS 集群上启用传输中加密
- 启用传输中加密时的最佳实践
- 使用 Openssl 连接到启用了传输中加密的节点(Memcached)
- 使用 Java 创建 TLS Memcached 客户端
- 使用 PHP 创建 TLS Memcached 客户端
传输中加密概览
Amazon ElastiCache 传输中加密功能可让您在数据最脆弱时候(从一个位置传输到另一个位置时)提高数据的安全性。由于在端点加密和解密数据时需要进行一些处理,因此启用传输中加密会对性能产生一些影响。应对使用和不使用传输中加密的数据进行基准测试,以确定对使用案例的性能影响。
ElastiCache 传输中加密可实现以下功能:
-
加密客户端连接:客户端与缓存节点的连接采用 TLS 加密。
-
加密服务器连接:对集群中在节点之间移动的数据进行了加密。
-
服务器身份验证 – 客户端可通过身份验证确定它们连接到正确的服务器。
-
客户端身份验证 – 使用 Valkey 或 Redis OSS AUTH 功能,服务器可以对客户端进行身份验证。
传输中加密的条件(Valkey 和 Redis OSS)
在规划您的自行设计集群的实施时,应注意有关 Amazon ElastiCache 传输中加密的以下限制:
-
在运行以下 Redis 版本的复制组上支持传输中加密:Valkey 7.2 和更高版本,以及 Redis OSS 3.2.6、4.0.10 和更高版本。
-
运行 Valkey 7.2 和更高版本以及 Redis OSS 7 和更高版本的复制组支持修改现有集群的传输中加密设置。
-
只有在 Amazon VPC 中运行的复制组支持传输中加密。
-
运行以下节点类型的复制组不支持传输中加密:M1、M2。
有关更多信息,请参阅 受支持的节点类型。
-
通过显式将参数
TransitEncryptionEnabled
设置为true
可启用传输中加密。 -
确保您的缓存客户端支持 TLS 连接,并且您已在客户端配置中启用传输中加密。
-
在所有 AWS 区域的 ElastiCache 6 和更高版本中,旧的 TLS 1.0 和 TLS 1.1 已被弃用。ElastiCache 将继续支持 TLS 1.0 和 1.1,直至 2025 年 5 月 8 日。客户必须在该日期之前更新其客户端软件。
传输中加密的条件(Memcached)
在规划您的自行设计集群的实施时,应注意有关 Amazon ElastiCache 传输中加密的以下限制:
-
在运行 Memcached 1.6.12 及更高版本的集群上支持传输中加密。
-
传输中加密支持传输层安全性协议(TLS)版本 1.2 和 1.3。
-
只有在 Amazon VPC 中运行的集群才支持传输中加密。
-
运行以下节点类型的复制组不支持传输中加密:M1、M2、M3、R3、T2。
有关更多信息,请参阅 受支持的节点类型。
-
通过显式将参数
TransitEncryptionEnabled
设置为true
可启用传输中加密。 -
只有在创建集群时,才能在集群上启用传输中加密。无法通过修改集群来开启和关闭传输中加密。
-
确保您的缓存客户端支持 TLS 连接,并且您已在客户端配置中启用传输中加密。
传输中加密最佳实践
-
由于在端点加密和解密数据时需要进行一些处理,因此实现传输中加密会降低性能。使用自己的数据,对传输中加密进行基准测试,然后与不加密情况进行比较,以确定其对实现性能的影响。
-
由于创建新连接的成本可能非常高,您可以通过保留 TLS 连接来减小传输中加密对性能的影响。
更多 Valkey 和 Redis OSS 选项
有关 Valkey 和 Redis OSS 可用选项的更多信息,请参阅以下链接。
为 Memcached 启用传输中加密
要在使用 AWS 管理控制台创建 Memcached 集群时启用传输中加密,请进行以下选择:
-
选择 Memcached 作为引擎。
-
选择 1.6.12 或更高的引擎版本。
-
在 Encryption in transit(传输中加密)下,选择 Enable(启用)。
有关分步过程,请参阅 创建 Valkey 或 Redis OSS 集群。
使用 Openssl 连接到启用了传输中加密的节点(Memcached)
要从启用了传输中加密的 ElastiCache(Memcached)节点中访问数据,您需要使用利用安全套接字层(SSL)的客户端。您也可以在 Amazon Linux 和 Amazon Linux 2 上使用 Openssl s_client。
使用 Openssl s_client 连接到 Amazon Linux 2 或 Amazon Linux 上启用了传输中加密的 Memcached 集群:
/usr/bin/openssl s_client -connect
memcached-node-endpoint
:memcached-port
使用 Java 创建 TLS Memcached 客户端
要在 TLS 模式下创建客户端,请执行以下操作以利用适当的 SSLContext 初始化该客户端:
import java.security.KeyStore; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; import net.spy.memcached.AddrUtil; import net.spy.memcached.ConnectionFactoryBuilder; import net.spy.memcached.MemcachedClient; public class TLSDemo { public static void main(String[] args) throws Exception { ConnectionFactoryBuilder connectionFactoryBuilder = new ConnectionFactoryBuilder(); // Build SSLContext TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init((KeyStore) null); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, tmf.getTrustManagers(), null); // Create the client in TLS mode connectionFactoryBuilder.setSSLContext(sslContext); MemcachedClient client = new MemcachedClient(connectionFactoryBuilder.build(), AddrUtil.getAddresses("mycluster.fnjyzo.cfg.use1.cache.amazonaws.com:11211")); // Store a data item for an hour. client.set("theKey", 3600, "This is the data value"); } }
使用 PHP 创建 TLS Memcached 客户端
要在 TLS 模式下创建客户端,请执行以下操作以利用适当的 SSLContext 初始化该客户端:
<?php /** * Sample PHP code to show how to create a TLS Memcached client. In this example we * will use the Amazon ElastiCache Auto Descovery feature, but TLS can also be * used with a Static mode client. * See Using the ElastiCache Cluster Client for PHP (https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/AutoDiscovery.Using.ModifyApp.PHP.html) for more information * about Auto Discovery and persistent-id. */ /* Configuration endpoint to use to initialize memcached client. * this is only an example */ $server_endpoint = "mycluster.fnjyzo.cfg.use1.cache.amazonaws.com"; /* Port for connecting to the cluster. * This is only an example */ $server_port = 11211; /* Initialize a persistent Memcached client and configure it with the Dynamic client mode */ $tls_client = new Memcached('persistent-id'); $tls_client->setOption(Memcached::OPT_CLIENT_MODE, Memcached::DYNAMIC_CLIENT_MODE); /* Add the memcached's cluster server/s */ $tls_client->addServer($server_endpoint, $server_port); /* Configure the client to use TLS */ if(!$tls_client->setOption(Memcached::OPT_USE_TLS, 1)) { echo $tls_client->getLastErrorMessage(), "\n"; exit(1); } /* Set your TLS context configurations values. * See MemcachedTLSContextConfig in memcached-api.php for all configurations */ $tls_config = new MemcachedTLSContextConfig(); $tls_config->hostname = '*.mycluster.fnjyzo.use1.cache.amazonaws.com'; $tls_config->skip_cert_verify = false; $tls_config->skip_hostname_verify = false; /* Use the created TLS context configuration object to create OpenSSL's SSL_CTX and set it to your client. * Note: These TLS context configurations will be applied to all the servers connected to this client. */ $tls_client->createAndSetTLSContext((array)$tls_config); /* test the TLS connection with set-get scenario: */ /* store the data for 60 seconds in the cluster. * The client will decide which cache host will store this item. */ if($tls_client->set('key', 'value', 60)) { print "Successfully stored key\n"; } else { echo "Failed to set key: ", $tls_client->getLastErrorMessage(), "\n"; exit(1); } /* retrieve the key */ if ($tls_client->get('key') === 'value') { print "Successfully retrieved key\n"; } else { echo "Failed to get key: ", $tls_client->getLastErrorMessage(), "\n"; exit(1); }
有关使用 PHP 客户端的更多信息,请参阅 安装适用于 PHP 的 ElastiCache Cluster Client。