SELinux: не может ограничить процесс Firefox доменом mozilla_t
Моя цель - запустить Firefox в mozilla_t
домен вместо unconfined_t
, Машина запускает Fedora 20 с SELinux в принудительном режиме.
К сожалению, я не могу понять это правильно. Независимо от того, что я делаю, процесс всегда выполняется в unconfined_t
домен.
Я знаю, что должны быть выполнены три условия:
- целевой контекст файла (
mozilla_exec_t
) должен быть исполняемым для исходного домена (unconfined_t
или жеbin_t
) - целевой контекст файла (
mozilla_exec_t
) должен быть помечен как точка входа для целевого домена (mozilla_t
) - исходный домен (
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
?
1 ответ
У тебя почти было это. Проблема в том, что разрешить правило
разрешить undefined_t mozilla_t: процесс перехода;
позволяет переходу иметь место, но не вызывает его. Для этого вам нужно правило type_transition:
тип_переход не определен_t mozilla_exec_t: процесс mozilla_t;
Это вызывает переход, когда процесс не определен_t выполняет файл mozilla_exec_t.
После этого Firefox не будет работать. Я использовал aud2allow, чтобы отследить дополнительные правила, необходимые для того, чтобы firefox мог управлять временными файлами и сокетами.
Вот политика, которая работает на моей виртуальной машине CentOS 6. Для этого необходимо включить логическое значение selinux mozilla_read_content (через: 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