O SELinux (Security-Enhanced Linux) é um mecanismo de controle de acesso obrigatório (MAC) que adiciona uma camada robusta de segurança aos sistemas Linux. Embora sua complexidade possa parecer intimidadora à primeira vista, uma compreensão básica de seus componentes e utilitários pode capacitar os administradores a gerenciar políticas de acesso com mais confiança. Este guia visa fornecer um rápido onboarding, focando na compreensão e aplicação prática dos conceitos do SELinux, em vez de na escrita detalhada de políticas.
Utilitários Essenciais do SELinux
Para interagir e gerenciar o SELinux, um conjunto de utilitários é indispensável. Os mais comuns incluem:
restorecon: Restaura o contexto de segurança de arquivos e diretórios para os valores definidos na política. É útil após alterações de caminho, cópias de arquivos, descompactação de arquivos ou quando a base de contextos recomendados é modificada.semanage: Permite gerenciar a política do SELinux sem a necessidade de recompilação. É usado para configurar portas, contextos de arquivos, booleanos (flags de configuração) e usuários. Por exemplo,semanage fcontext -a -t httpd_sys_content_t "/srv/web(/.*)?"define o contextohttpd_sys_content_tpara todos os arquivos em/srv/web.sesearch: Realiza consultas em todas as políticas SELinux ativas, permitindo visualizar regras aplicadas no sistema atual. É uma ferramenta valiosa para inspecionar fragmentos de arquivos.tee entender as permissões existentes.audit2allow: Gera regrasallowa partir de logs de negação (audit.log). Deve ser usado com cautela, pois converte falhas de segurança em permissões, o que pode enfraquecer a postura de segurança se não for devidamente analisado.sealert: Fornece relatórios detalhados e compreensíveis sobre negações AVC (Access Vector Cache), incluindo recomendações para resolução. É parte do pacotesetroubleshoot.
Compreendendo a Sintaxe e os Conceitos das Políticas do SELinux
As políticas do SELinux são compostas por módulos binários (.pp) carregados no kernel. Os arquivos fonte dessas políticas são escritos em linguagens como CIL ou usando macros M4. A base da política é definida em arquivos .te (Type Enforcement), que seguem o princípio do menor privilégio: tudo é proibido por padrão, e as regras allow concedem permissões mínimas necessárias.
- Contexto SELinux: Cada arquivo e processo no SELinux possui um contexto, geralmente no formato
user:role:type:level. Por exemplo,unconfined_u:object_r:user_home_t:s0. Otypeé o componente mais crucial para a aplicação das políticas. - Estrutura das Regras (
.tefiles): As regras seguem o padrãoallow <sujeito> <objeto>: <classe> { <ação_1>, <ação_2> };. Existem também outras regras comodontaudit(suprime logs de negação),auditallow(força logging de tentativas de acesso) eneverallow(proíbe a criação de regrasallowespecíficas em tempo de compilação). - Tipos: São identificadores para sujeitos e objetos, declarados com a palavra-chave
type(ex:type httpd_t;). - Atributos: Conjuntos nomeados de tipos, usados para simplificar a aplicação de regras a múltiplos tipos simultaneamente (ex:
attribute web_server_type; typeattribute httpd_t web_server_type;). - Classes: Representam categorias de objetos sobre os quais as ações podem ser realizadas (ex:
dir,file,process). Podem ser visualizadas comseinfo --class. - Macros: Conjuntos predefinidos de regras
allow, implementados através de interfaces M4 em arquivos.if. Elas simplificam a escrita de políticas complexas, comomanage_dirs_pattern(httpd_t, httpd_log_t, httpd_log_t). - Domínio: Um tipo ao qual são atribuídas as permissões necessárias para um processo. Para tornar um tipo um domínio, ele é associado a um macro específico ou ao tipo
domain.
Aplicação Prática: Permitindo Acesso do Podman a Arquivos
Um cenário comum é permitir que um contêiner (como o Podman) acesse arquivos do host. Embora o Podman utilize rótulos especiais (:z e :Z) para simplificar isso, vamos demonstrar o processo manual. Se um contêiner container_runtime_t tenta acessar um arquivo com o tipo user_home_t, ele pode ser bloqueado. Usando sesearch, podemos investigar as permissões do container_runtime_t para arquivos. Ao descobrir que o tipo container_file_t é mais permissivo, podemos alterar o contexto do arquivo ou diretório do host para container_file_t usando chcon (temporário) ou semanage fcontext seguido de restorecon (permanente). Após a alteração do contexto, o contêiner poderá acessar o arquivo, como demonstrado ao montar um volume e ler um arquivo de texto.
Dominar o SELinux envolve entender seus componentes e utilitários. Ao aplicar esses conceitos, administradores podem fortalecer significativamente a segurança de seus sistemas Linux, garantindo que apenas as operações necessárias sejam permitidas.





