Redis Security
Redisのデフォルト設定は安全ではありません。このレッスンでは、Redisインスタンスを保護する方法について解説します。
Redisのセキュリティリスク
デフォルト設定のリスク:
- パスワード認証なし:誰でも接続できます
- すべてのネットワークインターフェースにバインド:外部からアクセス可能です
- 危険なコマンドが無効化されていない:FLUSHALL、CONFIGなど
- 平文での送信:データは暗号化されていません
⚠️ 注意: Redisをパブリックインターネットに公開することは非常に危険です!大規模なRedis攻撃が発生したことがあります。
パスワード認証
パスワードの設定(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 パラメータを使用すると、パスワードがコマンド履歴に露出するため、推奨されません。
設定ファイルでのパスワード設定
CONF
# redis.conf
requirepass "P@ssw0rd!2026#Redis"
動的なパスワード設定
REDIS
CONFIG SET requirepass "new_password"
OK
# 再認証が必要
AUTH new_password
OK
ACLアクセス制御(Redis 6.0+)
Redis 6.0では、より細かい権限制御のためのACL(Access Control List)が導入されました。
ユーザーリストの表示
REDIS
ACL LIST
1) "user default on nopass ~* &* +@all"
ユーザーの作成
REDIS
# パスワード付きユーザーを作成
ACL SETUSER alice on >password123 ~* +@all
OK
# 読み取り専用ユーザーを作成
ACL SETUSER bob on >password456 ~* +@read +@connection
OK
# 特定のキーのみアクセスできるユーザーを作成
ACL SETUSER app on >apppass ~app:* +@all
OK
ACLコマンド構文
ACL SETUSER username
on|off # 有効または無効
>password # パスワードを設定
~pattern # 許可するキー(~*はすべてのキー)
&pattern # 許可するPub/Subチャンネル
+@category # コマンドカテゴリを許可
-@category # コマンドカテゴリを拒否
+command # 特定のコマンドを許可
-command # 特定のコマンドを拒否
コマンドカテゴリ
| カテゴリ | 説明 | 含まれるもの |
|---|---|---|
| @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など |
異なる権限を持つユーザーの作成
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
ユーザー権限の表示
REDIS
# すべてのユーザーを表示
ACL LIST
# 特定のユーザーを表示
ACL GETUSER alice
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "hash_password"
5) "keys"
6) "~*"
7) "commands"
8) "+@all"
ユーザーの削除
REDIS
ACL DELUSER alice
(integer) 1
ACL設定の保存
REDIS
# ACL設定をファイルに保存
ACL SAVE
OK
redis.conf でACLファイルを指定:
CONF
aclfile /etc/redis/users.acl
コマンドの名前変更
危険なコマンドを名前変更または無効化します。
コマンドの無効化
CONF
# redis.conf
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
rename-command SHUTDOWN ""
rename-command KEYS ""
コマンドの名前変更
CONF
# 危険なコマンドを複雑な名前に変更
rename-command FLUSHALL "FLUSHALL_abc123xyz"
rename-command CONFIG "CONFIG_secret789"
名前変更されたコマンドの使用:
REDIS
# 元のコマンドはもう動作しない
FLUSHALL
(error) ERR unknown command 'FLUSHALL'
# 新しいコマンドを使用
FLUSHALL_abc123xyz
OK
💡 使用例: 危険なコマンドを無効化または名前変更して、誤操作や悪意のある攻撃を防ぎます。
ネットワークセキュリティ
IPアドレスのバインド
CONF
# 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を許可します。パスワードを必ず設定してください!
プロテクションモード
CONF
# redis.conf
# プロテクションモードを有効化(デフォルト)
protected-mode yes
プロテクションモードの動作:
- ローカル接続(127.0.0.1)のみ受け付けます
- またはバインドアドレスが設定されている場合
- またはパスワードが設定されている場合
ポートの変更
CONF
# デフォルト以外のポートを使用
port 6380
💡 使用例: デフォルト以外のポートを使用すると、自動スキャン攻撃を軽減できます。
ファイアウォール設定
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
TLS/SSL暗号化(Redis 6.0+)
Redis 6.0はTLS暗号化接続をサポートしています。
TLSの設定
CONF
# 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"
TLSでの接続
BASH
redis-cli --tls --cert /path/to/client.crt --key /path/to/client.key --cacert /path/to/ca.crt
セキュリティのベストプラクティス
1. 強力なパスワードを設定
CONF
# 強力なパスワードを使用(16文字以上、大文字小文字、数字、特殊文字の組み合わせ)
requirepass "Xk9#mP2$vL5@nQ8&wR4!"
2. ACLで権限制御
REDIS
# 異なるアプリケーション用に異なるユーザーを作成
ACL SETUSER webapp on >webpass ~web:* +@all
ACL SETUSER batch on >batchpass ~batch:* +@all
ACL SETUSER readonly on >readpass ~* +@read +@connection
3. 危険なコマンドを無効化
CONF
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
4. ネットワークアクセスを制限
CONF
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. 定期的な監査
REDIS
# 現在のクライアント接続を表示
CLIENT LIST
# ユーザー権限を表示
ACL LIST
# 実行されたコマンドを表示(注意して使用)
MONITOR
セキュリティチェックリスト
□ 強力なパスワードを設定(requirepassまたはACL)
□ 内部IPにバインド(bind 127.0.0.1または内部IP)
□ プロテクションモードを有効化(protected-mode yes)
□ 危険なコマンドを無効化(FLUSHALL、CONFIGなど)
□ ファイアウォールでアクセスを制限
□ デフォルト以外のポートを使用
□ Redisのバージョンを定期的に更新
□ 不審な接続やコマンドを監視
□ ACLできめ細かい権限を使用(Redis 6.0+)
□ TLS暗号化を検討(Redis 6.0+)
❓ よくある質問
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設定のセキュリティチェックリストを確認しましょう
次のレッスン
次のレッスンでは、Redis Performance Testingについて学びます。redis-benchmarkツールを解説します。



