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

From EjudgeWiki
(...)
(...)
 
Line 114: Line 114:
 
Если <code>force_container</code> не установлен, то в турнирах в конфигурационных параметрах задач
 
Если <code>force_container</code> не установлен, то в турнирах в конфигурационных параметрах задач
 
добавьте параметр <code>[[serve.cfg:problem:enable_container|enable_container]]</code>.
 
добавьте параметр <code>[[serve.cfg:problem:enable_container|enable_container]]</code>.
 +
 +
Механизм запуска в контейнерах отключает действие следующих
 +
конфигурационных переменных языка программирования:
 +
<code>[[serve.cfg:language:disable_security|disable_security]]</code>,
 +
<code>[[serve.cfg:language:insecure|insecure]]</code>.
 +
 +
Механизм запуска в контейнерах отключает действие следующих
 +
конфигурационных переменных задачи:
 +
<code>[[serve.cfg:problem:disable_security|disable_security]]</code>,
 +
<code>[[serve.cfg:problem:enable_kill_all|enable_kill_all]]</code>,
 +
<code>[[serve.cfg:problem:enable_process_group|enable_process_group]]</code>,
 +
<code>[[serve.cfg:problem:enable_suid_run|enable_suid_run]]</code>.
  
 
Возможно, запуск в контейнерах сломает какие-то задачи, для которых использовались нестандартные способы запуска или проверки.
 
Возможно, запуск в контейнерах сломает какие-то задачи, для которых использовались нестандартные способы запуска или проверки.
 
Поэтому убедитесь, что все старые задачи продолжают работать. При необходимости настройте опции
 
Поэтому убедитесь, что все старые задачи продолжают работать. При необходимости настройте опции
 
исполнения в контейнерах с помощью <code>[[serve.cfg:problem:container_options|container_options]]</code>.
 
исполнения в контейнерах с помощью <code>[[serve.cfg:problem:container_options|container_options]]</code>.

Latest revision as of 09:18, 24 December 2021

Навигация: Главная страница/Система 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.