2

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

4

1 回答 1

0

我已经解决了这个问题。

原因在于: sealert 在所有建议的命令中生成相同的政治名称 my-crontab。新政压倒旧政。
只需稍微更改此名称即可。

所以我执行了:

ausearch -c 'crontab' --raw | audit2allow -M my-crontab
semodule -X 300 -i my-crontab.pp

ausearch -c 'crontab' --raw | audit2allow -M my-crontab2
semodule -X 300 -i my-crontab2.pp

ausearch -c 'crontab' --raw | audit2allow -M my-crontab3
semodule -X 300 -i my-crontab3.pp
...

在每次 ausearch ... 我执行之前:
echo -n "" > /var/log/audit/audit.log
我的 php 脚本。
sealert -a /var/log/audit/audit.log

于 2017-03-24T00:11:44.323 回答