En este paso, aprenderá a configurar Apache para servir contenido web desde un directorio no estándar y a gestionar sus contextos de archivos SELinux. De forma predeterminada, las políticas de SELinux restringen a Apache (httpd) a servir archivos solo desde directorios específicos, principalmente /var/www/html. Si coloca contenido web en una ubicación diferente, SELinux impedirá que Apache acceda a él, incluso si los permisos del sistema de archivos son correctos. Aquí es donde entran en juego los contextos de archivos SELinux.
Un contexto de archivo SELinux es una etiqueta aplicada a un archivo o directorio que define sus atributos de seguridad. Para que Apache sirva contenido desde una ubicación personalizada, esa ubicación y su contenido deben tener el contexto SELinux correcto, típicamente httpd_sys_content_t. Usará semanage fcontext para definir una regla persistente y restorecon para aplicarla.
Primero, necesita instalar el servidor HTTP Apache.
-
Instalar el servidor HTTP Apache.
Use el gestor de paquetes dnf para instalar el paquete httpd.
sudo dnf install -y httpd
Debería ver una salida que indica la instalación exitosa del paquete httpd y sus dependencias.
-
Crear un directorio personalizado para contenido web y un archivo index.html.
Creará un nuevo directorio llamado /custom y colocará un archivo index.html simple dentro de él. Este será su raíz de documentos web no estándar.
sudo mkdir /custom
echo 'This is custom web content.' | sudo tee /custom/index.html
Verifique el contenido del archivo index.html.
cat /custom/index.html
This is custom web content.
-
Configurar Apache para usar la nueva raíz de documentos.
El archivo de configuración principal de Apache es /etc/httpd/conf/httpd.conf. Necesita editar este archivo para que Apache apunte a su nuevo directorio /custom en lugar del predeterminado /var/www/html.
Abra el archivo de configuración usando nano.
sudo nano /etc/httpd/conf/httpd.conf
Dentro del editor, encuentre las líneas DocumentRoot "/var/www/html" y <Directory "/var/www/html">. Cambie ambas apariciones de /var/www/html a /custom.
Las secciones relevantes deberían verse así después de la modificación:
#
## 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>
Guarde y salga del archivo (Ctrl+X, Y, Enter).
-
Iniciar y habilitar el servicio web Apache.
Después de modificar la configuración, necesita iniciar el servicio httpd. Dado que está en un entorno de contenedor, systemctl no está disponible. Iniciará httpd directamente.
sudo /usr/sbin/httpd -DFOREGROUND &
El símbolo & ejecuta el comando en segundo plano, lo que le permite continuar usando la terminal. Debería ver una salida similar a esta, que indica que Apache se 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
Nota: El mensaje de advertencia sobre el nombre de dominio completo del servidor es normal en este entorno de laboratorio y se puede ignorar de forma segura.
Para verificar que Apache se está ejecutando, puede buscar el proceso httpd.
ps aux | grep httpd
Debería ver varios procesos httpd en ejecución.
root ... /usr/sbin/httpd -DFOREGROUND
apache ... /usr/sbin/httpd -DFOREGROUND
...output omitted...
-
Intentar acceder a la página web.
Ahora, intente acceder a su página web usando curl. Dado que está en la misma máquina, puede usar localhost.
curl http://localhost/index.html
Nota: En este entorno particular, es posible que encuentre que la página web es accesible incluso con el contexto root_t. Esto demuestra que, si bien SELinux está aplicando, el contexto root_t puede tener permisos más amplios de lo esperado. Sin embargo, para las mejores prácticas de seguridad y la configuración adecuada de SELinux, el contenido web aún debe usar el contexto httpd_sys_content_t apropiado.
This is custom web content.
-
Comprobar el contexto SELinux actual del directorio personalizado.
Use el comando ls -Z para ver el contexto SELinux de su directorio /custom y el archivo index.html.
ls -Zd /custom /custom/index.html
Notará que tienen el contexto root_t, que no es el contexto recomendado para el contenido web de Apache.
system_u:object_r:root_t:s0 /custom
system_u:object_r:root_t:s0 /custom/index.html
Compare esto con la raíz de documentos predeterminada de Apache:
ls -Zd /var/www/html
Verá que /var/www/html tiene el contexto httpd_sys_content_t. Este es el contexto que necesita aplicar a su directorio personalizado.
system_u:object_r:httpd_sys_content_t:s0 /var/www/html
-
Definir una regla de contexto de archivo SELinux persistente para /custom.
El comando semanage fcontext se usa para gestionar las reglas de mapeo de contexto de archivo SELinux. La opción -a agrega una nueva regla, -t especifica el tipo de destino y la expresión regular '/custom(/.*)?' coincide con el directorio /custom en sí y todos los archivos y subdirectorios dentro de él.
sudo semanage fcontext -a -t httpd_sys_content_t '/custom(/.*)?'
Este comando agrega la regla a la política de SELinux, pero no cambia inmediatamente los contextos de los archivos existentes.
-
Aplicar los nuevos contextos SELinux a los archivos.
El comando restorecon se usa para restaurar los contextos SELinux de archivos y directorios a sus valores predeterminados según lo definido por la política. La opción -R aplica el cambio de forma recursiva y -v proporciona una salida detallada.
sudo restorecon -Rv /custom
Debería ver una salida que indica que los contextos de /custom y /custom/index.html han sido reetiquetados.
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 los contextos de nuevo usando ls -Z.
ls -Zd /custom /custom/index.html
Ahora deberían tener el 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
-
Acceder a la página web de nuevo.
Ahora que los contextos SELinux son correctos, intente acceder a la página web con curl de nuevo.
curl http://localhost/index.html
Ahora debería ver el contenido de su archivo index.html.
This is custom web content.
Finalmente, detenga el proceso del servidor HTTP Apache.
sudo pkill httpd
Verifique que no se estén ejecutando procesos httpd.
ps aux | grep httpd
Solo debería ver el proceso grep en sí.
labex ... grep httpd