como criar um rótulo SELinux personalizado

6

Eu escrevi um serviço / aplicativo binário único que estou tentando rodar no Fedora 24, ele roda usando systemd, o binário é implementado em /srv/bot

esse serviço / aplicativo que eu escrevi precisa criar / abrir / ler e renomear arquivos nesse diretório.

Primeiramente, comecei a criar uma nova política baseada em SELinux: permite que um processo crie qualquer arquivo em um determinado diretório

mas quando meu aplicativo precisou renomear, a saída teve um aviso:

#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;

Eu pesquisei e descobri que deveria usar um rótulo SELinux mais específico do que um tipo base, mas todos os exemplos on-line mostram os rótulos existentes do httpd / nginx / etc.

Existe uma maneira de criar um rótulo personalizado apenas para meu próprio aplicativo?

Minha ideia é criar algo como myapp_var_t, use

semanage fcontext -a -t my_app_var_t '/srv/bot(/.*)?'
restorecon -R -v /srv/bot

e um arquivo .pp personalizado que usará esse tipo personalizado

Se houver uma maneira melhor de resolvê-lo, isso também funciona.

Obrigado

Atualizar

Depois de mais pesquisas, acho que o termo apropriado para o que eu quero fazer é criar um novo types que me levou a link

que basicamente diz, corra

sepolgen /path/to/binary

e eu consegui pegar um template que eu posso compilar em um arquivo pp e carregar, ainda recebo alguns erros mas parece que estou mais perto do que eu quero fazer.

Se eu funcionar, atualizarei este post

    
por fmpwizard 11.09.2016 / 03:21

1 resposta

5

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

Exemplo de política (especialmente o postgresql)

Entendendo os arquivos de contextos de arquivos

    
por 12.09.2016 / 06:50