SELinux (port context)
Objetivos
- Comprender el concepto de SELinux Port Context y su importancia en la seguridad del sistema.
- Asignar el puerto 82 al contexto http_port_t, asegurando que los servicios web puedan utilizarlo sin restricciones de SELinux.
- Verificar que el puerto asignado sea funcional probando el acceso al servicio web configurado en el puerto 82.
Entorno Inicial
- Usuario: student
- Máquina: servera
- Herramientas utilizadas: Shell Bash y utilidades básicas de Linux.
Pasos del Laboratorio
Prerequisitos
-
Inicio de sesión
- Inicia sesión en la máquina
serveradesdebastioncomo el usuariostudentutilizando la llave privada proporcionada:
ssh student-#-servera - Inicia sesión en la máquina
Paso 1: Validación de Contenxto
-
Validar estado actual:
Salida similar a:sestatusSi la salida es diferente , configure el modo a Enforcing.SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing # <== Modo de operación Mode from config file: enforcing # <== Modo configurado por defecto Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 33setenforce 1 -
Validar configuración permanente:
Editar /etc/selinux/config, asegúrese que
SELINUX=enforcingesta configurado en el modo enforcing, puede validarlo posterior a su edición con el comando:Salida:grep -w ^SELINUX /etc/selinux/configSELINUX=enforcing
Apache 2 (httpd)
Para demostrar el funcionamiento de SELinux, se utilizará una instalación básica de Apache
Validar funcionamiento de Apache
- Instalar apache
dnf install httpd -y - Iniciar apache
systemctl start httpd - Crear contenido de ejemplo
echo "Hello from Apache" > /var/www/html/index.html
- Validar acceso a Servicio
curl http://localhost curl -I http://localhost
Documentación y herramientas SELinux
- Instalación
dnf install policycoreutils policycoreutils-python-utils selinux-policy-doc -y
mandb
man -k _selinux
man -k _selinux |grep http
man httpd_selinux
Buscar en contenido del manual PORT TYPES
Salir del manual
Identificar los puertos definidos para la política de httpd
semanage port -l |grep -w -E "(http_cache_port_t|http_port_t)"
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
Validando funcionamiento de SELinux
- Alterar configuración de Apache (cambio de puerto 80 a 82)
grep '^Listen' /etc/httpd/conf/httpd.conf sed -i 's/^Listen.*/Listen 82/g' /etc/httpd/conf/httpd.conf grep '^Listen' /etc/httpd/conf/httpd.conf - Reiniciar Apache
systemctl restart httpd
DEBE FALLAR
journalctl -u httpd
Mensaje similar a:
httpd[]: (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:82
tail /var/log/audit/audit.log
type=AVC msg=audit(1710777652.587:800): avc: denied { name_bind } for pid=68894 comm="httpd" src=82 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:reserved_port_t:s0 tclass=tcp_socket permissive=0
Para ayudarnos a identificar la razón de la falla, podemos instalar el siguiente paquete:
dnf install setroubleshoot-server -y
systemctl restart setroubleshootd
systemctl restart httpd
Identificar la posible solución en base al log
semanage port -a -t http_port_t -p tcp 82
semanage port -l |grep -w -E "(http_cache_port_t|http_port_t)"
http_port_t tcp 82, 80, 81, 443, 488, 8008, 8009, 8443, 9000
- Reiniciar Apache
systemctl restart httpd
- Validar logs del servicio
journalctl -u httpd
- Validar funcionamiento de Apache
curl http://localhost:82
curl -I http://localhost:82
Resultados Esperados
- Configuración exitosa del contexto de puerto en SELinux.
- Validación de que el puerto 82 está correctamente asignado al contexto http_port_t y es accesible para el servicio web.
- Comprobación de que SELinux permite la comunicación en el puerto 82 conforme a la configuración aplicada.
- Identificación y solución de posibles problemas de acceso debido a restricciones de SELinux.