在使用 mysql 扩展安装和配置 MySQL 和 rsyslog 后,我在 /var/log/messages 中收到以下错误:
rsyslogd:db 错误 (2002): 无法通过套接字 '/var/lib/mysql/mysql.sock' 连接到本地 MySQL 服务器 (13)
我可以通过指定'--socket=/var/lib/mysql/mysql.sock'使用mysql客户端通过套接字连接。
我已将问题缩小到 selinux 权限。/var/log/audit/audit.log 文件有这样的说法:
type=AVC msg=audit(1244654592.150:320):avc: denied { search } for pid=6382 comm="rsyslogd" name="mysql" dev=xvda3 ino=1369538 scontext=user_u:system_r:syslogd_t:s0 tcontext=system_u :object_r:mysqld_db_t:s0 tclass=dir
将 selinux 设置为 permissive 模式确实可以解决问题。这将是生产服务器,并且不允许 selinux 处于许可模式。
在 /var/lib/mysql/mysql.sock 上运行 restorecon 也不能解决问题。有人可以帮我吗?
编辑:
所以我的追求还在继续,这里有一个更新。我最终创建了一个 semodule 来明确允许这种行为。为此,我执行了以下操作(以 root 身份):
# cd /var/log/audit/
# grep mysql audit.log | audit2allow
它输出了这个:
#============= syslogd_t ==============
allow syslogd_t mysqld_db_t:dir search;
allow syslogd_t mysqld_var_run_t:sock_file write;
allow syslogd_t mysqld_t:unix_stream_socket connectto;
这些确实是我想授予 rsyslog 的权限......所以我根据RedHat 的说明将它编译成一个模块并使用 semodule 命令安装它。
尝试重新启动 rsyslog 服务后,错误继续存在,并且审核日志中没有新的“拒绝”消息。有人有什么想法吗?
呜!!
所以我非常接近 semodule 解决方案......它实际上有点工作,但我不是 100% 确定为什么。我重新启动了服务器并出于沮丧重新加载了 semodule。selinux 已启用,我看到系统消息显示在数据库中。
希望这将有助于其他人,如果他们偶然发现它。祝你好运!
小心不要审计,策略可以定义不审计的东西,即不要审计通常会说“我预计会失败,我不想看到它/让它填满我的日志”。如果是这种情况,那么您将看不到它。
来自 semodule 手册页
这是一些描述它的背景故事
http://danwalsh.livejournal.com/11673.html
您绝对应该熟悉参考策略 (refpolicy) 概念。查看 syslog 和 mysql 模块(策略源),如果需要重新编译这些模块并试用它们。
也不要忘记,在许可模式下,拒绝只记录一次,直到重新启动或策略加载等事情发生。在强制您每次尝试访问时都会遭到拒绝。