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á.