como criar um rótulo personalizado do SELinux

11

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

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

Comecei a criar uma nova política baseada no SELinux: permitir que um processo crie qualquer arquivo em um determinado diretório

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

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

Pesquisei no Google e descobri que deveria usar um rótulo SELinux mais específico do que um tipo base, mas todos os exemplos online mostram rótulos existentes em httpd / nginx / etc.

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

Minha idéia é criar algo como myapp_var_t, use

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

e um .pparquivo personalizado que usará esse tipo personalizado

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

obrigado

Atualizar

Após mais pesquisas, acho que o termo adequado para o que quero fazer é criar um novo typesque me levou a https://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html#id3036916

que basicamente diz, corra

sepolgen /path/to/binary

e pude obter um modelo que eu possa compilar em um arquivo pp e carregar, ainda obter alguns erros, mas parece que estou mais perto do que quero fazer.

Se eu conseguir funcionar, atualizarei esta postagem

fmpwizard
fonte

Respostas:

11

Com o ponto de partida da corrida

sepolgen /path/to/binary

o que lhe dá:

app.fc
app.sh
app.if
app.spec
app.te

Para criar um novo SELinux file contextpara aplicar a um diretório pai que contém os arquivos que seu programa / daemon 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 o torna um tipo de arquivo (acontece que você não pode usar uma linha de contexto do processo app_exec_t em um arquivo ou diretório), consulte "Tipos de SELinux revisitados" para obter mais informações informação sobre os diferentes tipos

Depois de declarar o tipo, você precisa informar ao SELinux que seu aplicativo tem permissão para usá-lo. No meu caso, 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: permita que o tipo app_t, que é o domínio do meu aplicativo, escreva diretórios / search / etc com o contexto app_var_te crie / abra / exclua arquivos etc com o contexto app_var_t

A última parte do quebra-cabeça é dizer de alguma forma ao SELinux quais pastas e arquivos devem receber cada tipo; você faz isso editando o app.fcarquivo (fc => contexto do arquivo)

esse 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 implantado em meus servidores, portanto, esta recebe o contexto app_exec_t.

A segunda linha significa:

Aplique app_var_t ao diretório / srv / bot e também a todos os arquivos dentro do diretório / srv / bot

Observe como a primeira linha tem --entre o caminho e a chamada para gen_context. --significa, aplique isso apenas aos arquivos. no segundo caso, não temos nada (apenas espaços), o que significa que se aplica a todos os diretórios e arquivos correspondentes, o que eu queria, outra opção é ter -dque 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 .tearquivo, mas está fora do escopo desta pergunta.)

Material extra de leitura que me ajudou a chegar a esta solução:

Facilitando as coisas com sepolgen

Pense antes de auditar cegamente2M-meudomínio

SELinux PARA DESENVOLVEDORES DE CHAPÉU VERMELHO (PDF longo)

Um módulo SElinux (1): tipos e regras

Política de amostra (especialmente o postgresql)

Compreendendo os arquivos de contexto de arquivo

fmpwizard
fonte
Ou use CIL
Jakuje
sepolgen /path/to/binarycospe um erro de sintaxe para mim. Estou no RHEL 7.6. Eu acho que sepolgen --application /path/to/binaryé a sintaxe adequada se o seu objetivo é escrever uma política para uma aplicação específica?
Jayhendren
Seu .tearquivo também lança um erro de sintaxe para mim quando compilar o módulo: app.te:5:ERROR 'This block has no require section.' at token 'files_type' on line 5:. E se eu adicionar uma requireseção, recebo:ERROR 'syntax error' at token 'files_type' on line 13:
jayhendren
Desculpe, não tenho mais acesso a uma máquina Fedora para testá-la, mas pode ser que, desde a versão 24, eles tenham alterado a sintaxe.
Fmpwizard