8.3.6 安全策略与权限控制
在持久化机制中,安全策略与权限控制需围绕数据文件、运行账号、网络访问与命令权限展开,避免未授权读写导致的持久化数据泄露或破坏。以下内容包含原理草图、可执行示例、排错与练习。
1. 运行身份与文件权限(示例+命令解释)
目标:最小权限账号运行,持久化文件仅 Redis 可读写。
# 1) 创建专用账号与目录
useradd -r -s /sbin/nologin redis
mkdir -p /data/redis
chown -R redis:redis /data/redis
chmod 700 /data/redis
# 2) 配置 Redis 使用该账号与目录
# 文件路径: /etc/redis/redis.conf
grep -E '^(dir|user|group)' /etc/redis/redis.conf
sed -i 's#^dir .*#dir /data/redis#' /etc/redis/redis.conf
命令解释
- useradd -r:创建系统账号,避免登录风险。
- chmod 700:仅属主可读写执行,避免泄露。
- dir:RDB/AOF 生成目录,需与权限一致。
2. 认证与 ACL 权限控制(示例+命令解释)
目标:禁用匿名访问,细粒度限制危险命令。
# 1) 设置 requirepass(适用于 Redis 5.x)
# /etc/redis/redis.conf
requirepass "Str0ngPass!"
# 2) Redis 6+ 启用 ACL
# /etc/redis/users.acl
user admin on >AdminPass! ~* +@all -CONFIG -FLUSHALL
user app on >AppPass! ~app:* +GET +SET +DEL -FLUSHDB
# 3) 载入 ACL 并验证
redis-cli -a "Str0ngPass!" ACL LOAD
redis-cli -u redis://app:AppPass!@127.0.0.1:6379 ACL WHOAMI
命令解释
- ~app:*:仅允许访问 app: 前缀的 Key。
- -CONFIG -FLUSHALL:禁用高危命令。
- ACL LOAD:加载 ACL 文件并生效。
3. 网络访问控制与端口保护(示例+命令解释)
目标:仅内网访问,严格限制端口。
# /etc/redis/redis.conf
bind 127.0.0.1 10.0.0.12
protected-mode yes
port 6379
# 防火墙仅允许业务网段
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
source address="10.0.0.0/24" port protocol="tcp" port="6379" accept'
firewall-cmd --reload
命令解释
- bind:限制监听地址,避免公网暴露。
- protected-mode yes:阻止无认证访问。
- firewall-cmd:端口白名单。
4. 持久化文件安全与备份传输(示例+命令解释)
目标:备份加密、传输安全、最小权限。
# 1) 只读备份账号
useradd -r -s /sbin/nologin redisbak
setfacl -m u:redisbak:r /data/redis/dump.rdb /data/redis/appendonly.aof
# 2) 备份加密(openssl)
openssl enc -aes-256-cbc -salt -in /data/redis/dump.rdb \
-out /backup/dump.rdb.enc -k "BackupKey!"
# 3) 通过 SSH 传输
scp /backup/dump.rdb.enc backup@10.0.0.20:/data/backup/redis/
命令解释
- setfacl:给备份账号只读权限。
- openssl enc:加密持久化文件。
- scp:基于 SSH 安全传输。
5. 配置与变更审计(示例+命令解释)
目标:配置受控、变更可追溯。
# 禁止运行期配置修改
# /etc/redis/users.acl
user admin on >AdminPass! ~* +@all -CONFIG
# 记录配置校验哈希
sha256sum /etc/redis/redis.conf > /var/log/redis.conf.sha256
命令解释
- -CONFIG:禁止动态变更。
- sha256sum:便于审计与差异对比。
6. 运行时安全加固(示例+命令解释)
目标:禁用危险命令,防止误删与资源耗尽。
# /etc/redis/redis.conf
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
maxmemory 4gb
maxmemory-policy allkeys-lru
命令解释
- rename-command ... "":禁用命令。
- maxmemory:避免恶意写满内存导致系统抖动。
7. 常见排错(现象-命令-解决)
- 现象:ERR permission denied 写入 RDB/AOF 失败
bash
ls -l /data/redis
journalctl -u redis -n 50
解决:修正属主与权限:chown -R redis:redis /data/redis
-
现象:
NOAUTH Authentication required
bash redis-cli -a "Str0ngPass!" ping
解决:核对requirepass/ACL与客户端密码。 -
现象:
ERR unknown command(因禁用命令)
解决:检查rename-command是否被禁用,必要时临时恢复。
8. 练习(动手验证)
1. 创建 app 用户,仅允许操作 app:* Key,并验证 FLUSHALL 被拒绝。
2. 将 dump.rdb 加密后备份到远端,校验文件大小与哈希。
3. 故意将 dir 设置为无权限目录,观察日志并修复。
4. 使用防火墙仅允许 10.0.0.0/24 访问 Redis,验证外网不可连通。
通过最小权限账号、ACL 精细授权、网络隔离与持久化文件加密的组合,可最大限度降低 Redis 持久化数据被未授权访问或篡改的风险。