「Redis 未授权访问」这个词被说了很多年。这篇不讲怎么打,只讲怎么自查:站在局域网上一个没有任何凭据的客户端的位置,对自己的实例问一组固定的问题,看每种配置下能得到什么。五种配置,每一种都是本机的临时实例,没有碰任何别人的东西。
检查项 A B C D E
PING PONG PONG PONG PONG NOAUTH
INFO server OK OK OK NOPERM NOAUTH
DBSIZE 1 1 1 1 NOAUTH
GET session:1 读到 读到 读到 读到 NOAUTH
CONFIG GET dir 2 项 2 项 2 项 NOPERM NOAUTH
CONFIG SET dir(改到我自己的临时目录) ERR OK ERR NOPERM NOAUTH
dir 真的被改了吗 否 是 否 否 否
DEBUG SLEEP 0 ERR ERR ERR ERR ERR
MODULE LIST 1 项 1 项 1 项 NOPERM NOAUTH
KEYS * 1 项 1 项 1 项 NOPERM NOAUTH
DRYRUN default FLUSHALL OK OK OK 拒绝 OK
DRYRUN default REPLICAOF 10.0.0.1 6379 OK OK OK 拒绝 OK
DRYRUN default SHUTDOWN NOSAVE OK OK OK 拒绝 OK
default 是否 -@dangerous 否 否 否 是 否
A 裸奔(全默认) | B protected-configs=yes | C protected-configs=local | D default -@dangerous | E requirepass方法:另起一条来自局域网地址(不是回环)的连接,不带任何凭据,依次问:能 PING 吗?能读 INFO 吗?能读数据吗?能读 / 改 dir 吗?能 DEBUG 吗?再让管理员用 ACL DRYRUN default 判定 default 用户对几条危险命令的权限。改 dir 时改到的是我自己的临时目录,随后立刻改回。
{'enable-protected-configs': 'no', 'enable-debug-command': 'no', 'enable-module-command': 'no', 'protected-mode': 'no'}
A 里 CONFIG SET dir 被拒的原文: ERR CONFIG SET failed (possibly related to argument 'dir') - can't set protected config
B(=yes)里同一条: OK
C(=local)里: ERR CONFIG SET failed (possibly related to argument 'dir') - can't set protected config
DEBUG(A): ERR DEBUG command not allowed. If the enable-debug-command option is set to "local", you can run it from a local connection, otherwise you need to set this option in the configuration file, and then restart the server.
A 上,陌生客户端保持着连接时,管理员的 CLIENT LIST 能看到来源地址吗(是否有来自 10.83.245.179 的连接) → True | addr=10.83.245.179:63766 laddr=10.83.245.179:9170 fd=10 name= age=0 idle=0 flags=N db=0 su
服务端 INFO 泄露给未登录客户端的字段(A):
redis_version 8.10.2
os Darwin 27.0.0 arm64
arch_bits 64
process_id 22116
run_id da4e09bf9069c8e1ae57c4da429190801fa3aaf4
tcp_port 9170
executable <实验目录>
config_file <实验目录>三个「危险开关」出厂都是关的:enable-protected-configs no、enable-debug-command no、enable-module-command no。所以没配 requirepass 的实例,陌生人默认也改不了 dir、跑不了 DEBUG——但依然能读走全部数据。INFO server 还会告诉对方版本、操作系统和文件路径,方便对方选择手段。
local(配置 C)加别的方式。-@dangerous 挡不住 GET;需要限制 key 模式(第 122、123 篇)。CLIENT LIST 里的 addr 能看到陌生来源(第 125 篇的 ACL LOG 只记录被 ACL 拒绝的操作,不记录成功的读取)。