使用 SELinux 在 /dev/shm 上设置 MySQL tmpdir

使用 SELinux 在 /dev/shm 上设置 MySQL tmpdir

在 RHEL5 上,我有一个小型 MySQL 数据库,它必须写入临时文件。为了加快此过程,我想通过将以下行放入 my.cnf 中将临时目录移动到 /dev/shm:

tmpdir=/dev/shm/mysqltmp

我可以很好地创建 /dev/shm/mysqltmp 并执行

chown mysql:mysql /dev/shm/mysqltmp
chcon --reference /tmp/ /dev/shm/mysqltmp

我尝试通过应用与 /tmp/ (和 /var/tmp/)相同的设置来使 SELinux 正常运行,如果 tmpdir 未定义,MySQL 大概会将其 tmp 文件写入 /tmp/ (和 /var/tmp/)。

问题是 SELinux 抱怨 MySQL 有权访问该目录。我在 /var/log/messages 中收到以下内容:

SELinux is preventing mysqld (mysqld_t) "getattr" to /dev/shm (tmpfs_t).

SELinux 是个难缠的情妇。详情:

Source Context                root:system_r:mysqld_t
Target Context                system_u:object_r:tmpfs_t
Target Objects                /dev/shm [ dir ]
Source                        mysqld
Source Path                   /usr/libexec/mysqld
Port                          <Unknown>
Host                          db.example.com
Source RPM Packages           mysql-server-5.0.77-3.el5
Target RPM Packages           
Policy RPM                    selinux-policy-2.4.6-255.el5_4.1
Selinux Enabled               True
Policy Type                   targeted
MLS Enabled                   True
Enforcing Mode                Enforcing
Plugin Name                   catchall_file
Host Name                     db.example.com
Platform                      Linux db.example.com 2.6.18-164.2.1.el5 #1 SMP
                              Mon Sep 21 04:37:42 EDT 2009 x86_64 x86_64
Alert Count                   46
First Seen                    Wed Nov  4 14:23:48 2009
Last Seen                     Thu Nov  5 09:46:00 2009
Local ID                      e746d880-18f6-43c1-b522-a8c0508a1775

ls -lZ /dev/shm 显示

drwxrwxr-x  mysql mysql system_u:object_r:tmp_t          mysqltmp

/dev/shm 本身的权限是

drwxrwxrwt  root root  system_u:object_r:tmpfs_t        shm

我也尝试过

chcon -R -t mysqld_t /dev/shm/mysqltmp

并将 /dev/shm 上的组设置为 mysql,结果并没有好转。难道不应该告诉 SELinux,这是一个临时目录,就像 MySQL 以前使用的一样吗?

除了关闭 SELinux,我该如何实现此功能?我需要编辑 SELinux 策略文件吗?

答案1

SELinux is preventing mysqld (mysqld_t) "getattr" to /dev/shm (tmpfs_t).

这意味着 SELinux 拒绝访问/dev/shmdir(它是 的父级)/dev/shm/mysqltmp

ls -lZd /tmp/
drwxrwxrwt 3 system_u:object_r:tmp_t:s0
ls -lZd /dev/shm
drwxrwxrwt  root root system_u:object_r:tmpfs_t:s0

您有 3 个选择:

1) 将/dev/shm类型标签从更改tmpfs_ttmp_t

2)以宽容模式运行 SELinux,并收集所有拒绝/var/log/audit/audit.log

tail -n 0 -f /var/log/audit/audit.log | audit2allow -m myMySQL -o myMySQL.te
checkmodule -M -m myMySQL.te -o myMySQL.mod
semodule_package -m myMySQL.mod -o myMySQL.pp

您应该检查 myMySQL.te 是否仅包含必要的允许。最后,您将模块加载到内核中semodule -i myMySQL.pp

3)禁用 MySQL 的 SELinux 保护setsebool -P mysqld_disable_trans=on

答案2

制作您自己的 tmpfs 并贴上您需要的任何标签: http://www.thegeekstuff.com/2008/11/overview-of-ramfs-and-tmpfs-on-linux/ /dev/shm 被 glibc 用于 POSIX 共享内存,因此我建议不要使用它。

相关内容