Al experimentar con contextos de archivos, me he enfrentado a un comportamiento extraño y me parece que me falta algo. Esto es lo que hago:
Crea un montón de directorios y archivos.
# mkdir -p /virtual/www/cgi-bin
# touch /virtual/www/cgi-bin/script
# touch /virtual/www/webpage
Configura un par de reglas desde cero
# semanage fcontext -D
# semanage fcontext -a -t httpd_sys_script_exec_t '/virtual/www/cgi-bin(/.*)?'
# semanage -a -t httpd_sys_content_t '/virtual/www(/.*)?'
¡Pruébalo!
# restorecon -vr /virtual
restorecon reset /virtual/www context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /virtual/www/cgi-bin context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /virtual/www/cgi-bin/script context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /virtual/www/webpage context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
A pesar de la regla más específica para cgi-bin, cada archivo/directorio obtiene el tipo httpd_sys_content_t. Sin embargo, quiero el directorio cgi-bin y debajo tengo el tipo httpd_sys_script_exec_t. ¿Qué estoy haciendo mal?
Probado en CentOS 6 y RedHat 7 con el mismo resultado.
Respuesta1
Debido a que los patrones utilizados por selinux no se pueden ordenar (por ejemplo, comparar .*b
con b.*
), selinux no ordena las reglas por especificidad sino por última agregada, última aplicada.
Desafortunadamente, semanage fcontext -l ordena las reglas mediante una simple comparación de cadenas, lo que ayuda a encontrar su regla, pero no si necesita depurar varias reglas coincidentes.
Puede ver el orden realmente aplicado en
cat /etc/selinux/targeted/contexts/files/file_contexts.local
Por lo tanto, primero debe agregar la regla más general y luego la más específica. O, mejor aún, haga todo lo posible para crear las reglas de manera que solo una regla por archivo pueda coincidir.