SELinux: не может ограничить процесс Firefox mozilla_t доменом

Моя цель состоит в том, чтобы выполнить Firefox в mozilla_t домен вместо unconfined_t. Машина выполняет Fedora 20 с SELinux в осуществлении режима.

К сожалению, я, может казаться, не разбираюсь в этом. Независимо от того, что я делаю, процесс всегда выполняется в unconfined_t домен.

Я знаю, что существует три условия, которые будут встречены:

  1. контекст конечного файла (mozilla_exec_t) должен быть исполняемый файл для исходного домена (unconfined_t или bin_t)
  2. контекст конечного файла (mozilla_exec_t) должен быть отмечен как точка входа для целевого домена (mozilla_t)
  3. исходный домен (unconfined_t или bin_t) должен быть позволен перейти к целевому домену (mozilla_t)

Конечный файл является сценарием Firefox в /usr/bin/firefox который звонит /usr/lib64/firefox/run-mozilla.run, который снова выполняет двоичный файл /usr/lib64/firefox/firefox. Это - вывод ls -Z на этих файлах:

-rwxr-xr-x. root root system_u:object_r:bin_t:s0       /usr/bin/firefox
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       /usr/lib64/firefox/run-mozilla.sh
-rwxr-xr-x. root root system_u:object_r:mozilla_exec_t:s0 /usr/lib64/firefox/firefox

Первое условие соблюдают, как unconfined_t позволяется выполнить контекст конечного файла mozilla_exec_t.

$ sesearch -s unconfined_t -t mozilla_exec_t -c file -p execute -Ad
Found 1 semantic av rules:
   allow unconfined_t mozilla_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ; 

Второе условие соблюдают, как mozilla_exec_t определяется как точка входа к mozilla_t домен.

$ sesearch -s mozilla_t -t mozilla_exec_t -c file -p entrypoint -Ad
Found 1 semantic av rules:
   allow mozilla_t mozilla_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ; 

На конфигурацию по умолчанию в Fedora 20 третье условие не соблюдают потому что unconfined_t не может перейти к mozilla_t.

$ sesearch -s unconfined_t -t mozilla_t -c process -p transition -Ad
(no output)

Для фиксации этого, я записал короткий модуль политики, который предоставляет unconfined_t разрешение процесса перейти к mozilla_t.

module rekado 1.0;

require {
  type unconfined_t;
  type mozilla_t;
  class process transition;
}

allow unconfined_t mozilla_t : process transition ; 

Теперь я должен смочь выполнить процесс Firefox в домене mozilla_t непосредственно рабочим исполняемый файл /usr/lib64/firefox/firefox, но процесс остается в домене unconfined_t.

Что продолжается здесь? Почему контекст процесса не mozilla_t?

6
задан 13 September 2014 в 22:10
1 ответ

Вы почти получили это. Проблема в том, что разрешающее правило

разрешает неограниченный переход mozilla_t: process;

позволяет переходу иметь место, но не вызывает его. Для этого вам понадобится правило type_transition:

type_transition unlimited_t mozilla_exec_t: process mozilla_t;

Это приводит к тому, что переход происходит, когда процесс unlimited_t выполняет файл mozilla_exec_t.

После этого firefox не запускается. Я использовал audit2allow, чтобы отследить дополнительные правила, необходимые, чтобы разрешить firefox управлять временными файлами и сокетами.

Вот политика, которая работает на моей виртуальной машине на базе CentOS 6. Ему необходимо включить логическое значение mozilla_read_content selinux (через: setsebool -P mozilla_read_content 1 ).

module mozilla 1.0;

require {
  role unconfined_r;
  type unconfined_t;
  type mozilla_t;
  type mozilla_exec_t;
  type tmp_t;
  type user_tmp_t;
  type fs_t;
  class process transition;
  class file { ioctl getattr setattr create read write unlink open relabelto };
  class dir { ioctl getattr setattr create read write unlink add_name remove_name };
  class filesystem getattr;
  class sock_file { getattr setattr create read write unlink };
  class unix_stream_socket connectto;
}

role unconfined_r types mozilla_t;

allow unconfined_t self:file relabelto;
allow unconfined_t mozilla_t : process transition ; 

type_transition unconfined_t mozilla_exec_t : process mozilla_t;

allow mozilla_t fs_t:filesystem getattr;
allow mozilla_t tmp_t:file { ioctl getattr setattr create write unlink open };
allow mozilla_t tmp_t:dir  { ioctl getattr setattr create read write add_name remove_name };
allow mozilla_t user_tmp_t:dir { ioctl create write add_name setattr remove_name };
allow mozilla_t user_tmp_t:sock_file { getattr setattr create read write unlink };
allow mozilla_t unconfined_t:unix_stream_socket connectto;  

Чтобы скомпилировать и установить его:

# checkmodule -M -m -o mozilla.mod mozilla.te
checkmodule: загрузка конфигурации политики из rekado.te
checkmodule: загружена конфигурация политики
checkmodule: запись двоичного представления (версия 10) в mozilla.mod
# semodule_package -o mozilla.pp -m mozilla.mod
# sudo semodule -i mozilla.pp

3
ответ дан 3 December 2019 в 00:38

Теги

Похожие вопросы