Permitir certo comportamento de risco de um único programa de maneira segura no SELinux

8

Eu tenho um programa em execução dentro de um contêiner do Docker que carrega um arquivo .so que altera o comportamento do programa por meio de gancho e manipulação de memória. Esse comportamento é bloqueado pelo SELinux com a seguinte mensagem no log de auditoria:

tipo = AVC msg = auditoria (1548166862.066: 2419): avc: negado {execheap} para pid = 11171 comm = "meuPrograma" scontext = system_u: system_r: container_t: s0: c426, c629 tcontext = system_u: system_r: system_r: container_t: s0: c426, c629 tclass = processo permissivo = 0

Eu sou extremamente hesitante em apenas fazer isso, audit2allowpois não quero permitir esse comportamento específico em nenhum outro lugar (pois isso seria bastante arriscado).

  • Como posso dizer ao SELinux para permitir esse comportamento específico da maneira mais segura possível?
  • Posso fazer isso de uma maneira que permita gerar mais contêineres Docker executando o mesmo programa no futuro?
Thomas
fonte

Respostas:

4

audit2allowprovavelmente gera uma regra para permitir execheappara container_tprocesso tipo. Você sempre pode gerar o módulo e inspecioná-lo antes de carregá-lo.

Um possível problema é que agora qualquer processo com o container_ttipo tem agora a mesma operação. Para evitar isso, é possível criar seu próprio tipo personalizado (usando container_tcomo modelo) e permitir apenas execheapesse tipo especial.

Este post de Dan Walsh explica como escrever essa política personalizada. Você também pode combinar isso com audit2allowpara gerar as regras reais. Os passos essenciais são:

  1. Crie uma política básica de contêiner, por exemplo container_execheap:

    policy_module(container_execheap, 1.0)
    
    virt_sandbox_domain_template(container_execheap_t)
    

    virt_sandbox_domain_templateA macro cria o novo tipo container_execheap_te cria as regras necessárias para a operação do Docker que o novo tipo pode ser usado como domínio de contêiner.

  2. Compile e carregue o módulo de políticas (os arquivos de desenvolvimento necessários, incluindo o makefile, devem ser fornecidos pelo selinux-policy-develpacote):

    make -f /usr/selinux/devel/Makefile container_execheap.pp
    semodule -i container_execheap.pp
    

    O novo tipo pode ser configurado para ser um domínio permissivo:

    semanage permissive -a container_execheap_t
    

    Para domínios permissivos, as negações do AVC são registradas, mas as regras não são impostas. Dessa forma, é fácil gerar as regras ausentes posteriormente audit2allow.

  3. Execute seu contêiner neste novo contexto, algo como docker run ... --security-opt label:type:container_execheap_t ...

  4. Gere erros esperados. Em seguida, execute audit2allowpara gerar regras que permitam essas operações container_execheap_t. Você pode atualizar o mesmo .tearquivo de módulo (lembre-se de aumentar o número da versão) com as novas regras. Compile e instale o módulo atualizado.

  5. Quando não houver mais erros gerados, coloque o tipo de contêiner personalizado novamente no modo de imposição semanage -d container_execheap.

sebasth
fonte
Sua resposta parece ser o caminho a seguir - infelizmente, embora eu não tenha experiência em criar políticas do SELinux. Isso é o que eu descobri examinando a postagem do blog que você vinculou e outras documentações. Tenho a sensação de que não estou fazendo certo ... você poderia me ajudar apontando-me na direção certa? Minha política faz algum sentido?
Thomas
Obrigado, agora tenho algo que parece funcionar! Foi assim que acabei. No entanto, recebi vários erros relacionados a duplicatas durante o tempo de compilação, presumo que isso seja um problema nas políticas incluídas e não nas minhas? Também não sei ao certo por que a cadeia de caracteres dentro da instrução gen_require deve ser terminada com um 'em vez de um `(o último gerou um erro). De qualquer forma, obrigado novamente pela ajuda!
Thomas
Eu acho que é seguro ignorar esses erros específicos, veja bugzilla . Citar usando '' é como ele funciona na linguagem M4 , usada para escrever módulos de política de referência. Você pode verificar (usando ps axZetc.) se o contêiner é executado no contexto correto se desejar verificar novamente após instalar e configurar sua política personalizada.
sebasth