Вопрос или проблема
SElinux предотвращает запуск моего пользовательского сервиса через systemd при загрузке.
MESSAGE=SELinux предотвращает доступ systemd к файлу custom.service
перед перезагрузкой
[root@box opt]# systemctl daemon-reload
[root@box opt]# systemctl enable --now custom
[root@box opt]# systemctl status custom.service
● custom.service - foo
Loaded: загружен (/opt/foo/bar/systemd/custom.service; включено; настройка поставщика: отключена)
Active: активен (работает) с Пт 2022-10-07 12:18:27 EDT; 1мин 28с назад
...
...
после перезагрузки
[root@box opt]# systemctl status custom.service
Единица custom.service не найдена.
Я отключил selinux и перезагрузил, но это не помогло. Затем я изменил пользователя selinux, роль и тип файла сервиса и снова попробовал перезагрузиться.
[root@box opt]# chcon -R -u unconfined_u -r object_r -t systemd_unit_file_t foo/bar/systemd/
Все еще ничего… Затем я заметил, что символическая ссылка, которую я поместил в /etc/systemd/system
, показывала ?
для secontext. То же самое происходит, если я cp
файл сервиса в директорию /etc/systemd/system
.
[root@box opt]# ls -Z /etc/systemd/system/custom.service
? /etc/systemd/system/custom.service
Кто-нибудь знает, что нужно сделать, чтобы это исправить?
Кратко – SElinux предотвращает чтение systemd включенной пользовательской единицы systemd, несмотря на то что selinux отключен.
Нашел решение.
Я снова включил selinux в разрешающем режиме, и мой сервис был запущен после загрузки. Я полагаю, что команда chcon
, которую я выполнил, не оказала никакого эффекта, так как selinux был отключен заранее.
Теперь я отключил selinux и перезагрузил, и все, похоже, работает. Все еще не совсем понимаю, почему secontext имеет значение, если selinux отключен.
# ls -Z теперь показывает правильный контекст
[root@box ~]$ ls -Z /etc/systemd/system/custom.service
system_u:object_r:systemd_unit_file_t:s0 /etc/systemd/system/custom.service
Ответ или решение
Как предотвратить блокировку пользовательского сервиса systemd в SELinux при загрузке
SELinux (Security-Enhanced Linux) – мощный механизм безопасности, который контролирует доступ к ресурсам на уровне ядра. Если вы сталкиваетесь с проблемой, когда пользовательский сервис systemd блокируется при запуске, важно понять, как правильно настроить конфигурацию SELinux для корректной работы вашего сервиса.
Шаги для решения проблемы с SELinux
-
Проверка текущего состояния SELinux:
Сначала убедитесь, какой режим работает в вашей системе:getenforce
Значение "Enforcing" означает, что SELinux активно применяет правила, что может блокировать ваши сервисы.
-
Перевод SELinux в режим Permissive:
Замечания от SELinux будут заполнять журнал, но не блокировать доступ:setenforce 0
Это временно отключит строгие меры безопасности, позволяя вам диагностировать проблему.
-
Используйте команду
audit2allow
:
Если ваш сервис по-прежнему блокируется, проверьте логи SELinux:ausearch -m avc -ts recent
Создайте новый модуль политики:
ausearch -c 'systemd' --raw | audit2allow -M mypol semodule -i mypol.pp
-
Изменение контекста SELinux для файла службы:
Убедитесь, что контекст файла службы правильный:chcon -t systemd_unit_file_t /etc/systemd/system/custom.service
Проверьте контекст:
ls -Z /etc/systemd/system/custom.service
-
Убедитесь, что служба включена:
Активируйте вашу службу:systemctl daemon-reload systemctl enable --now custom.service
-
Проверка после перезагрузки:
Перезагрузите систему и проверьте статус службы:systemctl status custom.service
Общее недопонимание контекста SELinux
Несмотря на то, что вы отключили SELinux, важно помнить, что контекст файлов может оставаться важным. Если SELinux отключён, контекст файлов всё равно влияет на поведение других инструментов и компонентов системы. Правильный контекст – это обеспечение целостности и безопасности, даже когда SELinux не применяет свои политики.
Заключение
Лучший подход к решению этой проблемы – использовать режим “Permissive” SELinux при отладке, настраивая правильные контексты для файлов служб и периодически проверяя журналы SELinux на предмет ошибок. Правильное применение SELinux значительно повышает безопасность системы и может предотвратить потенциальные угрозы.
Если проблема сохраняется, стоит обратиться к сообществу и изучить документацию SELinux для получения дополнительной информации.