proíbe usuário SELinux (root) não-confinado de instalar política em um sistema

2

Estou tentando escrever uma política do SELinux que, após sua instalação, proibirá a instalação de diretivas do SELinux por um usuário não delimitado (ou outro, que possa ser escolhido). Parece que há poucas maneiras de fazer isso:

  1. proibir o uso do semodule para que o usuário não possa instalar nenhuma política. semodule tem o tipo SELinux "semanage_exec_t". Eu estou usando objeto transição de domínio aqui.
  2. com o uso da classe de segurança do SELinux.

Quanto à primeira conclusão, estou tentando usar a macro "domain_auto_trans", mas isso macro não funciona para policyversion abaixo de 25 . Eu tenho 24. Embora eu fosse capaz de verificá-lo no policyversion 28 e funcionou conforme necessário. pela maneira como se parece com isso

    policy_module(semanage_access_deny_label_B, 1.0.0)
    require {
       type unconfined_t, semanage_exec_t, semanage_t;
       role object_r;
    }
    domain_auto_trans (unconfined_t, {semanage_exec_t semanage_t}, user_t);

O arquivo TE para a segunda conclusão é assim

policy_module(semanage_access_deny, 1.0.0)
require {
   type unconfined_t;
   role object_r;
   class security { compute_av compute_user compute_relabel 
   compute_create setenforce check_context load_policy setbool };
}
allow unconfined_t self: security compute_user;
neverallow unconfined_t self: security { compute_av setenforce check_context load_policy setbool };

A 1ª maneira funciona apenas na versão atual do SELinux e a 2ª, apesar de ser compilada e aplicada com sucesso, não faz o que eu planejava fazer (na verdade, ela não faz absolutamente nada). Portanto, a questão é como escrever uma política que, após sua instalação, proibirá qualquer instalação de política SELinux subsequente para quaisquer usuários escolhidos e funcionará nas versões atuais e anteriores do SELinux?

    
por Dmitriy Kormulev 26.06.2018 / 09:50

2 respostas

0

Seu primeiro módulo tem um problema: o usuário root em unconfined_t ainda tem permissões e regras em vigor, permitindo modificações na política do selinux. Sua política personalizada aplica apenas novas transições automáticas para semanage_exec_t para user_t . O processo no domínio user_t não pode modificar a política, portanto, semodule , semanage , etc. falha. No entanto, qualquer programa no domínio não confinado ainda pode modificar a política. Além disso, o root poderia apenas rotular novamente os binários com rótulo semanage_exec_t para qualquer tipo não confinado para executá-los.

Seu segundo módulo de política não faz nada porque as regras nunca permitir são compiladas verificado e não resultar em nenhuma regra na política compilada. Você não pode usar neverallow para remover / blacklists regras já incluídas na política carregada (e não há uma declaração deny na linguagem de política do SELinux que você possa usar dessa maneira) .

A compilação de diretivas deve emitir um erro e falhar se houver regras allow allow e neverallow . De acordo com a documentação , as regras neverallow podem ser usadas em módulos de política, mas para as verificações para serem efetivas expand-check devem ser definidas como 1 em semanage.conf (possivelmente a razão pela qual seu módulo foi compilado com sucesso).

Algumas maneiras de abordar seu problema para impedir modificações na política carregada do SELinux:

  • Use secure_mode_policyload booleano:

    Boolean to determine whether the system permits loading policy, setting enforcing mode, and changing boolean values.

    Da mesma forma, secure_mode_insmod booleano impedirá o carregamento adicional módulos do kernel. Estes booleanos não podem ser desligados no sistema em execução, uma vez ligado (reinicialização necessária para desligar).

  • Configure usuários para domínios mais confinados (como user_t ), que não permite modificar a política carregada. Mudar para root com su / sudo não será elevado para o usuário SELinux mais privilegiado e manterá as mesmas restrições impostas pelo SELinux.

  • Crie seu próprio usuário do SELinux. Você pode basear-se em um usuário do SELinux fornecido pela sua distribuição (faça o download das fontes de política da sua distribuição). Você provavelmente deve considerar usar algum usuário confinado como modelo em vez de usuário não confinado e apenas adicionar permissões necessárias para permitir a não concessão de permissões excessivamente amplas.

    Além disso, se você só precisa conceder acesso limitado (transições / regras), pode escrever um módulo de política que conceda o acesso necessário ao usuário limitado.

por 26.06.2018 / 13:34
0

Quando se trata de "instalar" nova política, resume-se a restringir o acesso a quem pode "escrever" e "reencaminhar" ficheiros /etc/selinux/TYPE/policy/policy.*.

Determine o tipo desse alvo. Use o conjunto de análise de políticas do SELinux para determinar o que pode "gravar" e "voltar a marcar" esse tipo de arquivo. Em seguida, certifique-se de que, seja qual for o processo em que você não queira instalar a política, não terá esse acesso (direta ou indiretamente) a esse tipo de arquivo.

Além disso, provavelmente você também desejará ter certeza de que os processos em que você não deseja instalar a diretiva não tenham acesso a "security setenforce" e não tenham acesso físico. Porque senão esses processos poderiam apenas contornar o SELinux.

    
por 26.06.2018 / 17:33