【发布时间】:2017-03-23 18:53:33
【问题描述】:
我们的服务器上有 Fedora 25 和 apache。
我想这样做是为了让我们网站上的 php 脚本可以更改 crontab 设置。
我创建了以下测试 php 脚本:
<?php
system("echo '*/2 * * * * date > /var/www/logs/testlog.txt' | crontab - 2>&1");
但它没有工作。我收到了消息:
/var/spool/cron/#tmp.mh203-95.XXXXG0KrFF:权限被拒绝
我查看了sealert -a /var/log/audit/audit.log 的输出
发现:
SELinux 正在阻止 crontab 对目录 /var/spool/cron 进行写访问。
好的。听起来apache不允许对/var/spool/cron进行写访问,因为该目录没有httpd_sys_rw_content_t label。
所以我执行了命令:
chcon -v -R -t httpd_sys_rw_content_t /var/spool/cron
我的 php 脚本开始工作了。 crontab -l 命令给出了正常的输出。
但新的问题出现了。 :( cron 任务没有执行。
在 /var/log/cron 我看到了错误:
Mar 23 18:05:01 mh203-95 crond[1653]: (apache) Unauthorized SELinux context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 file_context=system_u:object_r:httpd_sys_rw_content_t:s0 (/var/spool/cron/apache)
Mar 23 18:05:01 mh203-95 crond[1653]: (apache) FAILED (loading cron table)
经过多次研究...我发现 /var/spool/cron 必须有user_cron_spool_t 标签。所以我执行了:chcon -v -R -t user_cron_spool_t /var/spool/cron。
cron 任务开始工作。但是我的 php 脚本不再起作用了。和一开始一样的问题。
sealert 建议的命令如下:
ausearch -c 'crontab' --raw | audit2allow -M my-crontab
semodule -X 300 -i my-crontab.pp
但这并没有帮助。
我错过了什么?
如何解决问题?
我可以以某种方式将 user_cron_spool_t 和 httpd_sys_rw_content_t 两个标签组合为 /var/spool/cron directory 吗?
【问题讨论】:
-
对于希望将两个标签组合为一个目录的其他人的相关问题/答案:Allowing multiple types in the type field of a folder label in SELinux
标签: php apache cron selinux fedora-25