bigywater.tech
Redis · 132

RDB/AOF 文件权限

备份泄露常常不是网络攻击,而是文件权限:RDB 和 AOF 里就是你的全部数据。Redis 自己创建这些文件时用什么权限?要怎么收紧?这篇用两种 umask 各启动一个实例,把每个文件的实际权限列出来。

0644 → 0600
dump.rdb 的权限:umask 022 → umask 077(其它数据文件同样跟随 umask)
数据目录
数据目录本身要自己收紧;Redis 只对它创建的 appendonlydir/ 应用 umask
aclfile 吞掉 requirepass
aclfile(无 default 行)+ requirepass:requirepass 不生效,不带密码就能 PING(本次实测)

各文件的权限

实测 · 本机执行输出
  文件                                         umask 022   umask 077
  数据目录                                            0755        0755
  redis.conf(CONFIG REWRITE 之后)                   0644        0600
  dump.rdb                                        0644        0600
  BGSAVE 进行中的 temp-*.rdb                          0644        0600
  appendonlydir/                                  0755        0700
    appendonlydir/appendonly.aof.N.base.rdb        0644        0600
    appendonlydir/appendonly.aof.N.incr.aof        0644        0600
    appendonlydir/appendonly.aof.manifest         0644        0600
  users.acl(ACL SAVE)                             0644        0600
  nodes.conf                                      0644        0600
  redis.log                                       0644        0600
  r.sock                                          0755        0700

表里左边是 umask 022,右边是 umask 077。同一套配置:集群模式、AOF 打开、aclfile、Unix 套接字、CONFIG REWRITE、BGSAVE(用 rdb-key-save-delay 放慢以便抓到临时文件)。所有由 Redis 创建的文件都随进程 umask 走,没有单独的「收紧」。

套接字权限

实测 · 本机执行输出
  未设 unixsocketperm: 0755  设 unixsocketperm 700: 0700

unixsocketperm 显式指定套接字文件的权限。

配置里的凭据

实测 · 本机执行输出
  redis.conf 含明文的 masterauth 密码: True    users.acl 只有哈希、没有明文: True
  一个明文的 requirepass 行读起来是: ['masterauth "Conf-Plain-Pw"']
  users.acl 内容: ['user default on nopass sanitize-payload ~* &* +@all', 'user svc on sanitize-payload #f52fbd32b2b3b86ff88ef6c490628285f482af15ddcb29541f94bcf526a3f6c7 ~* resetchannels -@all +get']

redis.conf 里的 masterauth(以及 requirepass)是明文;ACL 文件里只有 SHA-256 哈希(第 122 篇)。

附带发现:aclfile 会让 requirepass 失效

实测 · 本机执行输出
  aclfile(空)+ requirepass:不带密码 PING → PONG
  ACL LIST → ['user default on nopass sanitize-payload ~* &* +@all']
  日志里的相关行: []
  把 requirepass 写在 aclfile 前面:不带密码 PING → PONG

这是本文实验里意外看到的。仅限这里测过的情形:aclfile 存在但里面没有 default 用户行。文件里写了 default 用户的密码时是否正常(应当由 aclfile 决定)本文没有验证。

收紧的做法

分步演示:同一批文件,两种 umask

RDB/AOF 文件权限
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / Redis 8.10.2 独立实例(本机回环端口,save 关闭),redis-cli 风格输出由自写的 RESP 客户端打印;计时用 time.perf_counter,数字每次运行会有小幅抖动。umask 通过 subprocess 的 preexec_fn 设置;文件权限用 os.stat 读取
    • 没有验证:Linux 上的行为(macOS 与 Linux 的默认 umask 和创建规则可能不同)、systemd 的 UMask= / 服务单元、Docker 卷的属主与权限、SELinux / ACL 扩展权限、fsync 与权限的关系、备份工具(cp / rsync / tar)对权限的保留、aclfile 中带 default 用户行时的行为
    京ICP备2026067502号-1京公网安备11010502063487号