¿Qué opinión general os merece SELinux?

Os pongo en contexto. Un Rocky 9.5 (derivado de RHEL, para quien no lo conozca) que he empezado a administrar, sirve un servidor Apache (httpd). He importado una configuración propia en forma de fichero httpd.conf y lo he situado en /etc/httpd/conf/, configuración típica. He mantenido la copia original y la copia mía en el mismo fichero y he configurado los permisos y propietarios exactamente igual:

[dbac32ab conf]# cd /etc/httpd/conf/
[dbac32ab conf]# mv httpd.conf httpd.conf.bk
[dbac32ab conf]# cp /tmp/httpd.conf httpd.conf
[dbac32ab conf]# ls -l
total 32
-rw-r--r--. 1 root root  1516 May 15 09:20 httpd.conf
-rw-r--r--. 1 root root 12005 Jan 22 00:22 httpd.conf.bk
-rw-r--r--. 1 root root 13430 Jan 22 00:24 magic

Sin embargo, al hacer el cambio y realizar un reinicio del servicio, me ha fallado.

[dbac32ab conf]# service httpd restart
Redirecting to /bin/systemctl restart httpd.service
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xeu httpd.service" for details.

[dbac32ab conf]# service httpd status
Redirecting to /bin/systemctl status httpd.service
× httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
     Active: failed (Result: exit-code) since Thu 2025-05-15 09:29:38 UTC; 10s ago
   Duration: 6min 47.750s
       Docs: man:httpd.service(8)
    Process: 30756 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
   Main PID: 30756 (code=exited, status=1/FAILURE)
        CPU: 30msMay 15 09:29:37 dbac32ab systemd[1]: Starting The Apache HTTP Server...
May 15 09:29:37 dbac32ab  httpd[30756]: httpd: Could not open configuration file /etc/httpd/conf/httpd.conf: Permission denied
May 15 09:29:38 dbac32ab  systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE
May 15 09:29:38 dbac32ab  systemd[1]: httpd.service: Failed with result 'exit-code'.
May 15 09:29:38 dbac32ab  systemd[1]: Failed to start The Apache HTTP Server.

Para mi sorpresa, indicando fallo de permisos para acceder al fichero. Como he comentado, los permisos y propietarios son exactamente iguales. He revertido los cambios y ha funcionado. Por lo que investigando un poco qué puede estar pasando, he comprobado que esta máquina tiene SELinux activado, y al parecer, aplica una capa más para control de acceso.

Con ls -Z se puede comprobar el contexto que SELinux aplica a cada archivo.

[dbac32ab conf]# ls -Z /etc/httpd/conf/httpd.conf
unconfined_u:object_r:user_home_t:s0 /etc/httpd/conf/httpd.conf
[dbac32ab conf]# ls -Z /etc/httpd/conf/httpd.conf.bk
system_u:object_r:httpd_config_t:s0 /etc/httpd/conf/httpd.conf.bk

El contexto es diferente para cada archivo, por lo que he usado chcon para copiar el contexto del original al nuevo archivo. Después he reiniciado el servicio y ha funcionado sin problemas:

[dbac32ab conf]# chcon --reference=/etc/httpd/conf/httpd.conf.bk /etc/httpd/conf/httpd.conf
[dbac32ab conf]# service httpd restart
Redirecting to /bin/systemctl restart httpd.service

Es una capa extra que no había tenido en cuenta, debido a que no tengo demasiada experiencia en SELinux. Sé que hay polémicas con su adopción, similar a systemd, no sólo por añadir una capa de complejidad extra y lo que de ello deriva, sino por su desarrollo liderado por la NSA.

¿Lo conocéis? ¿qué opináis en términos generales?

2 Me gusta

Sinceramente tengo nula experiencia con estos mecanismos, nunca los he usado y las distribuciones que uso tampoco ofrecen la opción de habilitarlo. Tengo entendido que es parecido a Apparmor, limita el alcance de algunos compontentes del userland, pero a decir verdad no tengo mucha idea de la diferencia entre SElinux y Apparmor.

1 me gusta