【アップデート】ElastiCache for Memcachedがデータ転送時のTLS暗号化をサポート開始しました
コンサル部のとばち(@toda_kk)です。
2022年5月のアップデートで、Amazon ElastiCache for Memcachedがデータ転送時のTLS暗号化をサポート開始しました。
ElastiCacheによってMemcachedクラスターを作成する際に、データ転送時の暗号化を有効にすることでTLSによる通信ができます。
以前から、ElastiCache for Redisではデータ転送時の暗号化がサポートされていたのですが、Memcachedでも同じようにサポートされたということになります。
なお、Redisではサポートされているデータ保存時の暗号化ですが、2022年5月現在はMemcachedでは引き続きサポートされていないので、ご注意ください。
制約・注意点
公式ドキュメントによると、下記の注意点があるようです。
※2022年5月時点での情報になります。
- サポートされているTLSバージョンは 1.2 および 1.3 となる。
- データ転送時の暗号化を有効にするには、Memcachedエンジンバージョンが 1.6.12 以上であること。
- データ転送時の暗号化を有効にするには、VPC上で起動しているMemcachedクラスターであること。
- サポートされているノードタイプは下記のみ。
- R6g, R5, R4
- M6g, M5, M4
- T4g, T3
- データ転送時の暗号化を有効にするには、
TransitEncryptionEnabled
パラメーターをtrue
に設定する。 - データ転送時の暗号化を有効にできるのは、クラスターを作成するときのみ。作成済みのクラスターの設定を変更して有効化することはできない。
- データ転送時の暗号化を有効にしたクラスターに接続するには、TLSによる通信のみ可能。
実際にデータ転送時の暗号化を有効にしたMemcachedクラスターを作成してみた
それでは、実際にAWSマネジメントコンソールから、データ転送時の暗号化を有効にしたElastiCache for Memcachedクラスターを作成してみます。
上述の通り、Memcachedのエンジンバージョンは 1.6.12 以上である必要があります。
また、対応しているノードタイプにご注意ください。ここでは T4g を指定してみました。
「詳細設定」の「セキュリティ」の項目に「転送中の暗号化」が追加されています。「有効化」にチェックを入れて、クラスターを作成します。上述の通り、クラスター作成後は設定を変更できないためご注意ください。
しばらく待つと、クラスターが作成されます。
[03]
「転送中の暗号化」が「有効」になっていることが確認できます。
Opensslによる接続確認
実際にTLS通信ができるのか、接続確認してみます。
Memcachedを操作するためのクライアントツールとして、公式では memcached-tool というツールが用意されていますが、これは簡易的なスクリプトでありTLS通信に対応しているのか確認できませんでした。
そこで、上述のAWS公式ドキュメントにも記載があるのですが、Opensslを利用して接続確認してみます。
Memcachedクラスターに設定したサブネットやセキュリティグループに対して通信できる環境から、下記のコマンドを実行します。
$ openssl s_client -quiet -connect <Memcachedクラスターのエンドポイント>:<Memcachedクラスターのポート> depth=2 C = US, O = Amazon, CN = Amazon Root CA 1 verify return:1 depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon verify return:1 depth=0 CN = *.test-memcached-encrypted.20hybn.apne1.cache.amazonaws.com verify return:1
無事に接続できたようです。stats
コマンドを実行してみます。
stats STAT pid 1 STAT uptime 993 STAT time 1653904589 STAT version 1.6.12 STAT libevent 2.1.11-stable STAT pointer_size 64 STAT rusage_user 0.073853 STAT rusage_system 0.091233 STAT max_connections 65000 STAT curr_connections 7 STAT total_connections 12 STAT rejected_connections 0 STAT connection_structures 8 STAT response_obj_oom 0 STAT response_obj_count 1 STAT response_obj_bytes 32768 STAT read_buf_count 4 STAT read_buf_bytes 65536 STAT read_buf_bytes_free 16384 STAT read_buf_oom 0 STAT reserved_fds 10 STAT cmd_get 0 STAT cmd_set 0 STAT cmd_flush 0 STAT cmd_touch 0 STAT cmd_config_get 65 STAT cmd_config_set 1 STAT cmd_meta 0 STAT get_hits 0 STAT get_misses 0 STAT get_expired 0 STAT get_flushed 0 STAT delete_misses 0 STAT delete_hits 0 STAT incr_misses 0 STAT incr_hits 0 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 4183 STAT bytes_written 83840 STAT limit_maxbytes 432013312 STAT launch_time_maxbytes 432013312 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT time_in_listen_disabled_us 0 STAT threads 2 STAT conn_yields 0 STAT hash_power_level 16 STAT hash_bytes 524288 STAT hash_is_expanding 0 STAT curr_config 1 STAT slab_reassign_rescues 0 STAT slab_reassign_chunk_rescues 0 STAT slab_reassign_evictions_nomem 0 STAT slab_reassign_inline_reclaim 0 STAT slab_reassign_busy_items 0 STAT slab_reassign_busy_deletes 0 STAT slab_reassign_running 0 STAT slabs_moved 0 STAT lru_crawler_running 0 STAT lru_crawler_starts 6 STAT lru_maintainer_juggles 1042 STAT malloc_fails 0 STAT log_worker_dropped 0 STAT log_worker_written 0 STAT log_watcher_skipped 0 STAT log_watcher_sent 0 STAT log_watchers 0 STAT ssl_handshake_errors 0 STAT time_since_server_cert_refresh 1053 STAT unexpected_napi_ids 0 STAT round_robin_fallback 0 STAT bytes 0 STAT curr_items 0 STAT total_items 0 STAT slab_global_page_pool 0 STAT expired_unfetched 0 STAT evicted_unfetched 0 STAT evicted_active 0 STAT evictions 0 STAT reclaimed 0 STAT crawler_reclaimed 0 STAT crawler_items_checked 0 STAT lrutail_reflocked 0 STAT moves_to_cold 0 STAT moves_to_warm 0 STAT moves_within_lru 0 STAT direct_reclaims 0 STAT lru_bumps_dropped 0 END
正常にコマンドが実行できました。TLS通信によってMemcachedクラスターに接続できることが確認できました。
「データ保存時の暗号化」のサポートに期待
ElastiCacheの実行エンジンとしてRedisとMemcachedどちらを利用するべきか、悩まれるケースは未だ多いのではないかと思います。
選定の基準やポイントはケースバイケースだとは思いますが、一方で、Memcachedはこれまでデータの暗号化をサポートしていなかったため、セキュリティ要件でRedisを選ばざるを得なかったというケースもあるのではないでしょうか。
今回、Memcachedでもデータ転送時の暗号化がサポートされたことで、Memcached選定の幅が広がったのではないかと思います。同様に、「データ保存時の暗号化」もサポートすることで、Memcachedをより選択しやすくなるかと思います。さらなるアップデートに期待したいです。
以上、コンサル部のとばち(@toda_kk)でした。