Redis 6.0.9执行ACL保存、CONFIG REWRITE时日志报Permission denied怎么办
问题根因
- 核心权限报错来自
systemd服务沙箱的可写路径白名单约束。你的redis.service配置中仅通过ReadWriteDirectories给/var/lib/redis目录开放了读写权限,其余所有路径(包括你配置的ACL文件所在目录、/etc/redis下的redis.conf配置文件目录)都被沙箱限制为只读、无写入权限。 - 这类沙箱权限的优先级高于Linux系统本身的文件属主/权限配置,哪怕你提前给目标目录配置了redis用户的读写权限,只要没加入可写白名单,写入操作依然会被拦截。
- 对应日志中的两类权限报错:
- 执行
ACL SAVE时,Redis需要在你配置的ACL文件同目录下创建临时文件,写完后通过原子替换的方式更新正式ACL文件,这个临时文件的写入路径不在白名单内,直接被拦截抛出Permission denied - 执行
CONFIG REWRITE时,Redis需要在redis.conf所在目录创建临时配置文件,完成配置内容写入后替换原redis.conf,同样因为路径不在可写白名单内失败
- 执行
- 日志里的
NOTIFY_SOCKET not found属于附带告警,不属于核心权限问题:你的Redis编译时默认开启了systemd通知支持,但service文件未配置对应的服务类型,导致Redis启动时找不到和systemd通信的socket通道,不影响核心功能运行。
解决方法
- 先确认Redis配置中两个关键路径的绝对位置:
redis.conf中aclfile配置项指向的ACL文件存储路径- 服务启动参数指定的
redis.conf文件本身的路径
- 修改redis.service里的
ReadWriteDirectories配置,把上述两个文件所在的目录加入可写白名单。比如ACL文件和redis.conf都存放在/etc/redis/目录下,就把原配置行调整为:ReadWriteDirectories=-/var/lib/redis -/etc/redis
注:每个路径前的-是systemd语法,代表路径不存在时不触发服务启动报错,不是权限标识。 - 完成配置修改后,依次执行命令让配置生效:
执行systemctl daemon-reload重载systemd的服务配置缓存
执行systemctl restart redis重启Redis服务 - 效果验证:重启后在redis-cli中重新执行
ACL SAVE和CONFIG REWRITE操作,确认无权限报错即可。如果需要消除NOTIFY_SOCKET的启动告警,可在redis.service的[Service]段新增一行配置Type=notify,重启服务后告警会自动消失。
内容的提问来源于stack exchange,提问作者wajahat021
相关产品推荐
相关产品推荐

