SELinux:让 Apache 在 CentOS 上与 MySQL 对话

Rsa*_*sha 6 mysql selinux centos apache-2.2

所以我已经将 MySQL chroot 到 /opt/chroot/mysql,并且一切运行良好。Apache配置正常,运行正常。

我创建了一个连接到 MySQL 守护程序的小型 PHP 脚本,并配置了 PHP,以便使用的默认套接字是 chroot 套接字。当 SELinux 被禁用时,脚本能够正常连接。但是,启用 SELinux 后,脚本无法连接(错误号为 13),审核日志告诉我 SELinux 拒绝了请求。

我发现的每个处理这个问题的教程都告诉我禁用 SELinux。这不是我想做的,所以请不要建议!我想要一个在启用 SELinux 的情况下有效的解决方案......我认为必须存在一个......

我想我可能必须更改 mysql 文件的 SELinux 上下文,但我不确定将它们更改为什么才能使其工作。

qua*_*nta 6

更新 2

type=AVC msg=audit(1318863312.959:435): avc: denied { connectto } for pid=12472 comm="httpd" path="/opt/chroot/mysql/var/lib/mysql/mysql.sock" scontext=unconfined_u :system_r:httpd_t:s0 tcontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 tclass=unix_stream_socket

您可以通过以下步骤构建自定义 SELinux 策略模块:

# grep httpd_t audit.log | audit2allow -m httpd > httpd.te
# checkmodule -M -m -o httpd.mod httpd.te
# semodule_package -m httpd.mod -o httpd.pp 
# semodule -i httpd.pp
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅主题。


更新

  1. 运行semanage命令以添加上下文映射/opt/chroot/mysql/var/lib/mysql/

    # semanage fcontext -a -t mysqld_db_t "/opt/chroot/mysql/var/lib/mysql(/.*)?"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 并使用restorecon命令来应用此上下文映射:

    # restorecon -Rv /opt/chroot/mysql/var/lib/mysql
    
    Run Code Online (Sandbox Code Playgroud)

如果您通过 TCP/IP 连接,请尝试以下操作:

# setsebool -P httpd_can_network_connect 1
Run Code Online (Sandbox Code Playgroud)