Por que minhas transições de domínio não ocorrem quando o binário do aplicativo está fora dos diretórios binários stardard?

2

Estou tentando configurar uma política SELinux personalizada, mas estou tendo problemas para fazer com que as transições de domínio ocorram quando o binário do aplicativo está fora dos diretórios binários padrão, como /bin , /usr/bin , É necessário que o binário da aplicação esteja localizado fora desses diretórios.

Para fins de teste, tenho um programa que simplesmente imprime o domínio SELinux atual. Eu tenho um domínio my_domain_t e um tipo my_domain_exec_t . Uma transição para my_domain_t é configurada para ocorrer quando um processo no domínio unconfined_t executa um arquivo com o contexto my_domain_exec_t .

Se eu copiar o binário de teste para o diretório /data , definir seu contexto e executá-lo, o domínio não será alterado.

$ cp getcontext /data/getcontext
$ chcon -t my_domain_exec_t /data/getcontext
$ /data/getcontext
unconfined_t:unconfined_r:unconfined_t:s0-s0:c0.c1023

Se, em vez disso, copiar o binário de teste para o diretório /usr/bin , definir seu contexto e, em seguida, executá-lo, a transição de domínio ocorrerá corretamente.

$ sudo cp getcontext /usr/bin/getcontext
$ sudo chcon -t my_domain_exec_t /usr/bin/getcontext
$ /usr/bin/getcontext
unconfined_t:unconfined_r:my_domain_t:s0-s0:c0.c1023

Por meio de testes, acredito ter eliminado qualquer coisa relacionada ao usuário que está executando os arquivos, à propriedade dos arquivos ou ao contexto de segurança do diretório pai. O que mais poderia estar causando essa diferença?

Editar: /data não é montado por NFS. O contexto de /data é system_u:object_r:default_t:s0 . Em outro sistema em que estive testando, também vi /data rotulado system_u:object_r:etc_runtime_t:s0 .

policy_module(my_domain, 1.0.0)

require {
    type unconfined_t;
}

type my_domain_t;
type my_domain_exec_t;

role unconfined_r types my_domain_t;

allow unconfined_t my_domain_exec_t:file *;
allow my_domain_t my_domain_exec_t:file { rx_file_perms() };

allow unconfined_t my_domain_t:process { transition siginh setexec };
type_transition unconfined_t my_domain_exec_t: process my_domain_t;

Essa é a mais simples das quase 20 versões da política que criei e exibe o comportamento descrito. Também testei as macros domain_trans , domain_auto_trans e domain_entry_file , além de gerar a política com a ferramenta sepolgen , que usava a macro domtrans_pattern .

    
por Grammin 24.06.2014 / 19:31

1 resposta

2

O SElinux não se importa muito com os caminhos dos arquivos.

Não consigo duplicar seu problema. Eu estou usando um staff_r role e staff_t type no Fedora 20, mas isso parece replicar efetivamente o seu problema.

Meu programa:

#include <stdio.h>
#include <stdlib.h>
#include <selinux/selinux.h>

int main() {
  security_context_t con;

  if (getcon(&con) < 0) {
    perror("Cannot getcon");
    return 1;
  }

  printf("%s\n", con);
  freecon(con);

  return 0;
}

Minha política.

policy_module(getcon, 1.0.0)

require {
  role staff_r;
  type staff_t;
}

## Type defs
type getcon_exec_t;
type getcon_t;
application_domain(getcon_t, getcon_exec_t)

## Role permits
role staff_r types getcon_t;

## Transitions
domain_auto_transition_pattern(staff_t, getcon_exec_t, getcon_t);

## Access vectors
allow getcon_t staff_t:process sigchld;

userdom_use_inherited_user_ptys(getcon_t);

Para compilar o programa:

gcc -o getcon getcon.c -lselinux

Para compilar e carregar a política:

make -f /usr/share/selinux/devel/Makefile load

Correndo sem alterar o contexto

$ ./getcon
staff_u:staff_r:staff_t:s0-s0:c0.c1023

Alterando o contexto:

# chcon -t getcon_exec_t getcon
$ ./getcon
staff_u:staff_r:getcon_t:s0-s0:c0.c1023

Alterando o diretório pai para default_t:

# chcon -t . default_t; chcon -t getcon_exec_t getcon
$ ./getcon
staff_u:staff_r:getcon_t:s0-s0:c0.c1023

Você pode tentar usar minha política como base, se quiser. Mas isso não parece me afetar.

    
por 24.06.2014 / 23:02

Tags