Configure o selinux para permitir que o snmpd leia para um local personalizado

1

Eu tenho snmpd executando um script em /custom/location/myscript.sh. Se eu desabilitar o selinux tudo funciona bem. Se eu ativar o selinux, ele para de funcionar e, se eu fizer uma auditoria, vejo o seguinte:

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.

Se eu fizer um ls -Z / custom / location, vejo o seguinte:

-rwxr-xr-x. root root unconfined_u:object_r:default_t:s0 myscript.sh

Então eu preciso fazer um chcon-R no diretório. Eu tentei:

chcon -R -u unconfined_u -r system_r -t snmpd_t /custom/location

Apenas para obter o seguinte erro:

chcon: failed to change context of 'myscript.sh' to 'unconfined_u:system_r:snmpd_t:s0': Permission denied

Eu também tentei usar o audit2allow para criar uma política personalizada, mas isso não funcionou.

Eu realmente não quero desabilitar o selinux. Alguém pode me ajudar a entender como eu posso permitir snmpd a capacidade de ler / custom / location?

Obrigado Brad

Como a saída foi muito longa, estou truncando um pouco - mas aqui estão os resultados de ausearch:

----
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
----
    
por Brad 23.06.2013 / 14:42

1 resposta

1

Antes de mais nada, você provavelmente não precisa escrever um módulo personalizado .

Eu colocaria o script em um dos lugares em que o SELinux espera encontrar executáveis, para começar, e somente se isso não for possível, usando a saída de audit2allow (e não audit2why , o que dá a um ser humano amigável mensagem, mas é menos útil em termos de compreensão do problema real), eu analisaria a negação do AVC.

Alterar o contexto de segurança de um arquivo é uma operação privilegiada, e você não deu nenhuma pista sobre qual usuário você tentou executar esse comando. Use root .

Observe, no entanto, que a melhor coisa a fazer é não chcon do arquivo, porque isso não persistirá após uma nova etiqueta do sistema, mas usar semanage para adicionar um contexto de segurança ao caminho:

semanage fcontext -a type_enforcement "/path/expression(/.*)?"

Verifique a saída de semanage fcontext -l | less para uma primeira impressão sobre como deve ser uma expressão de caminho.

Para uma compreensão mais profunda do problema, você precisa saber a quais contextos o daemon snmpd pode migrar. Você pode encontrar ajuda nas páginas de manual seinfo e sesearch .

O código-fonte upstream do refpolicy pode ser verificado para saber o que seria o rótulo correto para um executável ser lido por um arquivo rotulado snmpd_t . Uma ideia provavelmente melhor é fazer o download da política de origem que corresponde à versão da política em uso no seu sistema operacional usando o gerenciador de pacotes.

Este é um bom recurso para entender a função dos diferentes arquivos (esp. 5b) envolvidos em um módulo.

Primeiro, verifique os contextos de arquivo definidos para este módulo (isso é o que você encontrará usando semanage fcontext -l | grep snmp , mais ou menos):


# 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)

Em seguida, as regras de aplicação de tipo definidas aqui (snippet):


# 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)

E finalmente, a interface ( snmp.if ), arquivo.

Com essas informações em mãos, você precisa descobrir qual seria o contexto correto para que snmpd fosse capaz de executar um script e, em seguida, adicionar manualmente uma regra de contexto ao caminho onde o executável será.

    
por 23.06.2013 / 15:09

Tags