启用 selinux 以允许在 nfs 共享上读写 mysql 文件

启用 selinux 以允许在 nfs 共享上读写 mysql 文件

我已将 /var/lib/mysql 目录移至 nfs 共享,更新了所有配置文件并在适当位置创建了符号链接。当我关闭 selinux 时,此方法有效,但当开启 selinux 时,mysqld 无法启动。我在 Google 上搜索解决方案,但未找到任何有效的方法。我怀疑我遗漏了一些简单的东西。

以下是我尝试过的:

yum install policycoreutils-python
semanage fcontext -a -t mysqld_db_t "/nfs/data0/mysql(/.*)?"
restorecon -Rv /nfs/data0/mysql

我怀疑我可能在这里使用了错误的上下文,但不确定正确的上下文是什么。有什么建议吗?

更新:

按照建议查看 /var/log/audit/audit.log 后,我发现以下错误:

type=AVC msg=audit(1398346018.436:3455): avc:  denied  { write } for  pid=10980 
   comm="httpd" name="mysql.sock" dev=0:13 ino=18438 
   scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:nfs_t:s0 
   tclass=sock_file
type=AVC msg=audit(1398346018.439:3456): avc:  denied  { search } for  pid=12395 
   comm="mysqld" name="mysql" dev=0:13 ino=14805 
   scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:object_r:nfs_t:s0 
   tclass=dir
type=AVC msg=audit(1398346019.657:3457): avc:  denied  { open } for  pid=12395 
   comm="mysqld" name="cache_admin_menu.frm" dev=0:13 ino=23322 
   scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:object_r:nfs_t:s0 
   tclass=file

不确定我需要做什么来解决这个问题。我已启用以下 sebools:

mysql_connect_any
httpd_can_network_connect_db
httpd_can_network_connect
httpd_can_network_memcache
httpd_can_sendmail
httpd_use_nfs
httpd_builtin_scripting

谢谢。

答案1

这个问题有点老了,但没有看到正确答案。

因此,我在使用 centos AMI 运行 mysql 时遇到了 AWS 和 EFS 的这个问题。

这里出现了两个问题。常规 mysql 文件的权限以及 mysql 套接字及其锁定文件的权限。

看起来,mysql 套接字是在 mysqld_var_run_t 上下文中创建的,而锁文件是在 mysqld_db_t 上下文中创建的,常规 mysql 文件也是如此。

现在,NFS 挂载通常会被赋予 nsf_t 上下文。

看来 nfs 挂载在挂载时只能具有 on se 上下文。因此,当通过 nfs 挂载时,我必须执行以下操作:

  1. 使用 mysqld_db_t 上下文挂载 NFS 共享。
  2. 将 mysql 套接字移动到具有 mysqld_db_t 上下文的不同目录。

因此在 fstab 中挂载看起来像这样:

nfs-share-url:/ /data nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noatime,context="system_u:object_r:mysqld_db_t:s0"  0 0

my.cnf 如下所示:

datadir=/data
socket=/var/lib/mysql-files/mysql.sock

因此所有文件的权限都是正确的,并且 mysql 现在将数据存储在 EFS NFS 共享上。

答案2

我会让 auditd 启动一个新的日志文件 ( kill -USR1 pidofauditd),然后让 SELinux 处于 Permissive 模式 ( setenforce 0),然后执行您通常执行的操作。这将生成合适的审计消息。然后

cat audit.log | audit2allow -M myLocalPolicy 
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i MyLocalPolicy.pp

检查 MyLocalPolicy.te 文件以查看该策略正在执行的操作,如果您愿意,请使用提供的 semodule 命令进行安装。

答案3

“打开”错误表示可能找不到“mysql.sock”。您是否尝试过将名称调整为系统上的完整路径?

仅供参考 - 我只是建议,因为我在谷歌搜索类似的错误时发现了你的问题,即 httpd 但在 name='/tmp/mysql.sock' 上“写入”,而我已经在 MySQL 的 my.cnf 和 php.ini 中的“socket”下定义了它。

相关内容