У меня есть служба, работающая на машине Fedora 20, которая при запуске пытается зарегистрировать службы в Avahi. Это отлично работает, если моя служба запускается, когда SELinux находится в разрешающем режиме, но служба не будет регистрироваться, когда SELinux принудительно.
Я знаю о httpd_dbus_avahi
логическое значение в SELinux. Это отлично работает, позволяя Apache регистрировать службы, но мне не удалось найти много информации о том, как разрешить другим конкретным службам взаимодействовать с Avahi.
В частности, я пытаюсь разрешить tvheadend регистрировать свою службу HTSP в Avahi, но мне также любопытно, как любой конкретной службе можно разрешить взаимодействовать с Avahi без остановки SELinux. Я НЕ заинтересован в отключении SELinux или в разрешении процесса, который хочет взаимодействовать с Avahi.
РЕДАКТИРОВАТЬ: добавлена вся информация о SELinux и сервисных модулях, относящаяся к tvheadend
--- SELinux ---
сообщения audit.log
После выполнения semodule -DB
и перезапуск службы tvheadend. Ниже приведены все сообщения, появившиеся в журнале аудита. Последнее сообщение кажется проблемой, но я не уверен, что с этим делать ...
type=SERVICE_STOP msg=audit(1393282994.012:512): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg=' comm="tvheadend" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
type=SERVICE_START msg=audit(1393283083.635:513): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg=' comm="tvheadend" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
type=USER_AVC msg=audit(1393283084.291:514): pid=752 uid=81 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc: denied { send_msg } for msgtype=method_return dest=:1.114 spid=731 tpid=14478 scontext=system_u:system_r:avahi_t:s0 tcontext=system_u:system_r:init_t:s0 tclass=dbus exe="/usr/bin/dbus-daemon" sauid=81 hostname=? addr=? terminal=?'
Обработать
Выход из ps -AZ | grep tvheadend
system_u:system_r:init_t:s0 2599 ? 00:00:06 tvheadend
Я заметил, что init_t
тип процесса кажется немного странным, поскольку все другие службы в моей системе имеют initrc_t
тип процесса. Я не уверен, почему служба tvheadend отличается в этом отношении.
Пользователь
Выход из sudo -u hts id
uid=1001(hts) gid=1003(hts) groups=1003(hts),39(video) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Я использую этого пользователя только для запуска службы tvheadend. У этого пользователя есть домашний каталог в отдельном разделе, намного большем, чем системный раздел, поскольку файлы DVR, созданные tvheadend, могут стать довольно большими.
Когда я создавал этого пользователя, я не использовал --system
переключиться с useradd
команда. Может, стоило?
Исполняемый
Выход из ls -Z /usr/local/bin | grep tvheadend
-rwxr-xr-x. root root system_u:object_r:bin_t:s0 tvheadend
---Обслуживание---
Файл объекта
[Unit]
Description=TVHeadEnd
After=syslog.target network.target avahi-daemon.service sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.demux0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.dvr0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.frontend0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.net0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.demux0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.dvr0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.frontend0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.net0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-vbi0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-vbi1.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-video0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-video1.device
Wants=sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.demux0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.dvr0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.frontend0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb0.net0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.demux0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.dvr0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.frontend0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-dvb-dvb1.net0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-vbi0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-vbi1.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-video0.device sys-devices-pci0000:00-0000:00:1c.0-0000:05:00.0-video4linux-video1.device
[Service]
Type=forking
GuessMainPID=no
EnvironmentFile=/etc/sysconfig/tvheadend
ExecStart=/usr/local/bin/tvheadend -f -u $TVH_USER -g $TVH_GROUP -p $TVH_PID -b $TVH_ADDRESS --http_port $TVH_HTTP_PORT --htsp_port $TVH_HTSP_PORT
PIDFile=$TVH_PID
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
Файл среды объекта
TVH_USER=hts
TVH_GROUP=hts
TVH_PID=/var/run/tvheadend.pid
TVH_ADDRESS=0.0.0.0
TVH_HTTP_PORT=9981
TVH_HTSP_PORT=9982
Запуск этой службы как init_t
наверное, не лучшая идея.
Причина такого поведения в том, что tvheadend
является наверное маркированный bin_t
, и не существует правила перехода для перемещения файла этого типа из init_t
контекст.
Вы можете поискать это, чтобы узнать наверняка ..
$ sesearch -s init_t --type -c process | grep bin_t
Эта команда не возвращает результатов. Нет переходов из init_t в течение bin_t
обработать.
Вам также следует избегать запуска этого типа в initrc_t
тоже, так как это не подходит для службы. По сути, Лучший Решением было бы правильно написать ограниченную политику для вашей службы, однако это выходит за рамки этого ответа.
Вместо этого вам нужно избавиться от процесса init_t
к другому типу. Поскольку для этого приложения не существует политики, вероятно, лучше переместить ее в unconfined_t
, для которого существует переход типа.
$ sesearch -s init_t --type -c process -t unconfined_exec_t
Found 1 semantic te rules:
type_transition init_t unconfined_exec_t : process unconfined_t;
Мы также можем проверить, что правило, которое применяется в политике, не попадет в unconfined_t
(чего не должно быть).
$ sesearch -s avahi_t -p send_msg -c dbus -t unconfined_t --allow
Found 2 semantic av rules:
allow avahi_t unconfined_t : dbus send_msg ;
allow system_bus_type unconfined_t : dbus send_msg ;
Для этого просто переименуйте свой tvheadend
программа для unconfined_exec_t
.
semanage fcontext -a -t unconfined_exec_t -f f /usr/bin/tvheadend
Потом восстановите.
restorecon /usr/bin/tvheadend
Теперь перезапустите вашу службу должен работай. Если вы повторно запустите ps -AZ | grep tvheadend
вы должны увидеть, как ваш процесс работает unconfined_t
.
В идеале для этой программы следует использовать новую политику, но если политики не существует, лучше всего запустить ее вообще без политики в unconfined_t
домен. initrc_t
и init_t
на самом деле не предназначены для использования для запуска сервисов (хотя некоторые из них неправильно заходят туда), initrc_t
изначально был задуман для запуска сценариев оболочки SYSV и init_t
предназначен для запуска самой systemd / init.
Справочная страница для apache_selinux
упоминает, что # semanage permissive
может использоваться для запуска определенных процессов снисходительный Режим.
# semanage permissive -a avahi_t
Предлагаю найти более подробную информацию о его использовании.
особенно, когда SELinux предоставляет огромное количество параметров конфигурации, позволяющих данной службе выполнять только то, что ты ожидать это делать, и не более того! Однако из-за такого огромного количества вариантов управления администраторы должны изучить, какие варианты существуют, и решить, как / когда / где их эффективно реализовать. Как я уже упоминал, в первую очередь нужно поискать на страницах руководства вашей системы, а также в журнале аудита. /var/log/audit/audit.log
. Чтобы найти сообщения об avahi, например, в файлах журнала, выполните:
# grep /usr/sbin/avahi /var/log/audit/audit.log
РЕДАКТИРОВАТЬ: чтобы отразить обновленный вопрос
msg=avc: denied { send_msg } for msgtype=method_return dest=:1.114
spid=731 tpid=14478 scontext=system_u:system_r:avahi_t:s0
tcontext=system_u:system_r:init_t:s0
В частности, вас должны заинтересовать следующие предметы:
system_dbusd_t
Тип SELinux:
$ man system_dbusd_selinux
avahi_t
Тип SELinux:
$ man avahi_selinux
avahi_exec_t
avahi_initrc_exec_t
файловые контекстыavahi_var_run_t
avahi_unit_file_t
Хорошо, я не уверен, что вы заметили эту последнюю часть avahi_exec_t
; и поскольку я не могу оставлять комментарии: / пока; вот соответствующая информация с самой страницы руководства:
SELinux определяет типы контекста файлов для avahi. Если вы хотите хранить файлы с этими типами по разным путям, вам нужно выполнить команду semanage, чтобы указать альтернативные метки, а затем использовать restorecon, чтобы поместить метки на диск.
semanage fcontext -a -t avahi_exec_t '/srv/avahi/content(/.*)?' restorecon -R -v /srv/myavahi_content Note: SELinux often uses regular expressions to specify labels that match multiple files. The following file types are defined for avahi: avahi_exec_t - Set files with the avahi_exec_t type, if you want to transition an executable to the avahi_t domain. Paths: /usr/sbin/avahi-daemon, /usr/sbin/avahi-autoipd, /usr/sbin/avahi-dnsconfd avahi_initrc_exec_t - Set files with the avahi_initrc_exec_t type, if you want to transition an executable to the avahi_initrc_t domain. avahi_unit_file_t - Set files with the avahi_unit_file_t type, if you want to treat the files as avahi unit content.
Перейти к Блог Дэна Уолша для более подробного обсуждения / информации о SELinux, в этом посте, в частности, упоминается
Переход процесса говорит, что когда процесс, запущенный как метка a_t, выполняет файл с меткой b_exec_t, он должен выполнять процесс как b_t. Примером этого может быть запуск службы httpd. В этом случае у нас есть unlimited_t, запускающий сценарий инициализации с меткой initrc_exec_t, а SELinux запускает процесс как initrc_t.
Кроме того, лучше всего продолжать изучать tvheadend
программа, а также управление SELinux. Вы можете создать индивидуальная политика как было предложено audit
сообщения журнала; что-то вроде:
# grep tvheadend /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
По крайней мере, до тех пор, пока не появятся лучшие решения и / или tvheadend
попадает в репозитории Fedora. Наконец, лучше взгляните на файл модуля (служебный файл), который вы создали для systemd
; проверьте на наличие ошибок, возможных дополнений и изменений.
Вы можете исправить это, используя audit2allow для создания настраиваемого модуля политики
audit2allow -M custom_avhi <file_containing_AVC-denied messages
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i custom_avhi.pp