Introdução ao SELinux: Seu Primeiro Passo para Ler Logs de Negação

Introdução ao SELinux: Seu Primeiro Passo para Ler Logs de Negação

O Que é o SELinux?

SELinux (Security-Enhanced Linux) é um sistema de controle de acesso obrigatório (MAC) integrado ao kernel Linux. Ele adiciona uma camada extra de segurança sobre as permissões Unix padrão (DAC). Em sistemas RHEL, CentOS e Fedora, ele é habilitado por padrão -- bloqueando processos como Apache ou PostgreSQL de acessar arquivos que não deveriam tocar.

O padrão chmod / chown (DAC) apenas pergunta: "Este é o dono do arquivo? O processo está no grupo correto?" O SELinux adicionalmente impõe: "Este tipo de processo tem permissão de política para executar esta operação neste tipo de recurso?"

Modos de Operação

Modo Comportamento
Enforcing Violações de política são negadas e registradas. Modo normal de produção.
Permissive Violações são registradas mas não negadas. Use para solução de problemas.
Disabled SELinux completamente desligado. Requer reinicialização para alterar.

Mudar para Disabled requer editar /etc/selinux/config e reinicializar. Retornar ao Enforcing depois pode exigir uma re-rotulação completa do sistema de arquivos.

Como Verificar o Modo Atual

getenforce dá a resposta mais rápida. 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 execução) quanto Mode from config file (o que sobrevive a uma reinicialização).

Mudando para Permissive Temporariamente

setenforce altera o modo em tempo de execução sem reinicialização. A alteração reverte na próxima reinicialização.

$ sudo setenforce 0   # Mudar para Permissive
$ sudo setenforce 1   # Voltar para Enforcing

Regra prática para solução de problemas: Execute setenforce 0, depois reproduza o problema. Se ele desaparecer, o SELinux é o culpado. Volte para Enforcing imediatamente após confirmar.

Como Ler Logs de Negação AVC

Quando o SELinux bloqueia uma ação, ele registra uma entrada de log AVC (Access Vector Cache). O arquivo de log principal é /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 } Operação 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 é 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 rótulo user_home_t, por isso httpd_t não consegue lê-lo. O rótulo correto para conteúdo web é httpd_sys_content_t.

Filtrando Logs de Negação 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 últimos 10 minutos. --start today cobre desde a meia-noite.

Usando audit2why para Entender Negações

audit2why traduz entradas de log AVC em explicações em linguagem simples. Redirecione a saída 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 não existe regra de política concedendo este acesso.

audit2why explica a causa -- ele não corrige nada. Use audit2allow se precisar gerar um módulo de política, mas evite fazê-lo em produção sem entender completamente o que você está permitindo.

Padrões Comuns de Correção

Restaurar Contexto de Arquivo para o Padrão

Arquivos copiados de outro local frequentemente herdam o contexto errado. restorecon aplica o contexto padrão correto com base no caminho do arquivo na política 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-rotulação completa sobrescreverá esta alteração.

$ sudo chcon -t httpd_sys_content_t /var/www/html/app.conf

Ajustar Política com Booleans

Políticas SELinux incluem Booleans -- chaves liga/desliga nomeadas para comportamentos específicos. Por exemplo, para permitir que o Apache sirva arquivos de diretórios home de usuários:

# 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 segurança e quase nunca é a resposta certa.

Resumo: Checklist de Solução de Problemas

  1. getenforce -- confirme que o modo é Enforcing
  2. setenforce 0, reproduza o problema -- se ele desaparecer, o SELinux é a causa
  3. sudo ausearch -m AVC -ts recent | audit2why -- identifique a negação
  4. ls -Z -- verifique o contexto atual do arquivo
  5. restorecon -v para restaurar o contexto correto, ou setsebool para ajustar a política
  6. setenforce 1 -- volte para Enforcing

Nunca desabilite o SELinux como solução paliativa. A maioria dos problemas é resolvida corrigindo contextos de arquivo com restorecon ou habilitando o Boolean correto com setsebool.

Próximas Leituras