ElastiCache の転送時の暗号化 (TLS) - Amazon ElastiCache

ElastiCache の転送時の暗号化 (TLS)

データを安全に保つために、Amazon ElastiCache および Amazon EC2 は、サーバーのデータへの不正アクセスに対する防御メカニズムを提供します。ElastiCache では転送時の暗号化機能を提供されるため、ある場所から別の場所に移動しているデータの保護ツールとして使用できます。

すべてのサーバーレスキャッシュで、転送時の暗号化が有効になっています。独自設計型クラスターでは、キャッシュクラスター上での転送時の暗号化は、CreateCacheCluster (CLI: create-cache-cluster) を用いたキャッシュクラスターの作成時にパラメータ TransitEncryptionEnabledtrue (CLI: --transit-encryption-enabled) に設定することで有効にできます。

転送時の暗号化の概要

Amazon ElastiCache 転送時の暗号化は、ある場所から別の場所に転送するときに、データの最も脆弱なポイントでのデータのセキュリティを強化できる機能です。エンドポイントでデータの暗号化と復号を行うにはある程度の処理が必要であるため、転送時の暗号化を有効にするとパフォーマンスに影響を及ぼす可能性があります。転送時の暗号化の使用時と未使用時でデータのベンチマークを取得して、ユースケースにおけるパフォーマンス影響を判断する必要があります。

ElastiCache 転送時の暗号化では、次の機能が実装されます。

  • 暗号化されたクライアント接続 — キャッシュノードへのクライアント接続は TLS で暗号化されます。

  • 暗号化されたサーバー接続 — クラスター内のノード間を移動するデータは暗号化されます。

  • [サーバー認証] — クライアントは、適切なサーバーに接続していることを認証できます。

転送時の暗号化の条件

独自設計型クラスターの実装を計画する際は、以下の Amazon ElastiCache 転送時の暗号化の制約事項に留意する必要があります。

  • 転送時の暗号化は、Memcached バージョン 1.6.12 以降を実行するクラスターでサポートされます。

  • 転送時の暗号化は、Transport Layer Security (TLS) バージョン 1.2 および 1.3 をサポートします。

  • 転送時の暗号化は、Amazon VPC で実行しているクラスターでのみサポートされます。

  • 転送時の暗号化は、以下のノードタイプを実行しているクラスターでのみサポートされます。

    • R6g、R5、R4

    • M6g、M5、M4

    • T4g、T3

    詳細については、「サポートされているノードの種類」を参照してください。

  • 転送時の暗号化は、パラメータ TransitEncryptionEnabledtrue に明示的に設定することで有効化されます。

  • 転送時の暗号化は、クラスターの作成時にのみクラスターで有効にできます。クラスターを変更して転送時の暗号化のオンとオフを切り替えることはできません。

  • キャッシュクライアントが TLS 接続をサポートしていることと、クライアント設定で TLS 接続を有効にしていることを確認します。

転送時の暗号化のベストプラクティス

  • エンドポイントでデータの暗号化と復号を行うにはある程度の処理が必要であるため、転送時の暗号化の実装によりパフォーマンスが低下する可能性があります。自身のデータで転送時の暗号化使用時のベンチマークを暗号化なしの場合と比較して、実装におけるパフォーマンスの影響を判断してください。

  • 新しい接続の作成には高い負荷がかかる場合があるため、TLS 接続を持続させることで転送時の暗号化のパフォーマンスへの影響を軽減させることができます。

転送時の暗号化を有効にする

AWS マネジメントコンソールを使用して Memcached クラスターの作成時に転送時の暗号化を有効にするには、以下のように選択します。

  • エンジンとして Memcached を選択します。

  • エンジンバージョン 1.6.12 以降。

  • [Encryption in transit] (転送時の暗号化) で、[Enable] (有効化) を選択します。

詳しいプロセスについては、「Memcached クラスターの作成 (コンソール)」を参照してください。

Openssl を使用して送信中の暗号化を有効にしたノードへの接続

送信中の暗号化を有効にした Memcached ノードの ElastiCache のデータにアクセスするには、Secure Socket Layer (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/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->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 クライアントの使用に関する詳細は、「ElastiCache Cluster Client for PHP のインストール」を参照してください。