Gerenciar Contextos de Arquivo SELinux para Apache no Linux

CompTIABeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como gerenciar contextos de arquivo do SELinux para garantir que serviços como o servidor web Apache possam acessar os arquivos necessários. Você explorará como o Security-Enhanced Linux (SELinux) aplica rótulos de segurança, conhecidos como contextos, aos arquivos e como contextos incompatíveis podem levar a erros de negação de acesso, mesmo quando as permissões padrão de arquivo parecem corretas. Esta experiência prática foi projetada para desenvolver suas habilidades na resolução de problemas comuns de segurança em um ambiente Linux.

Ao longo das etapas, você instalará o Apache, verificará se o SELinux está no modo enforcing e observará o contexto padrão de uma página web posicionada corretamente. Em seguida, você provocará intencionalmente um erro "Forbidden" (Proibido) ao mover um arquivo com um contexto incorreto para o diretório raiz da web. Para resolver isso, você usará o comando chcon para rotular novamente o arquivo, demonstrando um método fundamental para corrigir problemas relacionados ao contexto do SELinux e restaurar a funcionalidade do serviço.

Instalar o Apache e Verificar se o SELinux está em Modo Enforcing

Nesta etapa, você começará garantindo que seu ambiente esteja configurado corretamente. Isso envolve verificar se o Security-Enhanced Linux (SELinux), um módulo de segurança crítico no kernel do Linux, está operando no modo enforcing. Em seguida, você instalará o servidor web Apache, que será usado ao longo deste laboratório para demonstrar como os contextos do SELinux funcionam.

Primeiro, vamos verificar o status do SELinux. Você pode fazer isso com o comando sestatus, que fornece uma visão detalhada, ou com o comando getenforce para uma resposta direta.

Execute getenforce para ver o modo atual:

getenforce

O comando deve retornar Enforcing, o que significa que o SELinux está protegendo ativamente o seu sistema.

Enforcing

Se retornar Permissive, o SELinux está registrando avisos, mas não bloqueando ações. Se retornar Disabled, o SELinux está completamente desligado. Para este laboratório, ele deve estar em Enforcing. Seu ambiente de laboratório está pré-configurado para estar no modo Enforcing.

Em seguida, você instalará o servidor web Apache, conhecido pelo nome de pacote httpd em sistemas CentOS/RHEL. Use o gerenciador de pacotes yum para instalá-lo. A flag -y responde automaticamente "sim" a qualquer solicitação de confirmação.

sudo yum -y install httpd

Você verá a saída conforme o yum resolve as dependências e instala os pacotes. Uma instalação bem-sucedida terminará com uma mensagem "Complete!".

...
Installed:
  httpd-2.4.x-xx.el8.x86_64
  ...
Complete!

Após a conclusão da instalação, você precisa iniciar o serviço Apache para colocá-lo em execução. Use o systemctl para gerenciar o serviço.

sudo systemctl start httpd

Para confirmar que o serviço Apache está rodando corretamente, verifique seu status:

sudo systemctl status httpd

A saída deve mostrar que o serviço está active (running).

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since ...
   ...

Pressione q para sair da visualização de status e retornar ao prompt de comando. Seu ambiente agora está pronto para as próximas etapas.

Criar uma Página Web e Verificar seu Contexto SELinux Padrão

Nesta etapa, você criará uma página web simples e a disponibilizará usando o servidor Apache que acabou de instalar. Este processo demonstrará como o SELinux atribui automaticamente o contexto de segurança correto a arquivos criados em diretórios específicos definidos por políticas, permitindo que os serviços os acessem sem problemas.

O diretório padrão para conteúdo web no Apache é /var/www/html. Qualquer arquivo colocado aqui deve ser acessível através de um navegador web se suas permissões e contexto SELinux estiverem corretos.

Vamos criar um arquivo index.html simples diretamente dentro de /var/www/html. Como este diretório pertence ao usuário root, você deve usar sudo para gravar nele. Um comando sudo echo padrão com redirecionamento (>) não funcionará porque o redirecionamento é tratado pelo seu shell atual, que não possui permissão. Para resolver isso, você pode executar o comando dentro de um shell root usando sudo sh -c '...'.

Execute o seguinte comando para criar o arquivo:

sudo sh -c 'echo "Welcome to Apache on LabEx" > /var/www/html/index.html'

Agora, vamos verificar se o servidor web consegue acessar e servir esta nova página. Você pode usar o curl, uma ferramenta de linha de comando para transferir dados com URLs, para solicitar a página do localhost.

curl http://localhost

Você deve ver o conteúdo do seu arquivo index.html impresso no terminal, confirmando que o Apache está funcionando e consegue ler o arquivo.

Welcome to Apache on LabEx

Então, por que isso funcionou perfeitamente? A resposta está no contexto SELinux do arquivo. Quando você cria um arquivo, o SELinux atribui a ele um contexto baseado na política do diretório pai. Vamos inspecionar o contexto do arquivo index.html que você acabou de criar usando o comando ls -Z. A opção -Z exibe o contexto de segurança do SELinux.

ls -Z /var/www/html/index.html

A saída será semelhante a esta:

system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html

A parte mais importante desta saída é o rótulo do contexto: system_u:object_r:httpd_sys_content_t:s0. Este rótulo é composto por quatro partes: usuário:função:tipo:nível. Para este laboratório, estamos focados no tipo (type), que é httpd_sys_content_t.

A política do SELinux para o Apache (httpd) permite explicitamente que processos executados com o tipo httpd_t acessem arquivos rotulados com o tipo httpd_sys_content_t. Como você criou o arquivo diretamente em /var/www/html, ele herdou o contexto padrão correto e tudo funcionou como esperado.

Provocar uma Negação do SELinux ao Mover um Arquivo com Contexto Incorreto

Nesta etapa, você verá o que acontece quando um arquivo com um contexto SELinux incorreto é movido para o diretório web do Apache. Este é um cenário comum que pode ser confuso se você não estiver ciente de como os contextos do SELinux funcionam com operações de arquivo como o mv. Ao contrário da criação de um arquivo diretamente em um diretório (que faz com que ele herde o contexto padrão do pai), mover um arquivo preserva seu contexto original.

Primeiro, vamos criar uma nova página web, page2.html, no seu diretório de trabalho atual, ~/project.

echo "This is Page 2" > page2.html

Agora, verifique o contexto SELinux deste novo arquivo. Como ele foi criado no diretório de projeto do seu usuário, ele receberá um contexto padrão atribuído a arquivos de usuário.

ls -Z page2.html

A saída mostrará um tipo de contexto como user_home_t ou algo semelhante, que é o padrão para arquivos no diretório home de um usuário.

system_u:object_r:user_home_t:s0 page2.html

Observe que o tipo é user_home_t. Isso é diferente do httpd_sys_content_t que o Apache tem permissão para acessar.

Em seguida, mova este arquivo para a raiz web do Apache usando o comando mv. Você precisará de sudo porque o diretório de destino /var/www/html pertence ao root.

sudo mv page2.html /var/www/html/

O comando mv preserva o contexto SELinux do arquivo de origem. Vamos verificar isso inspecionando o contexto do arquivo em sua nova localização.

ls -Z /var/www/html/page2.html

Como você pode ver, o contexto não mudou. Ele ainda é user_home_t, embora o arquivo esteja agora no diretório /var/www/html.

system_u:object_r:user_home_t:s0 /var/www/html/page2.html

Agora, tente acessar esta nova página usando o curl. O SELinux bloqueará o acesso devido à incompatibilidade de contexto.

curl http://localhost/page2.html

Você receberá um erro "403 Forbidden" do servidor. Isso não é um problema tradicional de permissão de arquivo; é o SELinux aplicando sua política de segurança e negando ao processo httpd a leitura de um arquivo com o rótulo user_home_t.

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /page2.html
on this server.</p>
</body></html>

Isso demonstra um problema clássico do SELinux. Na próxima etapa, você aprenderá como corrigir isso alterando o contexto do arquivo.

Corrigir o Contexto do Arquivo com chcon e Verificar o Acesso

Nesta etapa, você resolverá o erro "403 Forbidden" da etapa anterior alterando manualmente o contexto SELinux do arquivo page2.html. Você usará o comando chcon (change context), uma ferramenta poderosa para modificar o contexto de segurança de arquivos e diretórios.

O comando chcon permite alterar diretamente o usuário, a função, o tipo ou o nível de um contexto SELinux. Para este exercício, você só precisa alterar o tipo. O tipo correto para conteúdo web que o Apache pode ler é httpd_sys_content_t.

Para corrigir o problema, você usará o chcon com a flag -t para especificar o novo tipo para o page2.html. Como o arquivo está localizado em /var/www/html, você precisará usar sudo para modificar seu contexto.

Execute o seguinte comando para atualizar o tipo SELinux do page2.html:

sudo chcon -t httpd_sys_content_t /var/www/html/page2.html

Agora que você executou o comando, vamos verificar se o contexto foi atualizado. Use ls -Z novamente para inspecionar o contexto de segurança do arquivo.

ls -Z /var/www/html/page2.html

A saída agora deve mostrar que o tipo foi alterado de user_home_t para httpd_sys_content_t.

system_u:object_r:httpd_sys_content_t:s0 /var/www/html/page2.html

Com o contexto SELinux correto aplicado, o Apache agora deve ser capaz de acessar e servir o arquivo. Vamos testar isso fazendo outra requisição com o curl.

curl http://localhost/page2.html

Desta vez, o comando deve ser bem-sucedido e você verá o conteúdo da sua página web impresso no terminal.

This is Page 2

Você diagnosticou e resolveu com sucesso um problema de acesso relacionado ao SELinux. Você aprendeu que mover arquivos preserva seu contexto original e que o chcon pode ser usado para ajustar manualmente o contexto para alinhá-lo com a política de segurança, concedendo assim acesso a serviços como o Apache. É importante notar que as alterações feitas com chcon podem não persistir após uma rotulagem completa do sistema de arquivos; o comando restorecon é normalmente usado para aplicar o contexto padrão definido pela política.

Resumo

Neste laboratório, você aprendeu como gerenciar contextos de arquivo SELinux para o servidor web Apache. Você começou verificando se o SELinux estava no modo Enforcing e, em seguida, instalou e iniciou o serviço httpd. Você observou que arquivos criados diretamente na raiz web do Apache (/var/www/html) recebem automaticamente o contexto httpd_sys_content_t correto, necessário para que o Apache os acesse e sirva adequadamente.

O núcleo do laboratório demonstrou as consequências de contextos de arquivo incorretos. Ao mover um arquivo do diretório home de um usuário (com um contexto user_home_t) para a raiz web, você provocou uma negação do SELinux, resultando em um erro "403 Forbidden". Em seguida, você aprendeu a resolver esse problema de acesso usando o comando chcon para alterar manualmente o contexto do arquivo para o tipo httpd_sys_content_t correto, restaurando o acesso com sucesso e reforçando o princípio de que contextos de arquivo corretos são críticos para que os serviços funcionem sob uma política SELinux ativa.