SELinux: permite que um processo crie qualquer arquivo em um determinado diretório

4

Eu tenho um script que, quando invocado, fará com que o conteúdo de dmesg seja gravado em um arquivo, com o nome do arquivo sendo basicamente um timestamp. O SELinux impede isso. Seguindo o conselho do aplicativo de solução de problemas SELinux do Fedora, eu tentei:

grep dmesg /var/log/audit/audit.log | audit2allow -M mypol

semodule -i mypol.pp

No entanto, isso parece não funcionar, provavelmente porque o nome do arquivo que está criando é diferente a cada vez. Então, como eu digo ao SELinux para permitir que dmesg crie (e escreva para) qualquer arquivo em um determinado diretório? Ou diga que o script em questão (e todos os processos que ele gera) pode fazer isso?

    
por Matthew Cline 29.08.2013 / 01:26

2 respostas

1

Você precisa aprender como filtrar as negações de AVC e como escrever um módulo de política personalizado para permitir o acesso a uma ação específica (você, neste caso, script).

Eu começaria removendo o módulo inserido acima para começar um novo:

# semodule -r mymodule.pp

Depois, execute seu script:

# date && ./my_script.sh

A invocação de date é útil para filtrar negações de AVC com base no registro de data e hora.

Em seguida, use o método usual para depurar as negações do AVC, que faz uso do comando ausearch(8) :

# ausearch -m avc -ts $timestamp | audit2allow

Verifique a página de manual para mais informações sobre os switches que você pode usar, especificamente o -ts flag.

Com essas informações, você saberá o que está sendo negado com base na política existente.

Agora, você deve determinar se concederá ou não esse acesso. Vamos supor que você queira conceder acesso. Você precisaria criar um módulo de política personalizado descrevendo as regras que definem o acesso que você deseja conceder. Isso é mais ou menos simples, dependendo da complexidade do seu script:

# ausearch -m avc -ts 10:40:00 | audit2allow -m my_script > my_script.te

Isso produzirá uma descrição type enforcement .

Você deve revisar o código para garantir a correção e compilar o código type enforcement em module :

# checkmodule -M -m -o my_script.mod my_script.te

O módulo deve ser empacotado em policy package para que você possa carregá-lo e descarregá-lo à vontade:

# semodule_package -o my_script.pp -m my_script.mod

Agora, você pode carregar a política usando:

# semodule -i my_script.pp

Verifique se está corretamente carregado:

# semodule -l | grep my_script

Em seguida, tente acionar as negações novamente e veja se há mais alertas (diferentes) no registro de auditoria referentes a esse mesmo processo.

Outras edições do código type enforcement precisarão que o version ( 1.0 ) seja atualizado ou o carregamento do pacote falhará. Depois de compilado e empacotado, a atualização do policy package é feita:

# semodule -u my_script.pp

Há muito a aprender quando se inicia com o SELinux. Algumas referências úteis:

  • As páginas de manual dos comandos.
  • Verifique também a saída de apropos selinux .

A partir dos documentos do RHEL

Uma boa apresentação introdutória de Dave Quigley:

por 15.09.2013 / 16:09
1

Você pode executar semanage permissive -a dmesg_t . Então /bin/dmesg , cujo tipo é dmesg_t , será executado no modo permissivo. Será permitido o acesso, mas o SELinux ainda gerará mensagens AVC.

    
por 03.09.2013 / 09:38