Redis / Valkey のセキュリティ強化 (ACL、TLS、危険なコマンド)
Redisレベル: 上級所要時間: 5 分 (監査) 〜 90 分 (完全な強化)インストールや日常運用のガイドではありません。稼働中の Redis または Valkey (単一サーバー、replica + Sentinel、または Cluster) をダウンタイムなしで強化するための、シナリオ別の runbook です。読み取り専用のセキュリティ監査、ACL ユーザーと default ユーザーの無効化、requirepass/masterauth、bind と protected-mode、CONFIG/DEBUG/MODULE の悪用に対する protected config、稼働中の TLS への移行 (クライアント、レプリケーション、Sentinel、cluster bus)、ファイル権限を扱い、最後に監査を再実行してリスクが解消されたことを確認します。DBAtlas のインストールガイドで構築したシステムには、パスワードと絞り込んだファイアウォールがすでに設定されています。監査から始め、RISK または WARN が出たシナリオだけを適用してください。バックアップと日常運用は別の Redis ガイドにあります。
構成: 単一サーバー、master + replica + Sentinel、または Redis Cluster
シナリオ
- セキュリティ状態の監査 (読み取り専用) — 何も変更しません。パスワードなしのアクセス、default ユーザー、待ち受けアドレス、protected-mode、危険なコマンド、TLS、Sentinel のパスワード、ファイル権限を OK / WARN / RISK として報告します。どこから始めればよいかわからない場合はこれを選択してください。
- 完全な強化 (すべてを順に実施) — 監査 → ACL ユーザー (管理者、アプリケーション、レプリケーション、Sentinel) と default ユーザーの無効化 → bind/protected-mode/ファイアウォール → 危険なコマンドと protected config → TLS → ファイル権限 → 最終監査。replica/Sentinel ではローリングで適用し、リスクのある手順では確認を求めます。
- ACL ユーザーと default ユーザーの無効化 (Redis 6+) — 全員が単一のパスワードで (またはパスワードなしで) default ユーザーとして接続しています。管理者、アプリケーション (自身の key のみ、危険なコマンドなし)、レプリケーション、Sentinel 用に別々のユーザーを作成して aclfile に書き込み、アプリケーションの移行が完了したら default を無効にします。
- パスワードなしの Redis: requirepass / masterauth (応急対応) — パスワードがまったく設定されておらず、ACL に移行する時間もない場合です。すべてのノードに共通のパスワード (requirepass + レプリケーション用の masterauth、Sentinel には auth-pass) を稼働中に設定します。以後、アプリケーションはパスワードなしでは接続できません。
- ネットワークアクセスを制限する (bind 0.0.0.0、protected-mode、ファイアウォール) — Redis がすべてのインターフェースで待ち受けているか、protected-mode no で動作しています。bind を localhost + 内部 IP に絞り、protected-mode を有効にし、ファイアウォールでノードとアプリケーションのネットワークだけを許可します。稼働中に適用でき、既存の接続は切断されません。リスクを最も早く下げられる手順です。
- 危険なコマンドと CONFIG の悪用 (FLUSHALL、CONFIG、DEBUG、MODULE) — CONFIG SET dir/dbfilename を悪用したサーバーへのファイル書き込み (SSH キー、cron) と、FLUSHALL/DEBUG/MODULE LOAD への対策です。enable-protected-configs、enable-debug-command、enable-module-command を無効のままにし、アプリケーションから @dangerous を取り除きます。旧バージョンでは rename-command を使用します。
- 接続を暗号化する: TLS (クライアント、レプリケーション、Sentinel、cluster bus) — 通信が暗号化されていません。既存ポートと並行して TLS ポートを稼働中に開き、レプリケーションと Sentinel を TLS に移行し、アプリケーションの切り替えが完了したら平文のポートを閉じます (port 0)。
- ファイル権限とサービス実行ユーザー — redis.conf (パスワードを含む)、ACL ファイル、RDB/AOF、ログファイルを他のユーザーが読み取れるか、Redis が root で動作しています。権限を 640/750 に絞り、所有者をサービスユーザーに変更します。
開始前の確認
- すべてのノードで root/sudo 権限。最初のノードから他のノードへの SSH (パスワードファイルと証明書のコピー用)。
- Redis 6.2+ または Valkey 7.2+ (ACL には 6.0+、protected config には 7.0+)。
- レプリケーション…と Sentinel… が正常である。異常のあるトポロジーではローリング操作を行いません。
- アプリケーションの一覧とクライアントライブラリのバージョン: ACL にはユーザー名 + パスワード (Redis 6+ クライアント)、TLS には rediss:// のサポート、Sentinel を使用するクライアントには Sentinel のパスワードと TLS のサポートが必要です。
- openssl がインストールされている (パスワードと証明書の生成用)。
ガイドのフェーズ
- 準備: セーフティネットと補助ツール — 設定と ACL のバックアップ · 補助ツールを作成する (dbatlas-rconf、dbatlas-rcli、dbatlas-redis-restart) · 管理者パスワードを一時ファイルに書き込む
- 状態の監査 (読み取り専用) — セキュリティレポート: … · Sentinel レポート: … · 検出結果をシナリオに対応付ける
- パスワード: requirepass と masterauth (稼働中) — 共通パスワードを設定する: … · masterauth: … · Sentinel auth-pass: … · requirepass: … · Sentinel のパスワード: … · レプリケーションと Sentinel は正常か …
- ACL: 診断とユーザーのパスワード — 診断: 誰がどのユーザーで接続しているか · 内部ユーザーのパスワードを生成する · パスワードファイルを他のノードにコピーする
- ACL: default ユーザーを無効にする — default で接続しているクライアントが残っていないか: … · default ユーザーを無効にする: … · 確認: 認証なしのアクセス、アプリケーションの権限、レプリケーション · Sentinel のパスワード: …
- ネットワークアクセス: ファイアウォール — ファイアウォールのルール
- 危険なコマンド: 診断 — protected config と debug/module コマンド: …
- 危険なコマンド: 検証 — CONFIG SET dir と DEBUG が拒否されるか: …
- TLS: 証明書 — TLS のサポート: … · 社内 CA とサーバー証明書を生成する · 証明書を配布する · 証明書の権限: …
- TLS · cluster bus とレプリケーション (メンテナンスウィンドウ、全ノード同時) — bus ポートを固定し、tls-cluster と tls-replication をファイルに書き込む: … · 停止: … · 起動: … · cluster とレプリケーションが TLS 上で動作しているか
- TLS: 検証と平文ポートのクローズ — レプリケーション…と Sentinel… が TLS 上で動作しているか · 平文のポートを閉じる: … · 暗号化なしの接続が拒否されるか: …
- ファイル権限とサービス実行ユーザー — 権限を修正する: …
- 最終監査 (強化後) — セキュリティレポート: … (最終状態) · Sentinel レポート: … (最終状態)
- クリーンアップとその後の作業 — 一時パスワードファイルを削除する · その後の作業: 監視と定期作業