SELinux: Como criar um novo tipo de arquivo

7

No RHEL / CentOS 7, estou tentando criar um novo contexto de segurança do SELinux para que os arquivos suportem um novo serviço que estou escrevendo.

Eu criei um arquivo de imposição de tipo para meu novo serviço, mas não consigo criar um novo tipo que o sistema reconhecerá como um tipo de arquivo.

Estou trabalhando com base neste O documento "Construindo um módulo de política local" do CentOS 5 , que me instrui a criar um arquivo TE, usa checkmodule e semodule_package para compilá-lo.

Se eu apenas escrever no meu arquivo TE:

type myservice_spool_t;

então o TE compila bem, mas quando eu tento semanage fcontext eu entendo isso:

$ sudo semanage fcontext -a -t myservice_spool_t "/var/spool/myservice(/.*)?" 
ValueError: Type myservice_spool_t is invalid, must be a file or device type

Eu li vários tutoriais, mas não consegui encontrar um exemplo que funcione - tudo o que eu vejo é:

  • desatualizado - por exemplo, Esta página de documentação do RHEL 4 SELinux diz que deve-se usar type myservice_spool_t, file_type; mas checkmodule diz: ERROR 'attribute file_type is not declared'
  • incompleto - por ex. esta resposta fará com que eu use a macro file_type() , mas checkmodule diz: ERROR 'This block has no require section.' at token 'files_type'
  • ou completamente ausente - por exemplo o novo guia do SELinux para o RHEL 7 não possui informações sobre como criar novas políticas, exceto usando audit2allow .

O site do projeto do SELinux é completamente inútil, pois não consegui localizar um único exemplo de trabalho

Eu aprecio um exemplo simples e conciso de como escrever um arquivo TE que introduz um novo tipo que semanage fcontext aprovará.

[Atualização]

Eu encontrei esta documentação do Gentoo para criar arquivos de política , com algumas explicações e exemplos úteis.

    
por Guss 02.10.2016 / 11:27

3 respostas

1

Eu descobri que o problema que eu estava tendo era porque eu não compilei o módulo corretamente. Como resultado, as macros provavelmente não "pegaram" e as mensagens de erro do compilador da política checkmodule realmente não ajudaram a entender isso.

Para que todas essas macros se expandam adequadamente, é necessário compilar a política usando os Makefiles fornecidos pelo SELinux - com um arquivo TE chamado myservice_spool.te, deve-se executar:

make -f /usr/share/selinux/devel/Makefile myservice_spool.pp

Isso criará um arquivo TE temporário com todas as macros expandidas e, em seguida, chamará os compiladores relevantes para criar myservice_spool.pp .

A documentação do Gentoo vinculada ao OP tem um pouco mais de informação, embora os caminhos dos arquivos não estejam corretos para os sistemas CentOS.

Se você revisar o modelo TE gerado no diretório tmp (que o makefile do SELinux deixa no local), você pode ver que "atributos" é de fato a maneira correta de manipular um tipo como um arquivo, mas devemos require para fazê-los funcionar - a maneira como os arquivos do SELinux TE parecem funcionar é que você não obtém nenhum símbolo magicamente importado para o arquivo de configuração - você precisa require de qualquer coisa que você usa.

Portanto, a maneira correta e não macro de configurar um novo tipo de arquivo é algo assim (copiado do modelo gerado pela TE):

type myservice_spool_t;
require {
    attribute spoolfile;
    attribute file_type, non_security_file_type, non_auth_file_type;
} # end require
typeattribute myservice_spool_t file_type, non_security_file_type, non_auth_file_type, spoolfile;
    
por 03.10.2016 / 08:30
2

Você precisa declará-lo como membro do atributo files de tal forma que ele tenha privilégios de reclassificação.

Tente

type myservice_spool_t;
files_type(myservice_spool_t)

Ou melhor no seu caso ...

type myservice_spool_t;
files_spool_file(myservice_spool_t)

Dado que você está realmente criando um arquivo de spool. Isso dá a outras macros a capacidade de trabalhar com esse spool se tiverem privilégios de 'gerenciar spool' em suas políticas.

    
por 02.10.2016 / 21:56
-1

link tem a resposta correta:

# Using the typeattribute statement to associate a type of
# setroubleshootd_exec_t to two attributes file_type and 
# non_security_file_type. 

# These are the previously declared attributes:
attribute file_type;
attribute non_security_file_type;

# The previously declared type:
type setroubleshootd_exec_t;

# These are the associations using the typeattribute statement:
typeattribute setroubleshootd_exec_t file_type, non_security_file_type;

Mas, sim, sua pergunta levanta um ponto interessante.

O SELinux conhece nativamente três idiomas, e há uma linguagem de abstração de terceiros chamada "Política de referência".

  1. Linguagem de política monolítica (checkpolicy é usado para compilar policy.conf - man checkpolicy)
  2. Linguagem de política do módulo (o checkmodule é usado para compilar $ MODULE. {te.fc} - man checkmodule)
  3. Common Intermediate Language (secilc é usado para compilar $ MODULE.cil - man secilc)

Cada uma das línguas nativas acima tem suas próprias propriedades específicas e pode ser confusa.

A política de referência é basicamente um invólucro em torno de "Linguagem de política do módulo" com o objetivo de facilitar a manutenção de políticas.

    
por 10.10.2016 / 12:38