目次
はじめに
こんにちは、omkです。
ElastiCacheのRedis AUTHを使用した接続で暗号化通信を検証してみました。
これはRedis6未満で「AUTH {パスワード}」で認証されていたものが、Redis6でACLの登場からデフォルトユーザーに対してパスワード認証するようになったものようです。
ユーザーグループのアクセスコントロールとの違いはデフォルトユーザーを利用するか自分でユーザーを作成するかです。
ユーザーグループを利用してElastiCacheクラスターに接続する方法はこちらに投稿しておりますので是非見てみてください。
ユーザーグループのアクセスコントロールではデフォルトユーザーはnopassですが、本オプションではデフォルトユーザーにパスワードを設定して利用します。
やってみた
前提
PHP:8.0
phpredis:5.3.5
Redis:6.x
PHPが動作するEC2インスタンスを用意します。php-redisを入れておきます。
ElastiCache for Redisクラスター作成
コンパネからElastiCacheクラスターを作成していきます。
送信中の暗号化にチェックを入れ、アクセスコントロールをRedis AUTHデフォルトユーザーを選択し、Redis 認証トークンを作成します。
認証トークンは以下のページに記載ある制約に則って作成される必要があります(自分で自由に文字列を作ります。どこかから湧くタイプじゃないです)。
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/auth.html
redis-cliから接続
まずはトークンなしで接続します。
$ redis-cli -h {エンドポイント} --tls -p 6379
> keys *
(error) NOAUTH Authentication required.
接続はできますが認証が必要となります。
> AUTH {パスワード}
OK
> keys *
(empty array)
認証すると使えるようになりました。
historyに残るかたちでパスワードを指定するのは推奨されませんが接続時に認証することも可能です。
$ redis-cli -h {エンドポイント} --tls -p 6379 -a {パスワード}
--tls オプションなしでは繋がりません。
phpredisから接続
ではphpredisで接続してみます。
こちらで作成したものを焼き直し再利用しました。
<?php
# 接続情報取得
$redisend = getenv('redis_end');
$redishost = 'tls://' . $redisend;
$redispass = getenv('redis_pass');
# 接続
$redis = new Redis();
$redis->connect($redishost,6379,5,NULL, 0, 0, ['auth' => $redispass]);
$value = $redis->get('test-key');
print($value);
?>
クラスターのエンドポイントと認証トークンは環境変数から渡します。
デフォルトユーザーを利用するので、ユーザーの指定はなくパスワードを渡すことでデフォルトに認証できます。
また、接続先にtlsをスキームに指定することでTLSで通信しています。
では実行してみます。
$ php redis.php
test-value
パスワードを間違えてみます。
PHP Fatal error: Uncaught RedisException: Redis server went away in /home/ec2-user/redis.php:13
Stack trace:
#0 /home/ec2-user/redis.php(13): Redis->get('test-key')
#1 {main}
thrown in /home/ec2-user/redis.php on line 13
エラーが出ました。
これでパスワードで正常に認証できていることが確認できました。
おわりに
TLSで接続できました。
然るべきときには暗号化していきたいですね。
アーキテクト課のomkです。
AWSについて雑多に取り組んだ内容を発信しています!!