Redis Security

Redisのデフォルト設定は安全ではありません。このレッスンでは、Redisインスタンスを保護する方法について解説します。

Redisのセキュリティリスク

デフォルト設定のリスク:

⚠️ 注意: 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

プロテクションモードの動作:

ポートの変更

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を指定します。

📖 まとめ

📝 練習問題

  1. パスワード認証: Redisのパスワードを設定し、認証付き接続をテストしましょう
  2. ACL設定: 異なる権限を持つユーザー(管理者、読み取り専用、アプリケーションユーザー)を作成しましょう
  3. コマンド無効化: FLUSHALLとCONFIGコマンドを無効化し、動作しなくなったことを確認しましょう
  4. セキュリティチェック: Redis設定のセキュリティチェックリストを確認しましょう

次のレッスン

次のレッスンでは、Redis Performance Testingについて学びます。redis-benchmarkツールを解説します。

100%