Skip to content

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

  1. Inicio de sesión

    • Inicia sesión en la máquina servera desde bastion como el usuario student utilizando la llave privada proporcionada:
    ssh student-#-servera
    

Paso 1: Validación de Contenxto

  1. Validar estado actual:

    sestatus
    
    Salida similar a:
    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:      33
    
    Si la salida es diferente , configure el modo a Enforcing.
    setenforce 1
    

  2. Validar configuración permanente:

    Editar /etc/selinux/config, asegúrese que SELINUX=enforcing esta configurado en el modo enforcing, puede validarlo posterior a su edición con el comando:

    grep -w ^SELINUX /etc/selinux/config
    
    Salida:
    SELINUX=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
* Actualización de manuales
mandb
* Obtener información de SELinux
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)"
Salida similar a:
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
¿POR QUÉ FALLO?

tail /var/log/audit/audit.log
Mensaje similar a:
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
Identificar de nuevo los puertos definidos para la política de httpd
semanage port -l |grep -w -E "(http_cache_port_t|http_port_t)"
Salida similar a:
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.