На нашем сервере есть 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
?
Я решил проблему.
Причина была в следующем: 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
…
Перед каждым исследованием … я казнил:
echo -n «»> /var/log/audit/audit.log
Мой скрипт php.
sealert -a /var/log/audit/audit.log
Других решений пока нет …