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

Песочница SElinux не запускается из службы systemd

У меня есть сервер, который запускает код, представленный пользователем, для оценки. Я написал службу 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 на самом деле является работником сельдерея.

Есть две проблемы, из-за которых это не удается.

TL; DR

Чтобы это работало, вам необходимо:

  1. Бегать sandbox с --level вариант.
  2. Установите политику, которую я показываю ниже.

Проблема 1: диапазоны MCS

Когда вы запускаете службу из командной строки как обычный пользователь, вы, вероятно, работаете в следующем контексте SELinux. Вы можете проверить с помощью id -Z.

unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Этот контекст состоит из пяти частей.

  1. Ваш Пользователь SELinux (Unlimited_u)
  2. Ваш роль (неограниченный_р)
  3. Ваш домен (неограниченный_т)
  4. Ваш Серия MLS (s0-s0)
  5. Ваш Диапазон MCS (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 вашего текущего контекста.

Проблема 2: пары доменов песочницы

Однако если вы внесете указанные выше изменения и попытаетесь повторно запустить службу, вы получите новую ошибку.

/ 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 сможет выполнять большую часть работы.

Я надеюсь, что это поможет кому-то!