Здравствуйте. Пытаюсь прикрутить SELinux к своему Арчу. Ядро перекомпилировал с поддержкой, утилиты всякие нужные установил. Загвоздка в systemd оказалась. Решил посмотреть, как сделано в Федоре и попытаться сделать так же. Подсмотрел, что в Федоре файл /usr/lib/systemd/systemd имеет контекст «system_u:object_r:init_exec_t». Соответственно, сам процесс запустится в домене init_t. Поменял у себя контекст на такой же, перезагрузился, все работает, домен процесса systemd сменился на init_t. Отлично. Дальше нужно сделать, чтобы systemd-journald работал в домене syslogd_t. Подсмотрел, что в Федоре файл /usr/lib/systemd/systemd-journald имеет контекст «system_u:object_r:syslogd_exec_t». Поменял у себя контекст на аналогичный, но после перезагрузки перехода systemd-journald в домен syslogd_t не произошло. Решил посмотреть, какие точки входа в новые домены вообще доступны для init_t.
# sesearch -T -s init_t
Found 9 semantic te rules:
type_transition init_t var_run_t : file init_var_run_t;
type_transition init_t device_t : fifo_file initctl_t;
type_transition init_t etc_t : file etc_runtime_t;
type_transition init_t xdm_exec_t : process xdm_t;
type_transition init_t initrc_exec_t : process initrc_t;
type_transition init_t getty_exec_t : process getty_t;
type_transition init_t sulogin_exec_t : process sulogin_t;
type_transition init_t shell_exec_t : process sysadm_t;
type_transition init_t shell_exec_t : process initrc_t;
Сделал вывод, что моя версия политик вообще не предусматривает перехода напрямую из init_t в syslogd_t. Зато в домен syslogd_t можно перейти из initrc_t.
# sesearch -T -t syslogd_exec_t
Found 1 semantic te rules:
type_transition initrc_t syslogd_exec_t : process syslogd_t;
Но ведь в моей системе systemd-journald запускается напрямую после systemd. То есть нет промежуточного шага в виде initrc скрипта. Делаю вывод, что мне нужно написать модуль политики для systemd, где разрешу переход init_t->syslogd_t. Потому что в Федоре так и сделано. Полазил по спецификации языка политик, накодил нечто такое:
# systemd.te
policy_module(systemd,1.0.0)
########################################
#
# Declarations
#
gen_require(`type syslogd_t, syslogd_exec_t;')
domain_entry_file(syslogd_t, syslogd_exec_t)
# systemd.if
interface(`systemd_domtrans',`
gen_require(`
type init_t, syslogd_t, syslogd_exec_t;
')
domtrans_pattern(init_t, syslogd_exec_t, syslogd_t)
')