AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

AWS ElastiCache(Redis) で認証を入れる際の罠

自前で用意する Redis

redis.conf へ以下のように requirepass を設定します。 この場合は、 foobared というパスワードが設定されており、TLS などの暗号化通信は必要ない状態です。

# snip #

requirepass foobared

# snip #

blog.shimar.me

ちなみに、公式のドキュメントからいつの間にか解説がなくなって、全部コンフィグ読めとなっていた。

最近、一行 (80 文字くらい) を超えるコードコメントは、個人的には非常に良くないと思うようになってしまった。

https://raw.githubusercontent.com/redis/redis/6.0/redis.conf

ちなみに

似たようなコンフィグの masterauth ですが、こちらはレプリケーションする際に問い合わせで利用する値です。 なので、レプリケーションしていなければ設定しなくてよかったはずです。

AWS ElastiCache

暗号化接続が必要になります。

f:id:donbulinux:20210818140607p:plain
作成画面のデフォルト設定

見事に何も設定できませんね。

こうする

f:id:donbulinux:20210818140739p:plain
いわゆる requirepass の設定ができる状態

作業手順としては以下になります。

  1. セキュリティの送信中の暗号化にチェックを入れる
  2. アクセスコントロールアクセスコントロールオプションを変更する
    • アクセスコントロールなし Redis AUTH デフォルトユーザー
  3. Redis 認証トークンに任意の値を入力する
    • この Redis 認証トークンが requirepass に相当します
    • スクリーンショットにもあるけど、 16文字以上で記号含む必要あるので結構面倒です

これでオッケーデース。

ローカル開発やCI/CDで、証明書が面倒of面倒で Docker なりパッケージ管理ツールで Redis は入れるけど……って場合がほとんどだと思います。

いざ本番に持ち込もうとすると「あれ?!」ってなる、というかマネージドサービスは最近そうなりがちなので、考慮できるようになるといいですね。

最近は上がってきた成果物が動かなくて、この手の調査ばっかりしているヨ。

暗号化時の redis-cli など動作確認について

どうすんの? という感じですよね。 --tls をつけることで、暗号化通信ができます。 Establish a secure TLS connection. と書いてあるので、接続できる最適な形式を選択してくれと思うんじゃが……。

あとは通常の問い合わせと同じく --askpass つけたり、接続できたら PINGPONG してやりゃいいと思います。

こうする

実際に動かすとこんな感じですね。

redis-cli -h ${HOSTNAME} -p 6379 --askpass --tls
password: ***********

${HOST}:6379 > PING
PONG 

Rails

Rails で redis(sidekiq) 使っている場合は、 console からなんらかのジョブ数問い合わせて数字が返ってくることを確認できればよさそうです (エラーにならなければ通信できているので)。

Sidekiq::Stats.processed
#=> 0

このあたりが参考に。

qiita.com

ちなみに

gem sidekiq 使っている場合、上記のように送信中の暗号化にチェックを入れていると redis-cli --tls したように、当然暗号化に対応した接続が必要です。 以下のように問い合わせ時のプロトコルrediss:// にすればアクセスできます、「レディスエス」って感じの発音でいいのかな、もしくは「レディスッス?」

実運用する時は development とそれ以外でプロトコルを切り替えるか、 ENV なりで FQDN 全体を管理させる、とするのが一番スマートなのかな。

- redis://${HOST}:6379/
+ rediss://${HOST}:6379/