Экспериментируя с контекстами файлов, я столкнулся со странным поведением, и мне кажется, что я что-то упускаю. Вот что я делаю:
Создайте кучу каталогов и файлов
# mkdir -p /virtual/www/cgi-bin
# touch /virtual/www/cgi-bin/script
# touch /virtual/www/webpage
Установите несколько правил с нуля
# 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(/.*)?'
Попробуй это!
# 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
Несмотря на более конкретное правило для cgi-bin, каждый файл/каталог получает тип httpd_sys_content_t. Однако я хочу каталог cgi-bin и ниже получил тип httpd_sys_script_exec_t. Что я делаю не так?
Протестировано в CentOS 6 и RedHat 7 с одинаковым результатом.
решение1
Поскольку шаблоны, используемые selinux, не могут быть отсортированы (например, сравните .*b
с b.*
), selinux упорядочивает правила не по специфичности, а по принципу «последнее добавление — последнее применение».
К сожалению, semanage fcontext -l упорядочивает правила путем простого сравнения строк, что помогает найти нужное правило, но не помогает, если вам нужно отладить несколько совпадающих правил.
Вы можете увидеть фактически примененный заказ в
cat /etc/selinux/targeted/contexts/files/file_contexts.local
Поэтому вам нужно сначала добавить более общее правило, а затем более конкретное. Или, что еще лучше, постарайтесь построить правила таким образом, чтобы только одно правило на файл могло соответствовать.