Como fazer a transição para outro domínio ao invocar o sudo?

4

Eu tenho um daemon (collectd) que executa um script para coleta de dados (via smartctl).

O exec-plugin de collectd exige que scripts externos sejam executados sob um usuário! = root.

O plano é configurá-lo assim:

  • permite que o collectd altere o usuário e talvez execute o script (via SELinux)
  • crie um usuário do sistema X para a tarefa em questão
  • configure o sudo de forma que X tenha permissão para executar o smartctl
  • configura o SELinux de forma que a) sudo transita para um domínio (digamos) não delimitado b) o setuid para o usuário X (ou a execução do script) transita para um domínio não confinado

Eu descobri o último passo - porque senão não há transição, e eu tenho que permitir coletar todas as permissões de baixo nível relacionadas ao smartctl (por exemplo, sys_rawio, ioctl, execute_no_trans ...) - que eu quero evitar.

O Sudo parece fornecer atributos relacionados ao SELinux, por exemplo pode-se colocar na linha sudoer algo como:

TYPE=unconfined_t ROLE=unconfined_r

Mas sudo reclama:

sudo: unable to determine enforcing mode.: Permission denied
sudo: unable to execute /usr/sbin/smartctl: Permission denied

Como o TYPE / ROLE deve funcionar com o sudo (sob o CentOS 7)?

E sobre a rota b) - como configurar isso com um arquivo de política SELinux personalizado?

    
por maxschlepzig 14.12.2014 / 17:54

1 resposta

2

Você pode especificar uma transição em um arquivo de política personalizado ( .te ) assim:

module collectdlocalexec 1.0;

require {
        type collectd_t;
        type user_home_t;
        type unconfined_t;
        type shell_exec_t;
        class capability {setgid setuid };
        class file { execute read open };
        class process transition;
}

allow collectd_t self:capability { setgid setuid };
allow collectd_t user_home_t:file { execute read open };
allow collectd_t shell_exec_t:file execute;
allow collectd_t unconfined_t:process transition;

type_transition collectd_t user_home_t:process unconfined_t;

Supondo que o script de coleta esteja localizado no diretório base de um usuário (e que esteja marcado com user_home_t ).

    
por 14.12.2014 / 19:05

Tags