Conforme visto no capítulo anterior, as permissões padrões do Linux (DAC) e SELinux (MAC) são ortogonais. Cada mecanismo usa seus próprios atributos de controle de acesso para realizar uma tarefa permitida, e as duas verificações são feitas primeiramente em relação ao DAC e depois ao MAC. Se um arquivo não tiver a permissão DAC suficiente para o acesso, o acesso será negado imediatamente e a verificação MAC não será realizada.
Política é um conjunto de regras que guia o motor do SELinux. Ela define tipos para objetos e domínios para processos, usa papéis para limitar os domínios, e possui identidades para especificar os papéis que podem ser atingidos por essas identidades. Políticas permitem a flexibilidade de configurar o sistema conforme o propósito, controlando o que cada programa pode fazer, e como programas interagem entre si, considerando o controle de acesso a arquivos, intercomunicação entre processos, etc.
Conforme visto no capítulo anterior, um tipo é uma forma de agrupar ítens baseados em sua semelhança em nível de fundamentos de segurança. Isso não necessariamente tem relação com o propósito de uma aplicação ou o conteúdo de um documento. Por exemplo, um objeto do tipo arquivo pode ter qualquer tipo de conteúdo e ser usado para qualquer propósito ou aberto por seu aplicativo relacionado (como um documento do open office, por exemplo), mas se ele pertence à um usuário e reside em seu diretório home, ele pertence a um tipo de segurança específico: user_home_t.
Esses tipos de objetos (arquivos na pasta home do usuário) recebem sua equivalência de segurança porque eles são acessíveis na mesma maneira pelo mesmo tipo de sujeitos. Da mesma maneira, processos tendem a ser do mesmo tipo se eles têm as mesmas permissões de outros sujeitos. Na política targeted, programas que rodam no domínio unconfined_t possuem um executável com um tipo como sbin_t. Da perspectiva do SELinux, isso significa que eles são equivalentes em termos do que eles podem e do que não podem fazer em um sistema.
Por exemplo, o objeto arquivo binário executável /usr/bin/postgres possui o tipo postgresql_exec_t. Todos os daemons alvos possuem seu próprio tipo *_exec_t para seus aplicativos executáveis. De fato, o conjunto inteiro de executáveis do PostgreSQL como createlang, pg_dump, and pg_restore são do mesmo tipo SELinux, postgresql_exec_t, e eles transitam para o mesmo domínio durante a execução, postgresql_t.
A política define várias regras que dizem como cada domínio pode acessar cada tipo. Somente o que é especificamente permitido pelas regras é autorizado. Por padrão, cada operação é negada e auditada, significando que é gerada uma entrada no log do sistema, como em /var/log/audit/audit.log, no Fedora Linux 8.
Na figura 3.1 está demonstrado um exemplo típico do uso de políticas SELinux para permitir transições entre domínios: o usuário joe se loga ao sistema, e tenta trocar a sua senha, que fica armazenada no arquivo /etc/shadow, que é do tipo shadow_t. Ao se logar, o usuário joe possui o contexto de segurança padrão user_t, para trocar a senha, executando o comando /bin/passwd, o processo transita ao domínio passwd_exec_t (permitido na regra 2 na política), e logo após o processo transita ao domínio passwd_t (regra 3 da política). Dessa forma é garantido que o único acesso que um usuário comum pode ter ao arquivo de senhas (/etc/shadow) é através da execução do binário /bin/passwd. No formato padrão DAC do Linux, o binário /bin/passwd possui a permissão set uid (r-s-x-x) que permite que qualquer usuário tenha permissão de super usuário (root, o dono do arquivo /bin/passwd) e possa executar qualquer tarefa com esse binário com essa permissão elevada. Ou seja, basta que o executável /bin/passwd tenha alguma vulnerabilidade conhecida pelo atacante, que ele pode ser explorado para elevação de privilégios de um usuário mal intencionado. Essa é a função das políticas SELinux, limitar o que cada programa pode fazer ou ter acesso.
A política é compilada para um formato binário para ser carregada no kernel do servidor de segurança, e para aumentar a performance, é realizado cache no AVC. Para visualizar as estatísticas de uso do cache do SELinux, é utilizado o comando avcstat:
A política pode ser administrativamente definida modificando arquivos existentes no código fonte da política ou adicionando-se arquivos TE (Type Enforcement) e arquivos de contexto à árvore da política.