redis 在 sellinux eforce 模式下无法将转储写入 /var/lib/redis

redis 在 sellinux eforce 模式下无法将转储写入 /var/lib/redis

在我的哨兵主从模式下;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 /

相关内容