Назад | Перейти на главную страницу

Настройте selinux, чтобы разрешить snmpd читать в произвольном месте

У меня 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 быть способным выполнять скрипт, а затем вручную добавьте правило контекста к пути, где будет исполняемый файл.