У меня есть сервер, который запускает код, представленный пользователем, для оценки. Я написал службу systemd, которая запускает приложение Python, которое затем запускает отправленный код с помощью песочницы SElinux.
Песочница не запускается из-за следующей ошибки
/usr/bin/sandbox: User account must be setup with an MCS Range
Однако, когда я запускаю свой сервер из командной строки как обычный пользователь, вместо запуска службы systemd он работает без проблем.
Это результат semanage login -l
Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
Мои знания о SELinux очень ограничены. Поскольку он работает при запуске обычным пользователем, я предполагаю, что это как-то связано с system_u?
Запуск Fedora 20.
Приложение python на самом деле является работником сельдерея.
Есть две проблемы, из-за которых это не удается.
Чтобы это работало, вам необходимо:
sandbox
с --level
вариант.Когда вы запускаете службу из командной строки как обычный пользователь, вы, вероятно, работаете в следующем контексте SELinux. Вы можете проверить с помощью id -Z
.
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Этот контекст состоит из пяти частей.
По умолчанию последняя версия песочницы требует, чтобы у пользователя, выполняющего команду песочницы, был определен диапазон MCS (см. совершить 78b077c и совершить 6c2ad1c с 2011 г.). Когда вы работаете как обычный пользователь, все в порядке, потому что у вас определен диапазон MCS. Однако посмотрите на контекст, в котором службы systemd запускаются по умолчанию. (Я получил это, создав сценарий, который распечатал свой контекст SELinux в системный журнал.)
system_u:system_r:unconfined_service_t:s0
Ой! У нас нет ассортимента MCS! Вот почему вы получили ошибку при запуске песочницы в службе systemd.
К счастью, в песочнице есть флаг командной строки, который можно использовать для явной установки частей MLS и MCS в контексте выполнения: --level
. То есть когда ты бежишь
sandbox --level "s0" /path/to/my/command
тогда песочница больше не будет пытаться извлечь диапазон MCS вашего текущего контекста.
Однако если вы внесете указанные выше изменения и попытаетесь повторно запустить службу, вы получите новую ошибку.
/ usr / bin / sandbox: не удалось установить контекст exec на system_u: system_r: sandbox_t: s0. Недействительным аргумент
Эта ошибка означает, что SELinux не позволит вам перейти из контекста systemd в контекст песочницы. Причина этого - пары между двумя разными ролями (system_r / unlimited_r) и доменом песочницы (sandbox_t).
Команда seinfo -rXXXXX -x
показывает вам список пар доменов, которые допустимы с ролью «XXXXX». Поищем sandbox_t.
$ sudo seinfo -runconfined_r -x | grep sandbox_t
chrome_sandbox_t
sandbox_t
$ sudo seinfo -rsystem_r -x | grep sandbox_t
sshd_sandbox_t
chrome_sandbox_t
Таким образом, «sandbox_t» доступен для соединения с «unlimited_r», но не «system_r». Я не знаю, почему это так; я предполагаю, что люди из Red Hat написали песочницу с намерением, чтобы ее запускали только обычные пользователи. К счастью, довольно легко добавить пару между «system_r» и «sandbox_t». Создайте файл политики (с расширением * .te) со следующим содержимым.
policy_module(sandbox_system, 1.0);
require {
type sandbox_t;
}
role system_r types sandbox_t;
Если вы назовете файл «sandbox_system.te», вы можете установить его, выполнив следующие команды.
$ make -f /usr/share/selinux/devel/Makefile sandbox_system.pp
$ sudo semodule -i sandbox_system.pp
Теперь, если вы снова запустите seinfo
, вы должны увидеть правильное соединение.
$ sudo seinfo -rsystem_r -x | grep sandbox_t
sshd_sandbox_t
chrome_sandbox_t
sandbox_t
В зависимости от ваших настроек вам может потребоваться добавить еще несколько правил в файл политики, но с этого момента устранение неполадок и audit2allow сможет выполнять большую часть работы.
Я надеюсь, что это поможет кому-то!