ElastiCache 传输中加密(TLS)
为了帮助确保数据安全,Amazon ElastiCache 和 Amazon EC2 提供了禁止未经授权来访问服务器上数据的机制。通过传输中加密功能,ElastiCache 为您提供了在不同位置之间移动数据时用来保护数据的工具。
参数 TransitEncryptionEnabled
(CLI:--transit-encryption-enabled
)只可在进行 CreateCacheCluster
(CLI:create-cache-cluster
)操作时使用。
主题
传输中加密概览
Amazon ElastiCache 传输中加密是一项可选功能,它允许您在数据最脆弱时候(从一个位置传输到另一个位置时)提高数据的安全性。由于在端点加密和解密数据时需要进行一些处理,因此启用传输中加密会对性能产生一些影响。应对使用和不使用传输中加密的数据进行基准测试,以确定对使用案例的性能影响。
ElastiCache 传输中加密可实现以下功能:
加密连接 – 服务器和客户端连接均采用安全套接字层(SSL)加密。
服务器身份验证 – 客户端可通过身份验证确定它们连接到正确的服务器。
传输中加密的条件
在规划实现时,应记住有关 Amazon ElastiCache 传输中加密的以下限制:
-
在运行 Memcached 1.6.12 及更高版本的集群上支持传输中加密。
-
传输中加密支持 TLS 版本 1.2 和 1.3。
-
只有在 Amazon VPC 中运行的集群才支持传输中加密。
-
只有运行以下节点类型的集群才支持传输中加密。
-
R6g、R5、R4
-
M6g、M5、M4
-
T4g、T3
有关更多信息,请参阅受支持的节点类型。
-
-
通过显式将参数
TransitEncryptionEnabled
设置为true
可启用传输中加密。 -
只有在创建集群时,才能在集群上启用传输中加密。无法通过修改集群来开启和关闭传输中加密。
-
要连接到已启用传输中加密的集群,必须为该集群启用传输层安全性协议(TLS)。要连接到未启用传输中加密的集群,则该集群不得启用 TLS。
传输中加密最佳实践
由于在端点加密和解密数据时需要进行一些处理,因此实现传输中加密会降低性能。使用自己的数据,对传输中加密进行基准测试,然后与不加密情况进行比较,以确定其对实现性能的影响。
由于创建新连接的成本可能非常高,您可以通过保留 TLS 连接来减小传输中加密对性能的影响。
启用传输中加密
要在使用 Amazon 管理控制台创建 Memcached 集群时启用传输中加密,请进行以下选择:
选择 Memcached 作为引擎。
选择 1.6.12 或更高的引擎版本。
在 Encryption in transit(传输中加密)下,选择 Enable(启用)。
有关此分步过程,请参阅创建 Memcached 集群(控制台)。
使用 Openssl 连接到启用了传输中加密的节点
要从启用了传输中加密的 ElastiCache for 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
-crlf
输出示例:
set hello 0 0 5 world STORED get hello VALUE hello 0 5 world END
有关在未启用传输中加密的情况下连接到集群的信息,请参阅 连接到节点。
使用 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"); } }
有关使用 Java 客户端的更多信息,请参阅 使用适用于 Java 的 ElastiCache Cluster Client。
使用 PHP 创建 TLS Memcached 客户端
要在 TLS 模式下创建客户端,请执行以下操作以利用适当的 SSLContext 初始化该客户端:
有关 Auto Discovery 和持久性 ID 的更多信息,请参阅 使用适用于 PHP 的 ElastiCache Cluster Client。
<?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/mem-ug/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->cert_file = '/path/to/memc.crt'; $tls_config->key_file = '/path/to/memc.key'; $tls_config->ca_cert_file = '/path/to/ca.crt'; $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。