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