Com o ponto de partida da execução
sepolgen /path/to/binary
que te dá:
app.fc
app.sh
app.if
app.spec
app.te
Para criar um novo SELinux file context
para aplicar a um diretório pai que contém arquivos que seu programa / daemon irá modificar, edite o arquivo app.te e adicione:
type app_var_t;
files_type(app_var_t)
A primeira linha declara o novo tipo e a segunda linha chama uma macro que faz alguma mágica e a transforma em um tipo de arquivo (não é possível usar uma linha de contexto do processo app_exec_t em um arquivo ou diretório), veja "Selinux Types Revisited" para mais informações sobre os diferentes tipos
Uma vez que você tenha declarado o tipo, você precisa dizer ao SELinux que seu aplicativo tem permissão para usá-lo, no meu caso eu adicionei
allow app_t app_var_t:dir { add_name remove_name write search};
allow app_t app_var_t:file { unlink create open rename write read };
Essas duas linhas basicamente dizem: permite que o tipo app_t que é o domínio do meu aplicativo, escreva / procure / etc diretórios com o contexto app_var_t
e permita que ele crie / abra / exclua / etc arquivos com o contexto app_var_t
A última parte do quebra-cabeça é de alguma forma dizer ao SELinux quais pastas e arquivos devem receber cada tipo, você faz isso editando o arquivo app.fc
(fc = > contexto do arquivo)
este arquivo tem apenas duas linhas no meu caso:
/srv/bot/app -- gen_context(system_u:object_r:app_exec_t,s0)
/srv/bot(/.*)? gen_context(system_u:object_r:app_var_t,s0)
a primeira linha aponta diretamente para o binário, conforme implementado em meus servidores, então este recebe o contexto app_exec_t.
A segunda linha significa:
Apply app_var_t to the directory /srv/bot and also to all files inside the dir /srv/bot
Observe como a primeira linha tem --
entre o caminho e a chamada para gen_context
. --
significa, aplique isso apenas em arquivos. no segundo caso não temos nada (apenas espaços), ou seja, aplica-se a todos os diretórios e arquivos correspondentes, que é o que eu queria, outra opção é ter -d
para aplicar apenas diretórios.
Agora tenho uma política de trabalho, posso implantar meu aplicativo com uma política personalizada e tudo funciona. (minha política tem muito mais entradas no arquivo .te
, mas está fora do escopo desta questão.)
Material de leitura extra que me ajudou a chegar a essa solução:
Facilitando as coisas com o Sepolgen
Pense antes de auditar apenas auditivamente2M mydomain
SELinux PARA DESENVOLVEDORES DE CHAPÉUS VERMELHOS (PDF Longo)
Um módulo do SElinux (1): tipos e regras