Nesta etapa, você aprenderá a configurar o Apache para servir conteúdo web de um diretório não padrão e gerenciar seus contextos de arquivo SELinux. Por padrão, as políticas SELinux restringem o Apache (httpd) a servir arquivos apenas de diretórios específicos, principalmente /var/www/html. Se você colocar o conteúdo web em um local diferente, o SELinux impedirá que o Apache o acesse, mesmo que as permissões do sistema de arquivos estejam corretas. É aqui que os contextos de arquivo SELinux entram em jogo.
Um contexto de arquivo SELinux é um rótulo aplicado a um arquivo ou diretório que define seus atributos de segurança. Para que o Apache sirva conteúdo de um local personalizado, esse local e seu conteúdo devem ter o contexto SELinux correto, normalmente httpd_sys_content_t. Você usará semanage fcontext para definir uma regra persistente e restorecon para aplicá-la.
Primeiro, você precisa instalar o servidor HTTP Apache.
-
Instale o servidor HTTP Apache.
Use o gerenciador de pacotes dnf para instalar o pacote httpd.
sudo dnf install -y httpd
Você deve ver uma saída indicando a instalação bem-sucedida do pacote httpd e suas dependências.
-
Crie um diretório personalizado para conteúdo web e um arquivo index.html.
Você criará um novo diretório chamado /custom e colocará um arquivo index.html simples dentro dele. Este será seu diretório raiz de documentos web não padrão.
sudo mkdir /custom
echo 'This is custom web content.' | sudo tee /custom/index.html
Verifique o conteúdo do arquivo index.html.
cat /custom/index.html
This is custom web content.
-
Configure o Apache para usar o novo diretório raiz de documentos.
O arquivo de configuração principal do Apache é /etc/httpd/conf/httpd.conf. Você precisa editar este arquivo para apontar o Apache para seu novo diretório /custom em vez do padrão /var/www/html.
Abra o arquivo de configuração usando nano.
sudo nano /etc/httpd/conf/httpd.conf
Dentro do editor, encontre as linhas DocumentRoot "/var/www/html" e <Directory "/var/www/html">. Altere ambas as ocorrências de /var/www/html para /custom.
As seções relevantes devem ter esta aparência após a modificação:
#
## DocumentRoot: The directory out of which you will serve your
## documents. By default, all requests are taken from this directory, but
## symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/custom"
#
## Relax access to content within /var/www.
#
<Directory "/custom">
AllowOverride None
## Allow open access:
Require all granted
</Directory>
Salve e saia do arquivo (Ctrl+X, Y, Enter).
-
Inicie e habilite o serviço web Apache.
Após modificar a configuração, você precisa iniciar o serviço httpd. Como você está em um ambiente de contêiner, systemctl não está disponível. Você iniciará o httpd diretamente.
sudo /usr/sbin/httpd -DFOREGROUND &
O símbolo & executa o comando em segundo plano, permitindo que você continue usando o terminal. Você deve ver uma saída semelhante a esta, indicando que o Apache está iniciando.
[1] 5094
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::216:3eff:fe00:63b%eth0. Set the 'ServerName' directive globally to suppress this message
Observação: A mensagem de aviso sobre o nome de domínio totalmente qualificado do servidor é normal neste ambiente de laboratório e pode ser ignorada com segurança.
Para verificar se o Apache está em execução, você pode procurar o processo httpd.
ps aux | grep httpd
Você deve ver vários processos httpd em execução.
root ... /usr/sbin/httpd -DFOREGROUND
apache ... /usr/sbin/httpd -DFOREGROUND
...output omitted...
-
Tente acessar a página web.
Agora, tente acessar sua página web usando curl. Como você está na mesma máquina, pode usar localhost.
curl http://localhost/index.html
Observação: Neste ambiente específico, você pode descobrir que a página web é acessível mesmo com o contexto root_t. Isso demonstra que, embora o SELinux esteja aplicando, o contexto root_t pode ter permissões mais amplas do que o esperado. No entanto, para as melhores práticas de segurança e a configuração adequada do SELinux, o conteúdo web ainda deve usar o contexto httpd_sys_content_t apropriado.
This is custom web content.
-
Verifique o contexto SELinux atual do diretório personalizado.
Use o comando ls -Z para visualizar o contexto SELinux do seu diretório /custom e do arquivo index.html.
ls -Zd /custom /custom/index.html
Você notará que eles têm o contexto root_t, que não é o contexto recomendado para conteúdo web Apache.
system_u:object_r:root_t:s0 /custom
system_u:object_r:root_t:s0 /custom/index.html
Compare isso com o diretório raiz de documentos Apache padrão:
ls -Zd /var/www/html
Você verá que /var/www/html tem o contexto httpd_sys_content_t. Este é o contexto que você precisa aplicar ao seu diretório personalizado.
system_u:object_r:httpd_sys_content_t:s0 /var/www/html
-
Defina uma regra de contexto de arquivo SELinux persistente para /custom.
O comando semanage fcontext é usado para gerenciar regras de mapeamento de contexto de arquivo SELinux. A opção -a adiciona uma nova regra, -t especifica o tipo de destino e a expressão regular '/custom(/.*)?' corresponde ao próprio diretório /custom e a todos os arquivos e subdiretórios dentro dele.
sudo semanage fcontext -a -t httpd_sys_content_t '/custom(/.*)?'
Este comando adiciona a regra à política SELinux, mas não altera imediatamente os contextos dos arquivos existentes.
-
Aplique os novos contextos SELinux aos arquivos.
O comando restorecon é usado para restaurar os contextos SELinux de arquivos e diretórios para seus valores padrão, conforme definido pela política. A opção -R aplica a alteração recursivamente e -v fornece saída detalhada.
sudo restorecon -Rv /custom
Você deve ver uma saída indicando que os contextos de /custom e /custom/index.html foram rotulados novamente.
Relabeled /custom from system_u:object_r:root_t:s0 to system_u:object_r:httpd_sys_content_t:s0
Relabeled /custom/index.html from system_u:object_r:root_t:s0 to system_u:object_r:httpd_sys_content_t:s0
Verifique os contextos novamente usando ls -Z.
ls -Zd /custom /custom/index.html
Eles agora devem ter o contexto httpd_sys_content_t.
system_u:object_r:httpd_sys_content_t:s0 /custom
system_u:object_r:httpd_sys_content_t:s0 /custom/index.html
-
Acesse a página web novamente.
Agora que os contextos SELinux estão corretos, tente acessar a página web com curl novamente.
curl http://localhost/index.html
Você deve ver o conteúdo do seu arquivo index.html.
This is custom web content.
Finalmente, pare o processo do servidor HTTP Apache.
sudo pkill httpd
Verifique se nenhum processo httpd está em execução.
ps aux | grep httpd
Você deve ver apenas o próprio processo grep.
labex ... grep httpd