Difference between revisions of "Тестирование под отдельным пользователем"
Line 1: | Line 1: | ||
Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Тестирование под отдельным пользователем]] | Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Тестирование под отдельным пользователем]] | ||
+ | |||
+ | Поддерживается начиная с версии [[изменения в версии 3.5.0|3.5.0]] | ||
= Описание = | = Описание = |
Latest revision as of 14:16, 19 March 2016
Навигация: Главная страница/Система ejudge/Использование/Тестирование под отдельным пользователем
Поддерживается начиная с версии 3.5.0
Описание
По умолчанию тестируемая программа запускается на выполнение под тем же самым пользователем, под которым работает сама система 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