Difference between revisions of "Изоляция недоверенных процессов в контейнерах"
(...) |
(...) |
||
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 хак не работает).
Contents
Конфигурирование 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
.