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
getenforce-- confirme que o modo é Enforcingsetenforce 0, reproduza o problema -- se ele desaparecer, o SELinux é a causasudo ausearch -m AVC -ts recent | audit2why-- identifique a negaçãols -Z-- verifique o contexto atual do arquivorestorecon -vpara restaurar o contexto correto, ousetseboolpara ajustar a políticasetenforce 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.