Тестирование под отдельным пользователем
Навигация: Главная страница/Система ejudge/Использование/Тестирование под отдельным пользователем
Описание
По умолчанию тестируемая программа запускается на выполнение под тем же самым пользователем, под которым работает сама система ejudge. Организация "песочницы" для безопасного выполнения программы возлагается на патч к ядру Linux или на среду выполнения самого языка (в случае java). Однако патч к ядру не применим в следующих ситуациях:
- язык не совместим с патчем (например, ruby, valgrind + gcc/g++ или mono-based языки);
- в задаче требуется использовать системные вызовы, запрещенные патчем (pipe, fork, kill и т. п.).
При отключенных ограничениях безопасности случайная ошибка или намеренное вредоносное поведение тестируемой программы может привести к нарушению нормальной работы системы. В таких ситуациях для повышения устойчивости и безопасности системы рекомендуется применять тестирование под отдельным пользователем.
При тестировании под отдельным пользователем при запуске тестируемой программы на выполнение происходит переключение пользователя процесса с пользователя, под которым работает ejudge (обычно - ejudge), на пользователя ejexec. Тестируемая программа работает с правами пользователя ejexec и поэтому возможности нарушить нормальное функционирование системы ejudge, которая работает под другим пользователем, становятся намного сложнее.
Для смены пользователя, управления и мониторинга выполняющейся программы используются несколько маленьких вспомогательных исполняемых файлов, у которых установлен бит SUID прав доступа. Эти программы не компилируются и инсталлируются по умолчанию при компиляции и инсталляции ejudge, их нужно скомпилировать и проинсталлировать отдельно.
Для активации режима тестирования под отдельным пользователем необходимо установить конфигурационную переменную enable_suid_run в абстрактной или конкретной задаче. Режим тестирования под отдельным пользователем активируется только если стандартное безопасное выполнение отключено, то есть когда отключен глобальный флаг secure_run или отключена безопасность для языка (disable_security) или для задачи (disable_security).
Поскольку тестируемая программа работает под пользователем, отличным от пользователя основной системы, усложняется взаимодействие между основной системой и тестируемой программой. Например, становится невозможным отправить сигнал тестируемой программе с помощью системного вызова kill. Для этого необходимо использовать специальную вспомогательную программу ej-suid-kill.
Настройка
Настройку тестирования под отдельным пользователем нужно выполнить вручную после инсталляции и настройки основной части ejudge.
1. Создайте пользователя ejexec
useradd -c 'ejudge executor' -s '/sbin/nologin' -d / ejexec
2. Скомпилируйте необходимые вспомогательные программы. Для этого в каталоге с исходными кодами ejudge выполните команду
make ej-suid-exec ej-suid-kill ej-suid-chown ej-suid-ipcrm
3. Скопируйте их в нужное место. Пусть ejudge установлен в каталог /opt/ejudge, а серверные исполняемые программы (например, ej-contests) находятся в /opt/ejudge/libexec/ejudge/bin.
cp -p ej-suid-exec ej-suid-kill ej-suid-chown ej-suid-ipcrm /opt/ejudge/libexec/ejudge/bin
Если программа ej-contests находится просто в /opt/ejudge/bin, то и ej-suid-exec и пр. должны копироваться в /opt/ejudge/bin. Возможно, это действие потребуется выполнить из-под пользователя root.
4. Поменяйте владельца и права на эти файлы. Для этого из-под пользователя root перейдите в каталог исполняемых файлов и выполните команды
chown root:root ej-suid-exec ej-suid-kill ej-suid-chown ej-suid-ipcrm chmod 6775 ej-suid-exec ej-suid-kill ej-suid-chown ej-suid-ipcrm