ElastiCache for Redis の転送時の暗号化 (TLS)
データを安全に保つために、Amazon ElastiCache および Amazon EC2 は、サーバーのデータへの不正アクセスに対する防御メカニズムを提供します。ElastiCache では転送時の暗号化機能を提供されるため、ある場所から別の場所に移動しているデータの保護ツールとして使用できます。たとえば、レプリケーショングループ内でプライマリノードからリードレプリカノードへ、またはレプリケーショングループとアプリケーションの間で、データを移動するとします。
転送時の暗号化はオプションであり、Redis レプリケーショングループの作成時にのみ、そのレプリケーショングループで有効にできます。転送時の暗号化は、レプリケーショングループの作成時にレプリケーショングループ上でパラメータ TransitEncryptionEnabled
を true
(CLI: --transit-encryption-enabled
) に設定することで有効にします。これは、AWS Management Console、AWS CLI、または ElastiCache API のいずれを使用してレプリケーショングループを作成しても、実行できます。転送時の暗号化を有効にする場合、CacheSubnetGroup
の値も指定する必要があります。
パラメーター TransitEncryptionEnabled
(CLI: --transit-encryption-enabled
) は、CreateReplicationGroup
(CLI: create-replication-group
) オペレーションを使用する場合にのみ使用できます。
トピック
転送時の暗号化の概要
Amazon ElastiCache 転送時の暗号化は、ある場所から別の場所に移動するときに、データの最も脆弱なポイントでのデータのセキュリティを強化できるオプション機能です。エンドポイントでデータの暗号化と復号を行うにはある程度の処理が必要であるため、転送時の暗号化を有効にするとパフォーマンスに影響を及ぼす可能性があります。転送時の暗号化の使用時と未使用時でデータのベンチマークを取得して、ユースケースにおけるパフォーマンス影響を判断する必要があります。
ElastiCache 転送時の暗号化では、次の機能が実装されます。
[暗号化接続] — サーバーとクライアントの両方の接続が、Secure Socket Layer (SSL) で暗号化されます。
[暗号化レプリケーション] — プライマリノードとレプリカ ノード間を移動するデータが暗号化されます。
[サーバー認証] — クライアントは、適切なサーバーに接続していることを認証できます。
[クライアント認証] — Redis AUTH 機能を使用して、サーバーはクライアントを認証できます。
転送時の暗号化の条件
実装を計画する際は、以下の Amazon ElastiCache 転送時の暗号化の制約事項に留意する必要があります。
-
転送時の暗号化は、Redis バージョン 3.2.6 および 4.0.10 以降を実行するレプリケーショングループでサポートされます。
-
転送時の暗号化は、Amazon VPC. で実行しているレプリケーショングループでのみサポートされます。
-
転送時の暗号化は、以下のノードタイプを実行しているレプリケーショングループでのみサポートされます。
-
R6g、R5、R4、R3
-
M6g、M5、M4、M3
-
T4g、T3、T2
詳細については、「サポートされているノードの種類」を参照してください。
-
-
転送時の暗号化は、パラメーター
TransitEncryptionEnabled
をtrue
に明示的に設定することで有効化されます。 -
転送時の暗号化は、レプリケーショングループの作成時にのみレプリケーショングループで有効にできます。レプリケーショングループを変更して転送時の暗号化のオンとオフを切り替えることはできません。既存のレプリケーショングループ上への転送時の暗号化の実装についての詳細は、「転送時の暗号化を有効にする」を参照してください。
-
転送時の暗号化が有効なレプリケーショングループに接続するためには、データベースは Transport Layer Security (TLS) が有効である必要があります。転送時の暗号化が有効化されていないレプリケーショングループに接続する場合、データベースは TLS を有効にすることはできません。
エンドポイントでデータの暗号化と復号を行うにはある程度の処理が必要であるため、転送時の暗号化の実装によりパフォーマンスが低下する可能性があります。自身のデータで転送時の暗号化使用時のベンチマークを暗号化なしの場合と比較して、実装におけるパフォーマンスの影響を判断してください。
新しい接続の作成には高い負荷がかかる場合があるため、SSL 接続を持続させることで転送時の暗号化のパフォーマンスへの影響を軽減させることができます。
転送時の暗号化を有効にする
AWS Management Console、AWS CLI、または ElastiCache API を使用して、ElastiCache for Redis レプリケーショングループの作成時に転送時の暗号化を有効にできます。
既存のクラスター上で転送時の暗号化を有効にする
転送時の暗号化は、Redis レプリケーショングループの作成時にのみ有効化できます。転送時の暗号化を有効化したい既存レプリケーショングループがある場合は、次の操作を行います。
既存の Redis レプリケーショングループ上で転送時の暗号化を有効にするには
-
レプリケーショングループの手動バックアップを作成します。詳細については、「手動バックアップの作成」を参照してください。
-
エンジンバージョンを 3.2.6、4.0.10 およびそれ以降に、パラメータ
TransitEncryptionEnabled
をtrue
(CLI:--transit-encryption-enabled
) に設定し、バックアップから復元して新しいレプリケーショングループを作成します。詳細については、「クラスターのサイズ変更 (オプション) によるバックアップからの復元」を参照してください。 -
アプリケーションのエンドポイントを、新しいレプリケーショングループのエンドポイントに更新します。詳細については、「接続エンドポイントの検索」を参照してください。
-
古いレプリケーショングループを削除します。詳細については、以下を参照してください:
AWS Management Console を使用して転送時の暗号化を有効にする
AWS Management Console を使用してレプリケーショングループの作成時に転送時の暗号化を有効にするには、以下のように選択します。
-
エンジンとして Redis を選択します。
-
エンジンバージョン 3.2.6 または 4.0.10 以降。
-
[転送時の暗号化] リストから [はい] を選択します。
詳しいステップについては、以下を参照ください。
AWS CLI を使用して転送時の暗号化を有効にする
AWS CLI を使用して Redis レプリケーショングループの作成時に転送時の暗号化を有効にするには、パラメーター transit-encryption-enabled
を使用します。
Redis (クラスターモードが無効) クラスター上で転送時の暗号化を有効にする (CLI)
AWS 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)
AWS 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
— 各シャードの構成を個別に指定します。
-
詳細については、以下を参照してください:
AWS API を使用して転送時の暗号化を有効にする
Redis レプリケーショングループの作成時に ElastiCache API を使用して転送時の暗号化を有効にするには、単一ノード Redis レプリケーショングループの場合は CreateReplicationGroup
を使用し、リードレプリカを持つレプリケーショングループの場合は CreateReplicationGroup
を使用して、TransitEncryptionEnabled
パラメータを true
に設定します。
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 まで増やすことができます。詳細については、「AWS サービス制限」を参照してください。ReplicasPerNodeGroup
— 各ノードグループ (シャード) のレプリカノードの数を指定します。ここで指定される値は、このレプリケーショングループのすべてのシャードに適用されます。このパラメータの最大値は 5 です。 -
NodeGroupConfiguration
— 各シャードの構成を個別に指定します。
-
詳細については、以下を参照してください:
redis-cli を使用して転送時の暗号化を有効にした Amazon ElastiCache for Redis ノードへの接続
送信中の暗号化を有効にした Redis ノードの ElastiCache のデータにアクセスするには、Secure Socket Layer (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 クラスターエンドポイントを 1 つ以上の接続パラメータに追加します。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
という 2 つの接続があります。パラメータは次のように設定されます。-
この stunnel インスタンスがクライアントであることを指定するために、client は yes に設定されています。
-
accept はクライアント IP に設定されています。この例では、プライマリはポート 6379 の Redis のデフォルト 127.0.0.1 に設定されています。レプリカは別のポートを呼び出し、6380 に設定する必要があります。エフェメラルポート 1024~65535 を使用できます。詳細については、Amazon VPC ユーザーガイドの「一時ポート」を参照してください。
-
connect は Redis サーバーエンドポイントに設定されています。詳細については、「接続エンドポイントの検索」を参照してください。
-
-
起動します。
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 パスワードが使用されなかった場合、この例では redis-cli を使用して、Amazon Linux で redis-cli の完全パスを使用して ElastiCache for Redis サーバーに接続します。
/home/ec2-user/redis-stable/src/redis-cli -h localhost -p 6379
Redis クラスターの作成中に AUTH パスワードが使用された場合、この例では redis-cli を使用して、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 パスワードが使用されなかった場合、この例では redis-cli を使用して、Amazon Linux で redis-cli の完全パスを使用して ElastiCache for Redis サーバーに接続します。
src/redis-cli -h localhost -p 6379
Redis クラスターの作成中に AUTH パスワードが使用された場合、この例では redis-cli を使用して、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 トンネルを停止して閉じるには、
pkill
stunnel プロセスを実行します。sudo pkill stunnel