Redis: Redis Security
Redisのデフォルト設定は安全ではありません。このレッスンでは、Redisインスタンスを保護する方法について解説します。
1. Redisのセキュリティリスク
デフォルト設定のリスク:
- パスワード認証なし:誰でも接続できます
- すべてのネットワークインターフェースにバインド:外部からアクセス可能です
- 危険なコマンドが無効化されていない:FLUSHALL、CONFIGなど
- 平文での送信:データは暗号化されていません
⚠️ 注意: Redisをパブリックインターネットに公開することは非常に危険です!大規模なRedis攻撃が発生したことがあります。
2. パスワード認証
(1) パスワードの設定(Redis 6.0より前)
CONF
# redis.conf
requirepass your_strong_password_here
接続時の認証:
REDIS
# 方法1:接続時にパスワードを指定
redis-cli -a your_strong_password_here
# 方法2:接続後に認証
redis-cli
AUTH your_strong_password_here
OK
⚠️ 補足: コマンドラインで
-a パラメータを使用すると、パスワードがコマンド履歴に露出するため、推奨されません。
(2) 設定ファイルでのパスワード設定
CONF
# redis.conf
requirepass "P@ssw0rd!2026#Redis"
(3) 動的なパスワード設定
REDIS
CONFIG SET requirepass "new_password"
OK
# 再認証が必要
AUTH new_password
OK
3. ACLアクセス制御(Redis 6.0+)
Redis 6.0では、より細かい権限制御のためのACL(Access Control List)が導入されました。
(1) ユーザーリストの表示
REDIS
ACL LIST
1) "user default on nopass ~* &* +@all"
(2) ユーザーの作成
REDIS
# パスワード付きユーザーを作成
ACL SETUSER alice on >password123 ~* +@all
OK
# 読み取り専用ユーザーを作成
ACL SETUSER bob on >password456 ~* +@read +@connection
OK
# 特定のキーのみアクセスできるユーザーを作成
ACL SETUSER app on >apppass ~app:* +@all
OK
(3) ACLコマンド構文
BASH
ACL SETUSER username
on|off # 有効または無効
>password # パスワードを設定
~pattern # 許可するキー(~*はすべてのキー)
&pattern # 許可するPub/Subチャンネル
+@category # コマンドカテゴリを許可
-@category # コマンドカテゴリを拒否
+command # 特定のコマンドを許可
-command # 特定のコマンドを拒否
(4) コマンドカテゴリ
| カテゴリ | 説明 | 含まれるもの |
|---|---|---|
| @all | すべてのコマンド | すべて |
| @read | 読み取りコマンド | GET、HGET、LRANGEなど |
| @write | 書き込みコマンド | SET、HSET、LPUSHなど |
| @admin | 管理コマンド | CONFIG、DEBUGなど |
| @dangerous | 危険なコマンド | FLUSHALL、SHUTDOWNなど |
| @connection | 接続コマンド | AUTH、PING、QUITなど |
| @string | 文字列コマンド | SET、GET、INCRなど |
| @hash | ハッシュコマンド | HSET、HGETなど |
| @list | リストコマンド | LPUSH、LPOPなど |
| @set | セットコマンド | SADD、SREMなど |
| @sortedset | ソート済みセットコマンド | ZADD、ZREMなど |
(5) 異なる権限を持つユーザーの作成
REDIS
# 管理者:すべての権限
ACL SETUSER admin on >admin123 ~* +@all
# 読み取り専用ユーザー
ACL SETUSER readonly on >read123 ~* +@read +@connection
# アプリケーションユーザー:app:*キーのみアクセス可能
ACL SETUSER app on >app123 ~app:* +@all
# 統計ユーザー:stats:*キーの読み取り専用
ACL SETUSER stats on >stats123 ~stats:* +@read +@connection
# セーフユーザー:管理コマンドと危険なコマンド以外すべて
ACL SETUSER safe on >safe123 ~* +@all -@admin -@dangerous
(6) ユーザー権限の表示
REDIS
# すべてのユーザーを表示
ACL LIST
# 特定のユーザーを表示
ACL GETUSER alice
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "hash_password"
5) "keys"
6) "~*"
7) "commands"
8) "+@all"
(7) ユーザーの削除
REDIS
ACL DELUSER alice
(integer) 1
(8) ACL設定の保存
REDIS
# ACL設定をファイルに保存
ACL SAVE
OK
redis.conf でACLファイルを指定:
BASH
aclfile /etc/redis/users.acl
4. コマンドの名前変更
危険なコマンドを名前変更または無効化します。
(1) コマンドの無効化
BASH
# redis.conf
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
rename-command SHUTDOWN ""
rename-command KEYS ""
(2) コマンドの名前変更
BASH
# 危険なコマンドを複雑な名前に変更
rename-command FLUSHALL "FLUSHALL_abc123xyz"
rename-command CONFIG "CONFIG_secret789"
名前変更されたコマンドの使用:
BASH
# 元のコマンドはもう動作しない
FLUSHALL
(error) ERR unknown command 'FLUSHALL'
# 新しいコマンドを使用
FLUSHALL_abc123xyz
OK
💡 使用例: 危険なコマンドを無効化または名前変更して、誤操作や悪意のある攻撃を防ぎます。
5. ネットワークセキュリティ
(1) IPアドレスのバインド
BASH
# redis.conf
# ローカルアクセスのみ
bind 127.0.0.1
# 特定のIPを許可
bind 127.0.0.1 192.168.1.100
# すべてのIPを許可(危険!)
bind 0.0.0.0
⚠️ 注意:
bind 0.0.0.0 はすべてのIPを許可します。パスワードを必ず設定してください!
(2) プロテクションモード
BASH
# redis.conf
# プロテクションモードを有効化(デフォルト)
protected-mode yes
プロテクションモードの動作:
- ローカル接続(127.0.0.1)のみ受け付けます
- またはバインドアドレスが設定されている場合
- またはパスワードが設定されている場合
(3) ポートの変更
BASH
# デフォルト以外のポートを使用
port 6380
💡 使用例: デフォルト以外のポートを使用すると、自動スキャン攻撃を軽減できます。
(4) ファイアウォール設定
BASH
# Linux iptables
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
# CentOS firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="6379" accept'
firewall-cmd --reload
6. TLS/SSL暗号化(Redis 6.0+)
Redis 6.0はTLS暗号化接続をサポートしています。
(1) TLSの設定
BASH
# redis.conf
tls-port 6379
port 0 # TLS以外のポートを無効化
tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
tls-ca-cert-file /path/to/ca.crt
tls-auth-clients optional
tls-protocols "TLSv1.2 TLSv1.3"
(2) TLSでの接続
BASH
redis-cli --tls --cert /path/to/client.crt --key /path/to/client.key --cacert /path/to/ca.crt
7. セキュリティのベストプラクティス
(1) 強力なパスワードを設定
BASH
# 強力なパスワードを使用(16文字以上、大文字小文字、数字、特殊文字の組み合わせ)
requirepass "Xk9#mP2$vL5@nQ8&wR4!"
(2) ACLで権限制御
BASH
# 異なるアプリケーション用に異なるユーザーを作成
ACL SETUSER webapp on >webpass ~web:* +@all
ACL SETUSER batch on >batchpass ~batch:* +@all
ACL SETUSER readonly on >readpass ~* +@read +@connection
(3) 危険なコマンドを無効化
BASH
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
(4) ネットワークアクセスを制限
BASH
bind 127.0.0.1
protected-mode yes
(5) ファイアウォールを使用
BASH
# 特定のIPのみRedisポートにアクセスを許可
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
(6) 定期的な監査
BASH
# 現在のクライアント接続を表示
CLIENT LIST
# ユーザー権限を表示
ACL LIST
# 実行されたコマンドを表示(注意して使用)
MONITOR
8. セキュリティチェックリスト
BASH
□ 強力なパスワードを設定(requirepassまたはACL)
□ 内部IPにバインド(bind 127.0.0.1または内部IP)
□ プロテクションモードを有効化(protected-mode yes)
□ 危険なコマンドを無効化(FLUSHALL、CONFIGなど)
□ ファイアウォールでアクセスを制限
□ デフォルト以外のポートを使用
□ Redisのバージョンを定期的に更新
□ 不審な接続やコマンドを監視
□ ACLできめ細かい権限を使用(Redis 6.0+)
□ TLS暗号化を検討(Redis 6.0+)
▶ サンプル
セキュリティ設定の例:
BASH
# パスワードの設定
127.0.0.1:6379> CONFIG SET requirepass "mystrongpassword"
OK
# 認証
127.0.0.1:6379> AUTH mystrongpassword
OK
# ACLリストの表示 (Redis 6.0+)
127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* &* +@all"
❓ よくある質問
Q Redis 6.0より前はアクセス制御はどのように行われていましたか?
A requirepassのみ利用可能でした。すべてのクライアントが同じパスワードを共有し、同じ権限を持っていました。
Q KEYSコマンドを無効化するにはどうすればよいですか?
A
rename-command KEYS "" で無効化するか、複雑な名前に変更します。Q bind 0.0.0.0 は安全ですか?
A いいえ!強力なパスワードとファイアウォールも設定する必要があります。内部IPのみにバインドすることを推奨します。
Q Redisが攻撃されないようにするにはどうすればよいですか?
A 強力なパスワードを設定し、内部IPにバインドし、危険なコマンドを無効化し、ファイアウォールを使用し、定期的に更新します。
Q ACL設定を永続化するにはどうすればよいですか?
A ACL SAVEでファイルに書き込むか、redis.confでaclfileを指定します。
📖 まとめ
- Redisのデフォルト設定は安全ではありません。セキュリティ強化が必要です
- 強力なパスワード認証を設定(requirepassまたはACL)
- ACLできめ細かい権限制御を提供(Redis 6.0+)
- 危険なコマンドを名前変更または無効化
- 内部IPにバインドし、プロテクションモードを有効化
- ファイアウォールでアクセスを制限
- TLS暗号化を検討(Redis 6.0+)
- 定期的な監査と監視
📝 練習問題
- パスワード認証: Redisのパスワードを設定し、認証付き接続をテストしましょう
- ACL設定: 異なる権限を持つユーザー(管理者、読み取り専用、アプリケーションユーザー)を作成しましょう
- コマンド無効化: FLUSHALLとCONFIGコマンドを無効化し、動作しなくなったことを確認しましょう
- セキュリティチェック: Redis設定のセキュリティチェックリストを確認しましょう
9. 次のレッスン
次のレッスンでは、Redis Performance Testingについて学びます。redis-benchmarkツールを解説します。