我有一个转储 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
。
里面的临时文件怎么可能/tmp
有httpd_sys_content_t
fcontext呢?
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