Introducao ao SELinux: Seu Primeiro Passo para Ler Logs de Negacao
O Que e o SELinux?
SELinux (Security-Enhanced Linux) e um sistema de controle de acesso obrigatorio (MAC) integrado ao kernel Linux. Ele adiciona uma camada extra de seguranca sobre as permissoes Unix padrao (DAC). Em sistemas RHEL, CentOS e Fedora, ele e habilitado por padrao -- bloqueando processos como Apache ou PostgreSQL de acessar arquivos que nao deveriam tocar.
O padrao chmod / chown (DAC) apenas pergunta: "Este e o dono do arquivo? O processo esta no grupo correto?" O SELinux adicionalmente impoe: "Este tipo de processo tem permissao de politica para executar esta operacao neste tipo de recurso?"
Modos de Operacao
| Modo | Comportamento |
|---|---|
| Enforcing | Violacoes de politica sao negadas e registradas. Modo normal de producao. |
| Permissive | Violacoes sao registradas mas nao negadas. Use para solucao de problemas. |
| Disabled | SELinux completamente desligado. Requer reinicializacao para alterar. |
Mudar para Disabled requer editar /etc/selinux/config e reinicializar. Retornar ao Enforcing depois pode exigir uma re-rotulacao completa do sistema de arquivos.
Como Verificar o Modo Atual
getenforce da a resposta mais rapida. sestatus fornece o panorama completo.
$ getenforce Enforcing
$ sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux mount point: /sys/fs/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 33
Verifique tanto Current mode (tempo de execucao) quanto Mode from config file (o que sobrevive a uma reinicializacao).
Mudando para Permissive Temporariamente
setenforce altera o modo em tempo de execucao sem reinicializacao. A alteracao reverte na proxima reinicializacao.
$ sudo setenforce 0 # Mudar para Permissive $ sudo setenforce 1 # Voltar para Enforcing
Regra pratica para solucao de problemas: Execute setenforce 0, depois reproduza o problema. Se ele desaparecer, o SELinux e o culpado. Volte para Enforcing imediatamente apos confirmar.
Como Ler Logs de Negacao AVC
Quando o SELinux bloqueia uma acao, ele registra uma entrada de log AVC (Access Vector Cache). O arquivo de log principal e /var/log/audit/audit.log.
type=AVC msg=audit(1748780400.123:1234): avc: denied { read } for pid=1122 comm="httpd" name="app.conf" dev="sda1" ino=56789 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
Campos-chave explicados:
| Campo | Significado | No exemplo acima |
|---|---|---|
denied { read } |
Operacao negada | acesso de leitura negado |
comm="httpd" |
Nome do processo | Apache |
name="app.conf" |
Nome do arquivo alvo | app.conf |
scontext=...httpd_t... |
Contexto de origem (processo) | tipo httpd_t |
tcontext=...user_home_t... |
Contexto do alvo (arquivo) | tipo user_home_t |
tclass=file |
Classe do recurso | arquivo regular |
permissive=0 |
Modo Enforcing ativo | realmente negado |
A causa raiz mais comum e uma incompatibilidade de tipos entre scontext e tcontext. Quando httpd_t tenta acessar um arquivo rotulado como user_home_t, o SELinux bloqueia. O arquivo deveria ser rotulado como httpd_sys_content_t.
Verificar o Contexto de um Arquivo
$ ls -Z /var/www/html/app.conf unconfined_u:object_r:user_home_t:s0 /var/www/html/app.conf
Este arquivo carrega o rotulo user_home_t, por isso httpd_t nao consegue le-lo. O rotulo correto para conteudo web e httpd_sys_content_t.
Filtrando Logs de Negacao com ausearch
Em vez de fazer grep diretamente em /var/log/audit/audit.log, use ausearch para filtragem eficiente.
# Negacoes AVC recentes (ultimos 10 minutos) $ sudo ausearch -m AVC -ts recent # Todas as negacoes AVC desde a meia-noite de hoje $ sudo ausearch -m AVC --start today # Filtrar por nome do processo $ sudo ausearch -m AVC -ts recent -c httpd # Filtrar por nome do arquivo $ sudo ausearch -m AVC --start today | grep "app.conf"
-ts recent cobre os ultimos 10 minutos. --start today cobre desde a meia-noite.
Usando audit2why para Entender Negacoes
audit2why traduz entradas de log AVC em explicacoes em linguagem simples. Redirecione a saida do ausearch para ele.
$ sudo ausearch -m AVC -ts recent | audit2why
type=AVC msg=audit(1748780400.123:1234): avc: denied { read } for pid=1122 comm="httpd" ...
Was caused by:
Missing type enforcement (TE) allow rule.
You can use audit2allow to generate a loadable module to allow this access.
"Missing type enforcement (TE) allow rule" significa que nao existe regra de politica concedendo este acesso.
audit2why explica a causa -- ele nao corrige nada. Use audit2allow se precisar gerar um modulo de politica, mas evite faze-lo em producao sem entender completamente o que voce esta permitindo.
Padroes Comuns de Correcao
Restaurar Contexto de Arquivo para o Padrao
Arquivos copiados de outro local frequentemente herdam o contexto errado. restorecon aplica o contexto padrao correto com base no caminho do arquivo na politica do sistema de arquivos.
# Restaurar um unico arquivo $ sudo restorecon -v /var/www/html/app.conf Relabeled /var/www/html/app.conf from unconfined_u:object_r:user_home_t:s0 to system_u:object_r:httpd_sys_content_t:s0 # Restaurar um diretorio recursivamente $ sudo restorecon -Rv /var/www/html/
Definir Contexto Manualmente com chcon
Use chcon para alterar o contexto de um arquivo temporariamente. Note que restorecon ou uma re-rotulacao completa sobrescrevera esta alteracao.
$ sudo chcon -t httpd_sys_content_t /var/www/html/app.conf
Ajustar Politica com Booleans
Politicas SELinux incluem Booleans -- chaves liga/desliga nomeadas para comportamentos especificos. Por exemplo, para permitir que o Apache sirva arquivos de diretorios home de usuarios:
# Listar Booleans atuais relacionados ao httpd $ getsebool -a | grep httpd # Habilitar um Boolean persistentemente (-P mantem apos reinicializacao) $ sudo setsebool -P httpd_enable_homedirs on
Prefira corrigir contextos de arquivo ou ajustar Booleans em vez de desabilitar o SELinux completamente. Desabilitar remove uma camada real de seguranca e quase nunca e a resposta certa.
Resumo: Checklist de Solucao de Problemas
getenforce-- confirme que o modo e Enforcingsetenforce 0, reproduza o problema -- se ele desaparecer, o SELinux e a causasudo ausearch -m AVC -ts recent | audit2why-- identifique a negacaols -Z-- verifique o contexto atual do arquivorestorecon -vpara restaurar o contexto correto, ousetseboolpara ajustar a politicasetenforce 1-- volte para Enforcing
Nunca desabilite o SELinux como solucao paliativa. A maioria dos problemas e resolvida corrigindo contextos de arquivo com restorecon ou habilitando o Boolean correto com setsebool.