Administración de Contextos de Archivo SELinux para Apache en Linux

CompTIABeginner
Practicar Ahora

Introducción

En esta práctica de laboratorio, aprenderás a administrar los contextos de archivo de SELinux para asegurar que servicios como el servidor web Apache puedan acceder a los archivos necesarios. Explorarás cómo Security-Enhanced Linux (SELinux) aplica etiquetas de seguridad, conocidas como contextos, a los archivos y cómo los contextos discrepantes pueden provocar errores de denegación de acceso, incluso cuando los permisos de archivo estándar parecen ser correctos. Esta experiencia práctica está diseñada para fortalecer tus capacidades en la resolución de problemas de seguridad comunes en un entorno Linux.

A lo largo de los pasos, instalarás Apache, verificarás que SELinux esté en modo enforcing y observarás el contexto predeterminado de una página web colocada correctamente. Luego, provocarás intencionadamente un error "Forbidden" (Prohibido) al mover un archivo con un contexto incorrecto al directorio raíz web. Para resolver esto, utilizarás el comando chcon para reetiquetar el archivo, demostrando un método fundamental para corregir problemas relacionados con el contexto de SELinux y restaurar la funcionalidad del servicio.

Esta es una Práctica Guiada, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y ganar experiencia práctica. Los datos históricos muestran que esta es una práctica de nivel principiante con una tasa de finalización del 99%. Ha recibido una tasa de valoraciones positivas del 99% por parte de los alumnos.

Instalar Apache y Verificar que SELinux esté en Modo Enforcing

En este paso, comenzarás asegurándote de que tu entorno esté configurado correctamente. Esto implica verificar que Security-Enhanced Linux (SELinux), un módulo de seguridad crítico en el kernel de Linux, se esté ejecutando en modo enforcing. Luego, instalarás el servidor web Apache, que se utilizará a lo largo de esta práctica para demostrar cómo funcionan los contextos de SELinux.

Primero, comprobemos el estado de SELinux. Puedes hacerlo con el comando sestatus, que proporciona una visión detallada, o con el comando getenforce para obtener una respuesta directa.

Ejecuta getenforce para ver el modo actual:

getenforce

El comando debería devolver Enforcing, lo que significa que SELinux está protegiendo activamente tu sistema.

Enforcing

Si devuelve Permissive, SELinux está registrando advertencias pero no bloqueando acciones. Si devuelve Disabled, SELinux está completamente desactivado. Para esta práctica, debe estar en Enforcing. Tu entorno de laboratorio está preconfigurado para estar en modo Enforcing.

A continuación, instalarás el servidor web Apache, conocido por su nombre de paquete httpd en sistemas CentOS/RHEL. Utiliza el gestor de paquetes yum para instalarlo. La bandera -y responde automáticamente "sí" a cualquier solicitud de confirmación.

sudo yum -y install httpd

Verás la salida a medida que yum resuelve las dependencias e instala los paquetes. Una instalación exitosa terminará con un mensaje de "Complete!".

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

Una vez finalizada la instalación, debes iniciar el servicio Apache para que se ejecute. Utiliza systemctl para administrar el servicio.

sudo systemctl start httpd

Para confirmar que el servicio Apache se está ejecutando correctamente, comprueba su estado:

sudo systemctl status httpd

La salida debería mostrar que el servicio 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 ...
   ...

Presiona q para salir de la vista de estado y volver a la línea de comandos. Tu entorno ya está listo para los siguientes pasos.

Crear una Página Web y Verificar su Contexto SELinux Predeterminado

En este paso, crearás una página web sencilla y la servirás utilizando el servidor Apache que acabas de instalar. Este proceso demostrará cómo SELinux asigna automáticamente el contexto de seguridad correcto a los archivos creados en directorios específicos definidos por la política, permitiendo que los servicios accedan a ellos sin problemas.

El directorio predeterminado para el contenido web en Apache es /var/www/html. Cualquier archivo colocado aquí debería ser accesible a través de un navegador web si sus permisos y su contexto SELinux son correctos.

Vamos a crear un archivo index.html sencillo directamente dentro de /var/www/html. Dado que este directorio es propiedad del usuario root, debes usar sudo para escribir en él. Un comando sudo echo estándar con redirección (>) no funcionará porque la redirección es gestionada por tu shell actual, que carece de permisos. Para solucionar esto, puedes ejecutar el comando dentro de una shell de root usando sudo sh -c '...'.

Ejecuta el siguiente comando para crear el archivo:

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

Ahora, verifiquemos que el servidor web puede acceder y servir esta nueva página. Puedes usar curl, una herramienta de línea de comandos para transferir datos con URLs, para solicitar la página desde localhost.

curl http://localhost

Deberías ver el contenido de tu archivo index.html impreso en la terminal, confirmando que Apache está funcionando y puede leer el archivo.

Welcome to Apache on LabEx

Entonces, ¿por qué funcionó esto sin problemas? La respuesta reside en el contexto SELinux del archivo. Cuando creas un archivo, SELinux le asigna un contexto basado en la política del directorio padre. Inspeccionemos el contexto del archivo index.html que acabas de crear usando el comando ls -Z. La opción -Z muestra el contexto de seguridad de SELinux.

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

La salida será similar a esta:

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

La parte más importante de esta salida es la etiqueta del contexto: system_u:object_r:httpd_sys_content_t:s0. Esta etiqueta se compone de cuatro partes: usuario:rol:tipo:nivel. Para esta práctica, nos centramos en el tipo (type), que es httpd_sys_content_t.

La política de SELinux para Apache (httpd) permite explícitamente que los procesos que se ejecutan con el tipo httpd_t accedan a archivos etiquetados con el tipo httpd_sys_content_t. Debido a que creaste el archivo directamente en /var/www/html, este heredó el contexto predeterminado correcto y todo funcionó como se esperaba.

Provocar una Denegación de SELinux al Mover un Archivo con un Contexto Incorrecto

En este paso, verás qué sucede cuando un archivo con un contexto SELinux incorrecto se mueve al directorio web de Apache. Este es un escenario común que puede resultar confuso si no se conoce cómo funcionan los contextos de SELinux con las operaciones de archivos como mv. A diferencia de crear un archivo directamente en un directorio (lo que hace que herede el contexto predeterminado del padre), mover un archivo preserva su contexto original.

Primero, vamos a crear una nueva página web, page2.html, en tu directorio de trabajo actual, ~/project.

echo "This is Page 2" > page2.html

Ahora, comprueba el contexto SELinux de este nuevo archivo. Dado que se creó en el directorio de proyecto de tu usuario, recibirá un contexto predeterminado asignado a los archivos de usuario.

ls -Z page2.html

La salida mostrará un tipo de contexto como user_home_t o algo similar, que es el predeterminado para los archivos en el directorio personal de un usuario.

system_u:object_r:user_home_t:s0 page2.html

Observa que el tipo es user_home_t. Esto es diferente de httpd_sys_content_t, que es al que Apache tiene permiso para acceder.

A continuación, mueve este archivo a la raíz web de Apache usando el comando mv. Necesitarás sudo porque el directorio de destino /var/www/html es propiedad de root.

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

El comando mv preserva el contexto SELinux del archivo de origen. Verifiquemos esto comprobando el contexto del archivo en su nueva ubicación.

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

Como puedes ver, el contexto no ha cambiado. Sigue siendo user_home_t, a pesar de que el archivo se encuentra ahora en el directorio /var/www/html.

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

Ahora, intenta acceder a esta nueva página usando curl. SELinux bloqueará el acceso debido a la discrepancia de contexto.

curl http://localhost/page2.html

Recibirás un error "403 Forbidden" del servidor. No se trata de un problema tradicional de permisos de archivo; es SELinux aplicando su política de seguridad y denegando al proceso httpd la lectura de un archivo con la etiqueta 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>

Esto demuestra un problema clásico de SELinux. En el siguiente paso, aprenderás cómo solucionar esto cambiando el contexto del archivo.

Corregir el Contexto del Archivo con chcon y Verificar el Acceso

En este paso, resolverás el error "403 Forbidden" del paso anterior cambiando manualmente el contexto SELinux del archivo page2.html. Utilizarás el comando chcon (change context), una herramienta potente para modificar el contexto de seguridad de archivos y directorios.

El comando chcon te permite alterar directamente el usuario, rol, tipo o nivel de un contexto SELinux. Para este ejercicio, solo necesitas cambiar el tipo. El tipo correcto para el contenido web que Apache puede leer es httpd_sys_content_t.

Para solucionar el problema, usarás chcon con la bandera -t para especificar el nuevo tipo para page2.html. Dado que el archivo se encuentra en /var/www/html, deberás usar sudo para modificar su contexto.

Ejecuta el siguiente comando para actualizar el tipo SELinux de page2.html:

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

Ahora que has ejecutado el comando, verifiquemos que el contexto se ha actualizado. Usa ls -Z de nuevo para inspeccionar el contexto de seguridad del archivo.

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

La salida debería mostrar ahora que el tipo ha cambiado de user_home_t a httpd_sys_content_t.

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

Con el contexto SELinux correcto establecido, Apache debería poder acceder y servir el archivo. Probemos esto realizando otra solicitud con curl.

curl http://localhost/page2.html

Esta vez, el comando debería tener éxito y verás el contenido de tu página web impreso en la terminal.

This is Page 2

Has diagnosticado y resuelto con éxito un problema de acceso relacionado con SELinux. Has aprendido que mover archivos preserva su contexto original y que chcon puede usarse para ajustar manualmente el contexto para alinearlo con la política de seguridad, otorgando así acceso a servicios como Apache. Es importante notar que los cambios realizados con chcon podrían no persistir tras un reetiquetado completo del sistema de archivos; normalmente se utiliza el comando restorecon para aplicar el contexto predeterminado definido por la política.

Resumen

En esta práctica de laboratorio, aprendiste a administrar los contextos de archivo de SELinux para el servidor web Apache. Comenzaste verificando que SELinux estuviera en modo Enforcing y luego instalaste e iniciaste el servicio httpd. Observaste que a los archivos creados directamente dentro de la raíz web de Apache (/var/www/html) se les asigna automáticamente el contexto httpd_sys_content_t correcto, el cual es necesario para que Apache acceda a ellos y los sirva adecuadamente.

El núcleo de la práctica demostró las consecuencias de tener contextos de archivo incorrectos. Al mover un archivo desde el directorio personal de un usuario (con un contexto user_home_t) a la raíz web, provocaste una denegación de SELinux, lo que resultó en un error "403 Forbidden". Luego aprendiste a resolver este problema de acceso utilizando el comando chcon para cambiar manualmente el contexto del archivo al tipo httpd_sys_content_t correcto, restaurando con éxito el acceso y reforzando el principio de que los contextos de archivo correctos son críticos para que los servicios funcionen bajo una política de SELinux activa.