Я использую программу резервного копирования под названием UrBackup, которую я настроил для ротации журналов один раз в день через cron.daily. После ротации журналов программное обеспечение использует сценарий postrotate для отправки запущенному процессу сигнала HUP с «systemctl kill». Однако SELinux отрицает эту операцию, и я не могу понять, как это исправить.
Вот полный файл конфигурации logrotate для UrBackup из /etc/logrotate.d:
"/var/log/urbackup.log" {
daily
rotate 30
missingok
create 640 urbackup urbackup
compress
postrotate
test -e /var/run/urbackupsrv.pid && kill -HUP 'cat /var/run/urbackupsrv.pid' || /bin/systemctl kill -s HUP urbackup-server.service
endscript
}
Как я обнаружил, в системе выполняется следующий проблемный сценарий postrotate:
/bin/systemctl kill -s HUP urbackup-server.service
SELinux блокирует это. Вот соответствующая запись журнала из / var / log / messages:
Nov 14 03:33:33 backup4 kernel: type=1107 audit(1510648413.518:4407695): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='avc: denied { stop } for auid=0 uid=0 gid=0 path="/usr/lib/systemd/system/urbackup-server.service" cmdline="/bin/systemctl kill -s HUP urbackup-server.service" scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=system_u:object_r:systemd_unit_file_t:s0 tclass=service#012 exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?'
Nov 14 03:33:33 backup4 logrotate: ALERT exited abnormally with [1]
Поскольку сигнал HUP не отправляется службе, он не знает, что файлы журнала были повернуты, и продолжает бесконечно записывать в старый (повернутый) журнал.
Я попытался устранить эту проблему с помощью утилиты sealert, чтобы предоставить объяснение всех ошибок в /var/log/audit/audit.log. Однако похоже, что эта ошибка игнорируется, хотя запись журнала отображается в audit.log.
Я также пробовал запускать команду «systemctl kill» в интерактивном режиме от имени пользователя root. Он завершается без ошибок. То же самое касается ручного запуска logrotate:
logrotate -f /etc/logrotate.d/urbackup-server
Эта команда также выполняется без проблем. Единственный раз, когда я вижу отказ SELinux, - это когда logrotate запускается ежедневным процессом Anacron.
SELinux явно не разрешает команду "systemctl kill"? Если да, то почему я могу запускать его в интерактивном режиме, но не при запуске через cron? Есть ли способ добавить исключение для этого случая или другой способ отправить сигнал HUP процессу, чтобы он записал в правильный файл журнала?
Большое спасибо за любую помощь.
В частности, контекст logrotate_t
не допускается systemd_unit_file_t
. Ваш интерактивный запуск находится в другом контексте.
Любопытно, что провалился тест pid файла. Если этот файл pid не существует во время работы службы, попробуйте добавить PIDFile=/var/run/urbackupsrv.pid
к urbackup-server.service
Блок.
Есть способы определить переход домена в SELinux, но сначала попробуйте файл pid.