Selinux 拒绝访问 mysqld

Selinux 拒绝访问 mysqld

我有一个转储 mysql 数据库的脚本。然后它压缩该文件,并使用 cron 将其存储在我的主文件夹中。问题是我似乎收到一条错误消息。

mysqldump:无法执行“显示来自‘auth_group’的字段”:无法创建/写入文件“/tmp/#sql_151e_0.MYI”(错误代码:13)(1)c2duo_db-22072011.sql

现在在我的centos服务器图形端,它说selinx已拒绝访问mysqld。当然,如果我禁用 selinux 这工作正常。但我需要启用selinux。有办法解决这个问题吗?

计划任务

10 11 * * 5 /home/sh/mysqlbackup.sh

mysql备份.sh

  #!/bin/sh

    mysqldump -uroot -ppassword --opt c2duo_db > /home/sh/c2duo_db-`date +%d%m%Y`.sql

    cd /home/sh
    tar -zcvf c2duo_db.tgz *.sql

编辑:这是我从命令中得到的结果grep mysqld /var/log/audit/audit.log | tail | audit2why

type=AVC msg=audit(1311581788.889:12363): avc:  denied  { write } for  pid=22102 comm="mysqld" path="/tmp/#sql_151e_0.MYI" dev=dm-0 ino=103481390 scontext=root:system_r:mysqld_t:s0 tcontext=root:object_r:httpd_sys_content_t:s0 tclass=file
        Was caused by:
                Missing or disabled TE allow rule.
                Allow rules may exist but be disabled by boolean settings; check boolean settings.
                You can see the necessary allow rules by running audit2allow with this audit message as input.

另外,我的 mysql 服务器已经安装在这台机器上。所以我猜这是一个官方仓库。

答案1

您的目录中的文件上下文可能不正确/tmp。给我们看一看ls -ldZ /tmp

里面的临时文件怎么可能/tmphttpd_sys_content_tfcontext呢?

type=AVC msg=audit(1311581788.889:12363): avc:  denied  { write } for  pid=22102 comm="mysqld" path="/tmp/#sql_151e_0.MYI" dev=dm-0 ino=103481390 scontext=root:system_r:mysqld_t:s0 tcontext=root:object_r:httpd_sys_content_t:s0 tclass=file
        Was caused by:
                Missing or disabled TE allow rule.
                Allow rules may exist but be disabled by boolean settings; check boolean settings.
                You can see the necessary allow rules by running audit2allow with this audit message as input.

在 RHEL 上是:

ls -ldZ /tmp
drwxrwxrwt. root root system_u:object_r:tmp_t:s0       /tmp

当然,它与您的备份文件的路径无关。如果是权限问题,你会得到类似这样的信息:

# su -s /bin/bash nobody -c 'mysqldump -uroot -p123456 --opt test > /root/test-`date +%d%m%Y`.sql'
bash: /root/test-13112013.sql: Permission denied

您可以使用它strace -f -ff -o /tmp/strace mysqldump -uroot -ppassword --opt c2duo_db来查看它尝试打开哪些文件、使用...

答案2

看起来有些东西可能被贴错标签了。你尝试过跑步吗restorecon -R /var/lib/mysql

答案3

我只是运行以下建议的命令audit2why

% echo "type=AVC msg=audit(1311581788.889:12363): avc:  denied  { write } for  pid=22102 comm="mysqld" path="/tmp/#sql_151e_0.MYI" dev=dm-0 ino=103481390 scontext=root:system_r:mysqld_t:s0 tcontext=root:object_r:httpd_sys_content_t:s0 tclass=file" | audit2allow 

该命令返回:

#============= mysqld_t ==============
allow mysqld_t httpd_sys_content_t:file write;

这可能就是您需要的 SeLinux 策略允许规则。

但我不知道允许这个规则是否安全......

答案4

问题背后的原因:

问题背后的原因是您将 shell 脚本文件放置在“/home/sh/”中

似乎位于 /home/ 文件夹下的 /sh/ 文件夹不是系统生成的文件夹(在创建系统用户时创建的文件夹),而是您手动创建的。因此,当 cron 运行时,系统会限制对 shell 脚本文件内脚本的访问。

笔记:在 Linux 中,访问仅限于 /home/ 目录中的文件。但文件位于/home/[系统为每个系统用户创建的目录]/具有不受限制的访问权限

解决方案:

Move the /sh/ folder along with the sh file inside a system generated folder under /home/ directory (or) create a system user named sh

相关内容