Я использую RHEL 6.3, и я экспериментирую со странным поведением с matchpathcon и восстановление Команды SELinux. Для конкретного файла я определил контекст с помощью semanage fcontext. Затем, matchpathcon сообщает мне, что файл должен иметь контекст, который я определил, но восстановление сделать файл другим контекстом. Я не понимаю поведения и думаю, что что-то делаю не так.
Вот пример для воспроизведения этого поведения (я пользователь root):
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.3 (Santiago)
$ sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
Я бы создал специальный сценарий init.d для запуска демона HTTPD.
$ touch /etc/init.d/my-httpd
$ ls -Z /etc/init.d/my-httpd
-rw-------. root root unconfined_u:object_r:etc_t:s0 /etc/init.d/my-httpd
Итак, я создаю контекст для этого файла и проверяю, что он был сохранен.
$ semanage fcontext -a -t httpd_initrc_exec_t /etc/init.d/my-httpd
$ semanage fcontext -C -l
contexte fichier SELinux type Contexte
/etc/init.d/my-httpd all files system_u:object_r:httpd_initrc_exec_t:s0
matchpathcon -V /etc/init.d/my-httpd
/etc/init.d/my-httpd has context unconfined_u:object_r:etc_t:s0, should be system_u:object_r:httpd_initrc_exec_t:s0
Затем я пытаюсь восстановить контекст, в котором matchpathcon сказал мне.
restorecon -v /etc/init.d/my-httpd
restorecon reset /etc/rc.d/init.d/my-httpd context unconfined_u:object_r:etc_t:s0->unconfined_u:object_r:initrc_exec_t:s0
$ ls -Z /etc/init.d/my-httpd
-rw-------. root root unconfined_u:object_r:initrc_exec_t:s0 /etc/init.d/my-httpd
На данный момент я понимаю, что контекст не был определен так, как я бы. Я пытаюсь проверить еще раз с matchpathcon, возможно, httpd_initrc_exec_t - это псевдоним initrc_exec_t.
matchpathcon -V /etc/init.d/my-httpd
/etc/init.d/my-httpd has context unconfined_u:object_r:initrc_exec_t:s0, should be system_u:object_r:httpd_initrc_exec_t:s0
$ restorecon -v -F /etc/init.d/my-httpd
restorecon reset /etc/rc.d/init.d/my-httpd context unconfined_u:object_r:initrc_exec_t:s0->system_u:object_r:initrc_exec_t:s0
$ matchpathcon -V /etc/init.d/my-httpd
/etc/init.d/my-httpd has context system_u:object_r:initrc_exec_t:s0, should be system_u:object_r:httpd_initrc_exec_t:s0
Затем я пытаюсь вручную исправить контекст с помощью chcon, но я не хочу этого делать. Просто чтобы проверить предыдущую теорию псевдонимов.
$ chcon -t httpd_initrc_exec_t /etc/init.d/my-httpd
$ ls -Z /etc/init.d/my-httpd
-rw-------. root root system_u:object_r:httpd_initrc_exec_t:s0 /etc/init.d/my-httpd
$ matchpathcon -V /etc/init.d/my-httpd
/etc/init.d/my-httpd verified.
$ restorecon -v /etc/init.d/my-httpd
restorecon reset /etc/rc.d/init.d/my-httpd context system_u:object_r:httpd_initrc_exec_t:s0->system_u:object_r:initrc_exec_t:s0
Эти контексты не кажутся псевдонимами, но все еще наблюдается странное поведение с восстановление команда, и я планировал использовать ее функциональность.
Есть ли другой способ определить этот контекст SELinux или, может быть, я сделал что-то не так?
Служба поддержки Red Hat подсказала мне, как надо действовать. Контекст должен быть установлен для /etc/rc.d/init.d/my-httpd а не для /etc/init.d/my-httpd.
$ semanage fcontext -d -t httpd_initrc_exec_t /etc/init.d/my-httpd
$ semanage fcontext -C -l
$ semanage fcontext -a -t httpd_initrc_exec_t /etc/rc.d/init.d/my-httpd
$ semanage fcontext -C -l
SELinux fcontext type Context
/etc/rc.d/init.d/my-httpd all files system_u:object_r:httpd_initrc_exec_t:s0
После установки правильного правила контекста восстановление работает на /etc/init.d/my-httpd файл.
ls -Z /etc/rc.d/init.d/my-httpd /etc/init.d/my-httpd
-rw-------. root root system_u:object_r:initrc_exec_t:s0 /etc/init.d/my-httpd
-rw-------. root root system_u:object_r:initrc_exec_t:s0 /etc/rc.d/init.d/my-httpd
$ restorecon /etc/init.d/my-httpd
$ ls -Z /etc/rc.d/init.d/my-httpd /etc/init.d/my-httpd
-rw-------. root root system_u:object_r:httpd_initrc_exec_t:s0 /etc/init.d/my-httpd
-rw-------. root root system_u:object_r:httpd_initrc_exec_t:s0 /etc/rc.d/init.d/my-httpd