Difference between revisions of "Тестирование под отдельным пользователем"
| (One intermediate revision by the same user not shown) | |||
| Line 1: | Line 1: | ||
Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Тестирование под отдельным пользователем]]  | Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Тестирование под отдельным пользователем]]  | ||
| + | |||
| + | Поддерживается начиная с версии [[изменения в версии 3.5.0|3.5.0]]  | ||
| + | |||
| + | = Описание =  | ||
По умолчанию тестируемая программа запускается на выполнение под тем же самым пользователем, под которым работает сама система ejudge. Организация "песочницы" для безопасного выполнения программы возлагается на патч к ядру Linux или на среду выполнения самого языка (в случае java). Однако патч к ядру не применим в следующих ситуациях:  | По умолчанию тестируемая программа запускается на выполнение под тем же самым пользователем, под которым работает сама система ejudge. Организация "песочницы" для безопасного выполнения программы возлагается на патч к ядру Linux или на среду выполнения самого языка (в случае java). Однако патч к ядру не применим в следующих ситуациях:  | ||
| Line 12: | Line 16: | ||
Для активации режима тестирования под отдельным пользователем необходимо установить конфигурационную переменную <tt>[[serve.cfg:problem:enable_suid_run|enable_suid_run]]</tt> в абстрактной или конкретной задаче. Режим тестирования под отдельным пользователем активируется только если стандартное безопасное выполнение отключено, то есть когда отключен глобальный флаг <tt>[[serve.cfg:global:secure_run|secure_run]]</tt> или отключена безопасность для языка (<tt>[[serve.cfg:language:disable_security|disable_security]]</tt>) или для задачи (<tt>[[serve.cfg:problem:disable_security|disable_security]]</tt>).  | Для активации режима тестирования под отдельным пользователем необходимо установить конфигурационную переменную <tt>[[serve.cfg:problem:enable_suid_run|enable_suid_run]]</tt> в абстрактной или конкретной задаче. Режим тестирования под отдельным пользователем активируется только если стандартное безопасное выполнение отключено, то есть когда отключен глобальный флаг <tt>[[serve.cfg:global:secure_run|secure_run]]</tt> или отключена безопасность для языка (<tt>[[serve.cfg:language:disable_security|disable_security]]</tt>) или для задачи (<tt>[[serve.cfg:problem:disable_security|disable_security]]</tt>).  | ||
| + | |||
| + | Поскольку тестируемая программа работает под пользователем, отличным от пользователя основной системы, усложняется взаимодействие между основной системой и тестируемой программой. Например, становится невозможным отправить сигнал тестируемой программе с помощью системного вызова kill. Для этого необходимо использовать специальную вспомогательную программу [[ej-suid-kill]].  | ||
| + | |||
| + | = Настройка =  | ||
| + | |||
| + | Настройку тестирования под отдельным пользователем нужно выполнить вручную после инсталляции и настройки основной части ejudge.  | ||
| + | |||
| + | 1. Создайте пользователя <tt>ejexec</tt>  | ||
| + | |||
| + |  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  | ||
| + | |||
| + | = Описание вспомогательных программ =  | ||
| + | |||
| + | * [[ej-suid-exec]]  | ||
| + | * [[ej-suid-kill]]  | ||
| + | * [[ej-suid-chown]]  | ||
| + | * [[ej-suid-ipcrm]]  | ||
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