Difference between revisions of "Тестирование под отдельным пользователем"

From EjudgeWiki
(Created page with "Навигация: Главная страница/Система ejudge/Использование/[[Тестирование под отдельным...")
 
 
(2 intermediate revisions 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). Однако патч к ядру не применим в следующих ситуациях:
 +
* язык не совместим с патчем (например, ruby, valgrind + gcc/g++ или mono-based языки);
 +
* в задаче требуется использовать системные вызовы, запрещенные патчем (pipe, fork, kill и т. п.).
 +
 +
При отключенных ограничениях безопасности случайная ошибка или намеренное вредоносное поведение тестируемой программы может привести к нарушению нормальной работы системы. В таких ситуациях для повышения устойчивости и безопасности системы рекомендуется применять тестирование под отдельным пользователем.
 +
 +
При тестировании под отдельным пользователем при запуске тестируемой программы на выполнение происходит переключение пользователя процесса с пользователя, под которым работает ejudge (обычно - ejudge), на пользователя ejexec. Тестируемая программа работает с правами пользователя ejexec и поэтому возможности нарушить нормальное функционирование системы ejudge, которая работает под другим пользователем, становятся намного сложнее.
 +
 +
Для смены пользователя, управления и мониторинга выполняющейся программы используются несколько маленьких вспомогательных исполняемых файлов, у которых установлен бит SUID прав доступа. Эти программы не компилируются и инсталлируются по умолчанию при компиляции и инсталляции ejudge, их нужно скомпилировать и проинсталлировать отдельно.
 +
 +
Для активации режима тестирования под отдельным пользователем необходимо установить конфигурационную переменную <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

Описание вспомогательных программ