У меня snmpd выполняет скрипт в /custom/location/myscript.sh. Если я отключу selinux, все будет хорошо. Если я включаю selinux, он перестает работать, и если я провожу audit2why, я вижу следующее:
type=AVC msg=audit(1371990300.064:23445): avc: denied { read open } for pid=21423 comm="snmpd" name="myscript.sh" dev=dm-0 ino=1046532 scontext=unconfined_u:system_r:snmpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
Was caused by:
Missing type enforcement (TE) allow rule.
You can use audit2allow to generate a loadable module to allow this access.
type=AVC msg=audit(1371990313.066:23446): avc: denied { read open } for pid=21425 comm="snmpd" name="myscript.sh" dev=dm-0 ino=1046532 scontext=unconfined_u:system_r:snmpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
Was caused by:
Missing type enforcement (TE) allow rule.
You can use audit2allow to generate a loadable module to allow this access.
Если я сделаю ls -Z / custom / location, я увижу следующее:
-rwxr-xr-x. root root unconfined_u:object_r:default_t:s0 myscript.sh
Поэтому мне нужно выполнить команду chcon-R для каталога. Я попытался:
chcon -R -u unconfined_u -r system_r -t snmpd_t /custom/location
Только чтобы получить следующую ошибку:
chcon: failed to change context of `myscript.sh' to `unconfined_u:system_r:snmpd_t:s0': Permission denied
Я также пытался использовать audit2allow для создания настраиваемой политики, но, похоже, это не сработало.
Я действительно не хочу отключать selinux. Может ли кто-нибудь помочь мне понять, как я могу разрешить snmpd читать из / custom / location?
Спасибо Брэд
Поскольку вывод был таким длинным, я немного усекаю его, но вот результаты поиска:
----
time->Sun Jun 23 08:27:13 2013
type=SYSCALL msg=audit(1371990433.731:23453): arch=c000003e syscall=189 success=no
exit=-13 a0=11760e0 a1=3e50616319 a2=1178ef0 a3=21 items=0 ppid=20865 pid=21434 auid=0
uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=3863 comm="chcon"
exe="/usr/bin/chcon" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=
(null)
type=AVC msg=audit(1371990433.731:23453): avc: denied { relabelto } for pid=21434
comm="chcon" name="scripts" dev=dm-0 ino=1046530
scontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
tcontext=unconfined_u:system_r:snmpd_t:s0 tclass=dir
----
time->Sun Jun 23 08:27:24 2013
type=SYSCALL msg=audit(1371990444.075:23454): arch=c000003e syscall=59 success=no
exit=-13 a0=7fdb8933c6d0 a1=7fdb8933c3a0 a2=7fff16ef1790 a3=1f items=0 ppid=18001
pid=21435 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none)
ses=3765 comm="snmpd" exe="/usr/sbin/snmpd" subj=unconfined_u:system_r:snmpd_t:s0 key=
(null)
type=AVC msg=audit(1371990444.075:23454): avc: denied { read open } for pid=21435
comm="snmpd" name="snmp.sh" dev=dm-0 ino=1046532
scontext=unconfined_u:system_r:snmpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0
tclass=file
----
Прежде всего, вам, вероятно, вообще не нужно писать собственный модуль.
Я бы поместил сценарий в одно из мест, где SELinux ожидает найти исполняемые файлы для начала, и только если это невозможно, используя вывод audit2allow
(и нет audit2why
, который дает дружеское сообщение, но менее полезно с точки зрения понимания реальной проблемы), я бы проанализировал отказ AVC.
Изменение контекста безопасности файла является привилегированной операцией, и вы не дали ни малейшего представления о том, с каким пользователем вы пытались выполнить эту команду. Использовать root
.
Учтите, однако, что правильнее не делать chcon
файл, потому что он не сохранится после переименования системы, но для использования semanage
чтобы добавить в путь контекст безопасности:
semanage fcontext -a type_enforcement "/path/expression(/.*)?"
Проверьте вывод semanage fcontext -l | less
для первого впечатления о том, как должно выглядеть выражение пути.
Для более глубокого понимания проблемы вам нужно знать, в каких контекстах snmpd
демону разрешен переход на. Вы можете найти помощь в seinfo
и sesearch
manpages.
Исходный код апстрима refpolicy
можно проверить, чтобы узнать, какая метка будет правильной для исполняемого файла, который должен быть прочитан snmpd_t
помеченный файл. Вероятно, лучшая идея - загрузить исходную политику, соответствующую версии политики, используемой в вашей ОС, с помощью диспетчера пакетов.
это - хороший ресурс для понимания функций различных файлов (особенно 5b), задействованных в модуле.
Сначала проверьте контексты файлов, определенные для этого модуля (это то, что вы найдете, используя semanage fcontext -l | grep snmp
, более или менее):
# cat refpolicy/policy/modules/contrib/snmp.fc
/etc/rc\.d/init\.d/((snmpd)|(snmptrapd)) -- gen_context(system_u:object_r:snmpd_initrc_exec_t,s0)
/usr/sbin/snmptrap -- gen_context(system_u:object_r:snmpd_exec_t,s0)
/usr/sbin/snmptrapd -- gen_context(system_u:object_r:snmpd_exec_t,s0)
/usr/share/snmp/mibs/\.index -- gen_context(system_u:object_r:snmpd_var_lib_t,s0)
/var/agentx(/.*)? gen_context(system_u:object_r:snmpd_var_lib_t,s0)
/var/net-snmp(/.*) gen_context(system_u:object_r:snmpd_var_lib_t,s0)
/var/lib/net-snmp(/.*)? gen_context(system_u:object_r:snmpd_var_lib_t,s0)
/var/lib/snmp(/.*)? gen_context(system_u:object_r:snmpd_var_lib_t,s0)
/var/log/snmpd\.log.* -- gen_context(system_u:object_r:snmpd_log_t,s0)
/var/run/net-snmpd(/.*)? gen_context(system_u:object_r:snmpd_var_run_t,s0)
/var/run/snmpd(/.*)? gen_context(system_u:object_r:snmpd_var_run_t,s0)
/var/run/snmpd\.pid -- gen_context(system_u:object_r:snmpd_var_run_t,s0)
Затем правила применения типа, определенные здесь (фрагмент):
# head -22 refpolicy/policy/modules/contrib/snmp.te
policy_module(snmp, 1.14.0)
########################################
#
# Declarations
#
type snmpd_t;
type snmpd_exec_t;
init_daemon_domain(snmpd_t, snmpd_exec_t)
type snmpd_initrc_exec_t;
init_script_file(snmpd_initrc_exec_t)
type snmpd_log_t;
logging_log_file(snmpd_log_t)
type snmpd_var_run_t;
files_pid_file(snmpd_var_run_t)
type snmpd_var_lib_t;
files_type(snmpd_var_lib_t)
И наконец, интерфейс (snmp.if
), файл.
Имея эту информацию под рукой, вам нужно выяснить, какой контекст будет правильным для snmpd
быть способным выполнять скрипт, а затем вручную добавьте правило контекста к пути, где будет исполняемый файл.