Rocky Linux / SELinux: modos Enforcing, Permissive e Disabled

No Rocky Linux, use setenforce para alternar temporariamente entre os modos Enforcing e Permissive do SELinux (Security-Enhanced Linux), quando ele já está habilitado. Para investigar uma falha, prefira uma comparação breve em Permissive e corrija a causa; desativar completamente o SELinux elimina sua aplicação de políticas e os registros de negação correspondentes.

Os exemplos exigem privilégios administrativos para as mudanças e devem corresponder ao serviço e à política instalados. A seção de desativação completa segue o procedimento documentado para RHEL 9 e exige conferir a versão real do Rocky, o gerenciador de boot e o acesso ao console.

Consultar o modo atual e a configuração de boot

getenforce informa o estado atual. sestatus detalha, entre outros itens, o modo atual, o modo no arquivo de configuração e a política carregada. Esses valores podem ser diferentes quando existe uma mudança pendente para o próximo boot.

getenforce
sestatus
Estado ou modo Significado
Enforcing Aplica a política e bloqueia operações não permitidas. É o modo normal de proteção para produção.
Permissive Mantém a política carregada e registra negações sem impor esses bloqueios. Serve para diagnóstico controlado.
Disabled Não carrega a política; não há bloqueios nem registros AVC do SELinux. Objetos criados nesse estado podem ficar sem rótulos adequados.

Permissive não remove as permissões tradicionais de arquivos, as regras de firewall ou outras verificações de acesso. Uma falha nessas camadas pode continuar ocorrendo mesmo sem bloqueio do SELinux.

Usar Permissive temporariamente e voltar a Enforcing

Alterar somente o modo em execução

Se o SELinux estiver habilitado, o comando seguinte deve fazer getenforce mostrar Permissive. Reproduza apenas a operação necessária ao diagnóstico e registre o resultado.

sudo setenforce 0
getenforce

setenforce não grava o modo permanente. No próximo boot, o resultado depende do arquivo de configuração e dos argumentos do kernel; não há garantia de voltar a Enforcing se eles já determinarem outro estado. O comando também não habilita um SELinux que está Disabled.

Retornar à aplicação da política

Concluída a comparação e corrigida a causa, volte a aplicar a política e confira se o retorno é Enforcing:

sudo setenforce 1
getenforce

Teste novamente o serviço e examine os logs. Uma melhora em Permissive sugere relação com a política, mas não identifica sozinha qual regra precisa mudar. Ajuste o contexto, o booleano ou o tipo de porta adequado em vez de deixar o servidor permanentemente sem aplicação da política.

Investigar negações e corrigir rótulos de arquivos

Consultar registros AVC recentes

AVC significa Access Vector Cache. Os registros de negação ajudam a relacionar processo, objeto, contexto e permissão solicitada à falha observada.

sudo ausearch -m AVC,USER_AVC -ts recent

Reproduza o problema e compare os horários. Se não houver registros, isso não prova que o SELinux esteja fora da investigação: confira o intervalo pesquisado, o estado de auditoria e a disponibilidade dos logs. Se ausearch não existir, verifique o pacote audit e o serviço auditd. Não transforme automaticamente toda negação em uma regra permissiva.

Registrar e aplicar um contexto de arquivo

O contexto de segurança é um rótulo associado ao objeto. Antes de mudar um diretório, consulte seus rótulos com ls -Zd /srv/www e os padrões com matchpathcon /srv/www, adaptando o caminho. O exemplo seguinte registra conteúdo web em /srv/www e aplica o padrão recursivamente:

sudo semanage fcontext -a -t httpd_sys_content_t '/srv/www(/.*)?'
sudo restorecon -Rv /srv/www

Use somente se esse for realmente o diretório de conteúdo do serviço e o tipo httpd_sys_content_t corresponder ao uso pretendido. Esse tipo não é uma autorização geral de escrita para a aplicação. As permissões tradicionais dos diretórios e arquivos continuam necessárias.

A referência semanage fcontext descreve o mapeamento persistente, e o manual do restorecon explica sua aplicação. É possível examinar mudanças antes com sudo restorecon -nRv /srv/www. Verifique também regras locais já existentes; uma regra duplicada pode exigir revisão com -m, não uma nova adição indiscriminada.

No Rocky Linux, semanage costuma ser fornecido por policycoreutils-python-utils; confira o pacote na versão instalada. Para desfazer uma regra local nova deste exemplo, remova exatamente '/srv/www(/.*)?' com sudo semanage fcontext -d '/srv/www(/.*)?' e reaplique restorecon nesse caminho. Se havia uma regra anterior, restaure seus valores registrados em vez de simplesmente apagá-la.

Ajustar booleanos e tipos de porta

Ativar uma função prevista pela política

Um booleano é uma opção de política com valor ligado ou desligado. Consulte o valor anterior e o significado antes de decidir. No exemplo, a segunda linha habilita conexões de rede para o domínio HTTP conforme a política instalada; ela não limita o acesso a um único destino.

getsebool -a | grep httpd
sudo setsebool -P httpd_can_network_connect on

-P torna o valor persistente, como explica o manual do setsebool. Execute essa alteração apenas se a função for necessária. Depois confira getsebool httpd_can_network_connect e o comportamento do serviço. Para desfazer, reaplique com -P o valor anterior registrado; se era off, use sudo setsebool -P httpd_can_network_connect off.

Associar uma porta ao serviço

Um serviço em porta diferente da padrão pode precisar de um tipo de porta adequado no SELinux. Isso é independente de abrir a rede no firewall, conforme a configuração de zonas, serviços e portas do firewalld.

sudo semanage port -l | grep http_port_t
sudo semanage port -a -t http_port_t -p tcp 8088

O exemplo associa TCP 8088 ao tipo http_port_t; ele não altera a configuração de escuta do servidor web nem abre o firewall. A primeira consulta filtra apenas esse tipo. Antes da adição, examine também a lista completa de sudo semanage port -l, pois 8088 pode pertencer a outro tipo ou intervalo.

A referência semanage port distingue adicionar, modificar e remover. Se a porta já existe, não troque seu tipo com -m sem conferir os serviços dependentes. Para desfazer somente uma adição local nova deste exemplo, use sudo semanage port -d -p tcp 8088; se modificou um mapeamento existente, restaure o tipo anterior. Confira a política, a escuta e o acesso real ao serviço separadamente.

Manter Permissive após o próximo boot

Para uma investigação que precise continuar após reiniciar, configure SELINUX=permissive em /etc/selinux/config. Antes do bloco, confira se há uma única linha ativa SELINUX=. Se /etc/selinux/config.backup já existir, preserve-a e escolha outro destino na primeira linha para não sobrescrever o backup anterior.

sudo cp -a /etc/selinux/config /etc/selinux/config.backup
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
grep '^SELINUX=' /etc/selinux/config

Execute uma linha por vez e só prossiga se o backup terminar corretamente. A última consulta deve mostrar SELINUX=permissive. Se não houver a linha esperada ou houver duplicatas, revise o arquivo antes de continuar. Não altere SELINUXTYPE como parte dessa mudança de modo.

O arquivo define a configuração para o boot; o estado atual continua separado e pode ser alterado por setenforce se o SELinux estiver habilitado. Argumentos como selinux=0 e enforcing=0 também afetam a inicialização. Registre e confira ambos os lugares antes de planejar a reinicialização.

Desativar completamente e reativar com cuidado

Conferir versão e desativação pelo kernel

A desativação completa tem implicações diferentes do modo Permissive. O procedimento oficial do RHEL 9 para estados e modos do SELinux utiliza selinux=0. Não trate a edição de SELINUX=disabled como uma receita idêntica para todas as versões do Rocky.

cat /etc/rocky-release
rpm -q grubby
cat /proc/cmdline
sudo grubby --info=ALL

A presença do pacote grubby não basta: confirme que ele gerencia as entradas de boot deste sistema. Registre a configuração e os argumentos de cada entrada, preserve backups e teste o console. O próximo comando afeta todas as entradas gerenciadas por ALL; não o aplique se houver políticas diferentes entre kernels sem um plano específico para cada entrada.

sudo grubby --update-kernel ALL --args selinux=0

Após a reinicialização planejada, confira getenforce e cat /proc/cmdline. O resultado esperado desta desativação é Disabled, com selinux=0 na linha efetiva. Não há bloqueio nem auditoria AVC do SELinux nesse estado; os demais mecanismos de auditoria do sistema são uma questão separada.

Reativar primeiro em Permissive e planejar a rotulagem

Arquivos criados enquanto o SELinux estava desativado podem estar sem rótulos corretos. Antes de exigir Enforcing, prepare a política e os utilitários, mantenha backups de dados e regras locais e planeje a manutenção pelo console. O relabeling reaplica os contextos e pode demorar; não interrompa o procedimento sem avaliar o estado do sistema.

  1. Prepare SELINUX=permissive no arquivo de configuração e confira a linha gravada.
  2. Somente se as entradas forem uniformes e os argumentos tiverem sido adicionados por esta mudança, use o bloco abaixo para remover a desativação e preparar o primeiro boot em Permissive. Se existiam valores anteriores ou políticas diferentes por entrada, restaure-os individualmente conforme o registro original.
sudo grubby --update-kernel ALL --remove-args selinux
sudo grubby --update-kernel ALL --args enforcing=0
  1. Reinicie com o console de recuperação disponível. Aguarde qualquer rotulagem automática e confirme com getenforce que o estado efetivo é Permissive. Se continuar Disabled, pare e investigue os argumentos efetivos e a política antes de prosseguir.
  2. Já em Permissive, execute sudo fixfiles -F onboot para agendar a rotulagem forçada no boot seguinte. O manual do fixfiles explica o agendamento. Reinicie na manutenção planejada e aguarde a conclusão.
  3. Confira serviços, contextos e AVCs ainda em Permissive. Corrija somente o necessário. Depois configure SELINUX=enforcing, remova apenas o argumento enforcing=0 que este procedimento introduziu e use sudo setenforce 1 para aplicar o modo atual.
  4. Verifique getenforce, sestatus, os argumentos de boot e os serviços, inclusive após a próxima reinicialização planejada. A configuração deve proteger tanto a execução atual quanto o próximo boot.

O nome selinux em --remove-args identifica o parâmetro a remover; por isso a comparação com os valores anteriores é essencial. O bloco não é um mecanismo universal de recuperação para qualquer bootloader ou política de produção.

Seguir uma ordem de diagnóstico verificável

  1. Confirme o modo atual e as configurações de boot com getenforce e sestatus.
  2. Examine logs do serviço, permissões tradicionais e firewall.
  3. Se necessário, faça uma comparação curta em Permissive e reproduza a falha.
  4. Relacione os AVCs à operação, ao processo e ao objeto envolvidos.
  5. Corrija o contexto, o booleano ou o tipo de porta no menor escopo necessário, guardando os valores anteriores.
  6. Volte a Enforcing e repita a operação, verificando os logs e o funcionamento.

O guia de SELinux do Rocky Linux, em espanhol reúne os fundamentos de modos, contextos, booleanos e investigação de falhas.