Изоляция недоверенных процессов в контейнерах

From EjudgeWiki

Навигация: Главная страница/Система ejudge/Использование/Изоляция недоверенных процессов в контейнерах

Изоляция компиляции и выполнения программ в контейнерах доступна с версии 3.9.0.

Это — руководство по настройке компиляции и запуска программ в контейнерах.

Контейнеры решают следующие проблемы предыдущих версий:

  • Больше не требуется компиляция и инсталляция модифицированной версии ядра Linux.
  • Поддерживается безопасное выполнение программ на языках программирования, которые ранее были "небезопасными", например, C#.
  • Поддерживается безопасная компиляция программ на C/C++ (includebin хак не работает).

Конфигурирование ejudge

При конфигурировании укажите опции для задания пользователей для компиляции и выполнения.

./configure --with-primary-user=ejudge --with-exec-user=ejexec --with-compile-user=ejcompile ...

Здесь основной пользователь, под которым работает система — ejudge, пользователь для исполнения — ejexec, пользователь для компиляции — ejcompile.

Создайте этих пользователей (если они еще не созданы).

adduser -c 'ejudge executor' -d / -M -s /sbin/nologin ejexec
adduser -c 'ejudge executor 1' -d / -M -s /sbin/nologin ejexec1
adduser -c 'ejudge executor 2' -d / -M -s /sbin/nologin ejexec2
adduser -c 'ejudge executor 3' -d / -M -s /sbin/nologin ejexec3
adduser -c 'ejudge compiler' -d /home/judges/compile -M -s /sbin/nologin ejcompile

Пользователи ejexec1, ejexec2, ejexec3 потребуются, если на одном хосте будет запускаться паралельная проверка.

Скомпилируйте ejudge.

Инсталляция ejudge

Установка выполняется с помощью команды

make install

Однако эта команда не устанавливает правильные права доступа на привилегированные программы, в частности, ej-suid-container. Поэтому под пользователем root выполните команду

/opt/ejudge/bin/ejudge-suid-setup

Если ejudge установлен в другое место, измените путь соответствующим образом.

Затем под обычным пользователем ejudge обновите конфигурацию языков программирования с помощью

/opt/ejudge/bin/ejudge-configure-compilers

После чего под обычным пользователем ejudge выполните команду

/opt/ejudge/libexec/ejudge/bin/ej-suid-update-scripts all

если программа ej-suid-update-scripts не найдена, запускайте ее из

/opt/ejudge/bin/ej-suid-update-scripts all

TODO: запускать из ejudge-configure-compilers автоматически

Подготовка образов системных каталогов

На этом шаге нужно подготовить каталоги, которые будут отображаться в контейнеры вместо системных каталогов. Все операции выполняйте пользователем root. Дальнейшие действия выполняются в предположении, что ejudge проинсталлирован в /opt/ejudge. Если ejudge проинсталлирован в другой каталог, измените пути соответствующим образом.

1. Создайте каталог /opt/ejudge/share/ejudge/container:

mkdir -p /opt/ejudge/share/ejudge/container

2. Перейдите в него

cd /opt/ejudge/share/ejudge/container

3. Создайте пустой каталог empty

mkdir empty

4. Создайте необходимые каталоги для подмены /home:

mkdir -p home/judges/compile

5. Создайте копии системных каталогов /dev, /etc, /root, /var

tar cf - /etc | tar xf -
tar cf - /dev | tar xf -
tar cf - /root | tar xf -
tar cf - /var | tar xf -

6. Теперь почистите эти каталоги, удалив из них каталоги и файлы, которые не должны быть доступны запускаемой программе. Отредактируйте файлы etc/passwd, etc/shadow, etc/group, etc/gshadow, чтобы оставить минимальное количество пользователей.

Настройка конфигурационных файлов ejudge

Для компиляции программ в контейнерах добавьте атрибут enable_compile_container в элемент config файла ejudge.xml.

<config enable_compile_container="yes" ... >

Чтобы включить выполнение программ в контейнерах для всех турниров принудительно добавьте атрибут force_container в элемент config файла ejudge.xml.

<config force_container="yes" ... >

Скорее всего, потребуется добавить и первый, и второй атрибут.

Если атрибут force_container установлен, то запуск программ в контейнерах нельзя отключить в турнирах.

Если force_container не установлен, то в турнирах в конфигурационных параметрах задач добавьте параметр enable_container.

Механизм запуска в контейнерах отключает действие следующих конфигурационных переменных языка программирования: disable_security, insecure.

Механизм запуска в контейнерах отключает действие следующих конфигурационных переменных задачи: disable_security, enable_kill_all, enable_process_group, enable_suid_run.

Возможно, запуск в контейнерах сломает какие-то задачи, для которых использовались нестандартные способы запуска или проверки. Поэтому убедитесь, что все старые задачи продолжают работать. При необходимости настройте опции исполнения в контейнерах с помощью container_options.