Introducao ao SELinux: Seu Primeiro Passo para Ler Logs de Negacao

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

  1. getenforce -- confirme que o modo e Enforcing
  2. setenforce 0, reproduza o problema -- se ele desaparecer, o SELinux e a causa
  3. sudo ausearch -m AVC -ts recent | audit2why -- identifique a negacao
  4. ls -Z -- verifique o contexto atual do arquivo
  5. restorecon -v para restaurar o contexto correto, ou setsebool para ajustar a politica
  6. setenforce 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.

Proximas Leituras