在我的哨兵主从模式下;redis 从属无法将转储写入 /var/lib/redis/ 并出现错误:
无法打开 RDB 文件 dump.rdb(位于服务器根目录 /var/lib/redis 中)进行保存:权限被拒绝
而权限确实是正确的:
# ls -la /var/lib/redis/
total 68
drwxr-xr-x. 2 redis redis 22 Apr 20 11:39 .
drwxr-xr-x. 28 root root 4096 Apr 17 12:15 ..
-rw-r--r--. 1 redis redis 62460 Apr 20 11:37 dump.rdb
我查看了 selinux 审核并发现了一些拒绝,并且只有在宽容模式下我才能看到 redis 进程可以写入目录。例如:
type=AVC msg=audit(1555741351.680:2719): avc: denied { getattr } for pid=8638 comm="redis-server" path="/var/lib/redis/dump.rdb" dev="vdb1" ino=68 scontext=system_u:system_r:redis_t:s0 tcontext=system_u:object_r:unlabeled_t:s0 tclass=file permissive=1
我尝试了各种类似这样的 selinux 权限授予,并可以确认 semanage 应用了该规则:
# cat /var/log/audit/audit.log |grep redis |audit2allow redis-server
#semodule -i redis-server.pp
我到处搜索,在 CentOS Linux 版本 7.6.1810 中使用 redis-3.2.12-2.el7.x86_64 强制执行 selinux 时无法完成此操作
答案1
首先,您应该撤消使用 所做的更改semodule
;这些更改是不必要的,而且具有潜在的破坏性。您可以使用semodule -r redis-server
(因为这似乎是您对模块的命名)来删除它。
其次,问题发生的原因在于 redis 尝试访问的文件根本没有 SELinux 标签。请注意,它的类型是unlabeled_t
。很难说为什么会发生这种情况,但通常的原因是该文件是在 SELinux 被禁用的情况下创建的。解决方案很简单:使用其默认上下文重新标记文件。
(除非您确实按照上述说明删除了 SELinux 模块,否则请不要继续。)
restorecon -v /var/lib/redis/dump.rdb
由于您很可能在禁用 SELinux 的情况下运行此系统,因此可能存在许多其他错误标记或未标记的文件。为了安全起见并防止将来出现问题,我会递归地重新标记文件系统中的所有内容。
restorecon -rv /