apache — Selinux блокирует команду crontab из переполнения стека

На нашем сервере есть 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?

1

Решение

Я решил проблему.

Причина была в следующем: 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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]