我们的服务器上有 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
for/var/spool/cron directory
吗?