【アップデート】ElastiCache for Memcachedがデータ転送時のTLS暗号化をサポート開始しました

2022.05.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンサル部のとばち(@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による接続確認

$ 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コマンドの実行

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)でした。