Как перейти в другой домен при вызове sudo?

У меня есть демон (collectd), который выполняет скрипт для сбора данных (через smartctl).

Плагин exec-сборщика собирает мандаты, что внешние скрипты выполняются под пользователем! = Root.

План состоит в том, чтобы настроить его следующим образом:

  • разрешить collectd изменять пользователя и, возможно, выполнять скрипт (через SELinux)
  • создать системного пользователя X для задачи
  • configure sudo, так что X разрешено выполнять smartctl
  • сконфигурируйте SELinux таким образом, что a) sudo переходит к (скажем) неограниченному домену b) setuid для пользователя X (или выполнение скрипта) переходит к неограниченному домену

Я придумал последний шаг – потому что в противном случае переход отсутствует, и я должен разрешить собирать все связанные с smartctl низкоуровневые разрешения (например, sys_rawio, ioctl, execute_no_trans …), чего я хочу избежать.

Судо, кажется, предоставляет атрибуты SELinux, например, можно ввести в строку sudoer что-то вроде:

TYPE=unconfined_t ROLE=unconfined_r 

Но затем sudo жалуется:

 sudo: невозможно определить режим принуждения .: Разрешение отклонено
 sudo: невозможно выполнить / usr / sbin / smartctl: разрешение отклонено

Как TYPE / ROLE должен работать с sudo (под CentOS 7)?

Как насчет маршрута b) – как настроить это с помощью пользовательского файла политики SELinux?

  • Как безопасно передавать переменные в сценарии с поддержкой root?
  • Почему sudo нужен интерфейс loopback?
  • Можно ли сохранить как sudo из nano после того, как вы забыли работать как sudo?
  • notify-send from root cron
  • Программное обеспечение, такое как Iceweasel и LibreOffice, не будет работать без root / sudo
  • Как заставить sudo запомнить мой пароль дольше?
  • sudo: «эффективный uid не равен 0, sudo установлен setuid root?» на малине Pi
  • Судо для OpenLDAP
  • One Solution collect form web for “Как перейти в другой домен при вызове sudo?”

    Вы можете указать переход в файле пользовательской политики ( .te ) следующим образом:

     module collectdlocalexec 1.0; require { type collectd_t; type user_home_t; type unconfined_t; type shell_exec_t; class capability {setgid setuid }; class file { execute read open }; class process transition; } allow collectd_t self:capability { setgid setuid }; allow collectd_t user_home_t:file { execute read open }; allow collectd_t shell_exec_t:file execute; allow collectd_t unconfined_t:process transition; type_transition collectd_t user_home_t:process unconfined_t; 

    Предполагая, что сценарий сбора находится в домашнем каталоге пользователя (и это помечено как user_home_t ).

    Linux и Unix - лучшая ОС в мире.