Изоляция недоверенных процессов в контейнерах
Навигация: Главная страница/Система 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
.
Возможно, запуск в контейнерах сломает какие-то задачи, для которых использовались нестандартные способы запуска или проверки.
Поэтому убедитесь, что все старые задачи продолжают работать. При необходимости настройте опции
исполнения в контейнерах с помощью container_options
.