Назад | Перейти на главную страницу

Контекст SELinux RHEL отличается между matchpathcon и restorecon

Я использую 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