LINUX.ORG.RU

Ограничение прав процеса


0

2

Беру участие в проекте, где разрабатывается система для проверки задач (типа TopCoder, Timus и другие). Когда пользователь как-то посылает свое решение, я должен скомпилировать/интерпретировать его. Но в то же время, я должен ограничить свободу процеса, в котором запускается его решение (открытие сторонних файлов, узнать системное время, изменить текущую директорию etc - в общем типа restricted shell из баша).

То есть существует 2 типа решений:
- решения, которые можно откомпилировать (с/c++/pascal) (ну и плюс решения типа c#/java, которые jit-таються
- решения, которые интерпретируются (list/ruby/python/php) (в самом шыроком смысле слова, так как многие из них сначала транслируются в байт-код (например ruby 1.9 -> yarv), что не суть важно сейчас)

Так вот. Сама система разрабатывается на c# под Mono и .NET. Если процес, в котором запускается компилированное приложение, можно ограничить с помощью Security Attributes для класа Process, то я не представляю, как можно ограничить интерпретируемые...

Буду благодарен за идеи.

Ответ на: комментарий от mashina

sandbox для такого используют

Я думал за VM, но может есть другой путь.

Ribtoks ()

> как можно ограничить интерпретируемые

Точно так же ограничивать процесс интерпретатора, не?

skarrok ()
Ответ на: комментарий от skarrok

Можно, но интерпретатору нужен как минимум доступ к файлу (который интерпретировать) и потом, всякие include/require/import - будут проблемы

Ribtoks ()
Ответ на: комментарий от x3al

Сначала в режиме обучения (чтобы получить правила на либы/файлы/whatever), потом расставить звёздочки и enforce. TOMOYO2, наверно, хватит (TOMOYO1 мощнее, но требует патча на ядро).

x3al ★★★★★ ()

wtf list?

lisp? он не интерпретируемый.

по топику - делай юзера с ограниченными правами, и всё.

anonymous ()

System.Security.Policy спасет отца русской демократии. Если оно конечно под Моно реализовано.

GP ()
Ответ на: комментарий от GP

Сам себя закопать не могу, да и не нужно - я ведь хороший.

mashina ★★★★★ ()
Ответ на: комментарий от mashina

Ок, допустим, sandbox.
Пример sandbox под Linux для С/C++ в студию, пожалуста.
Sandbox для Ruby, Python и PHP нашел. C# - тоже можно устроить. Наверное можно и Java так же.
Но как c/c++? Есть платный Sandboxie под Win...

Ribtoks ()
Ответ на: комментарий от Ribtoks

Ну, то есть софтварный sandbox для c/c++... Так, как chroot и setuid я знаю.

Ribtoks ()
Ответ на: комментарий от Ribtoks

Пример sandbox под Linux для С/C++ в студию, пожалуста.

Зачем именно с/c++? Есть бинарник который уже запускает нужный скрипт/экзешник и вешает хуки на определённые вызовы. Например, сандбокс из генты. Есть ещё варианты, как ниже предложили - запускать под пользователем или chroot/jail. ДАлее можно усложнять - lxc контейнеры.

Делать специальные сандбоксы для определённых инструментов путь тупиковый.

mashina ★★★★★ ()
Ответ на: комментарий от mashina

>хуки на определённые вызовы.
Не поможет. Обходится сисколлами.

x3al ★★★★★ ()

Смотря какой поток (нагрузка). Если не очень большая нагрузка, то можно надежно с помощью виртуальной машины. Надо чтобы она стартовала всегда из одного и того же состояния (предварительно был сохранен образ и сделан hibernate). Сам не пробовал, но уверен, что это возможно. И пусть делают, что хотят.

olegk ★★ ()
Ответ на: комментарий от olegk

Надо чтобы она стартовала всегда из одного и того же состояни

Да, думал сначала. Но нагрузка может быть иногда и 100 сабмитов в 1 минуту. В основном Time Limit для задач - 1 сек. Но все равно немного многовато будет...

Ribtoks ()
Ответ на: комментарий от Ribtoks

Надо чтобы она стартовала всегда из одного и того же состояни

Да, думал сначала. Но нагрузка может быть иногда и 100 сабмитов в 1 минуту. В основном Time Limit для задач - 1 сек. Но все равно немного многовато будет...

нормальное решение. У вас всё равно выходит ферма (в рамки одной машины невлезет). Пусть на ферме и «пасутся» виртуальные машины. К тому-же для виртуальных машин вы сможете сделать более менее справедливо равные условия, а для sandbox-ов - скорее нет. Судя по всему «проверка задач» подразумевает оптимальность по времени/ресурсам ?

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

Судя по всему «проверка задач» подразумевает оптимальность по времени/ресурсам ?

Да, проверка на лимит по времени, памяти и вывода.. То есть вы предлагаете сделать, например, 2 виртуалки одновременно?

Ribtoks ()

ИМХО, надо при каждой проверке _гарантировать_ процессорное время и адекватное время доступа/отклика IO, потому что задача, которая при обычных условиях вложится в лимит 1 с, на высоконагруженной системе может и не вложится. В этом контексте виртуализацию во все поля или играться с ulimit и пр.

А собирать для компилируемых языков можно и в обычном chroot'е или sandbox'е.

И вообще, что за дурацкие лимиты - 1 с??? В каких попугаях она высчитывается? Даже на разных архитектурах компиляторы могут вести себя немного по разному, и в результате один и тот же код будет исполнятся за разное количество тактов. Я уже молчу об разной производительности процессоров. Прям слов нет...

Chaser_Andrey ★★★★★ ()

use ejudge, зачем ещё одна недосистема проверки задач? Допилите в ejudge то, чего там не хватает (если там вообще чего-то не хватает)

bvvv ()
Ответ на: комментарий от Chaser_Andrey

И вообще, что за дурацкие лимиты - 1 с???

Толсто. Если вы ни разу не участвували в контестах по правилам АСМ (что видно по реакции на Time limit в 1 секунду), так незачем троллить. Нормальный лимит.

Да, код будет исполнятся за разное время, но разница будет в пределах 0.001 сек (несущественная), так как одновременно тестируется всего 3-4 задачи.

Ribtoks ()
Ответ на: комментарий от Suntechnic

А почему не банальный apparmor?

Так, как сначала была мечта сделать средствами Mono. Потом уже всякие идеи насчет отдельного сервера с линуксом (или *BSD с jail'ами) на борту.

Ribtoks ()
Ответ на: комментарий от bvvv

зачем ещё одна недосистема проверки задач?

Ибо велосипедить интересно.

Ribtoks ()
Ответ на: комментарий от bvvv

Допилите в ejudge то, чего там не хватает (если там вообще чего-то не хватает)

в ejudge есть один недостаток - С++, вот нифига не оптимальный выбор языка для написания такой системы, надо было брать python, java, да пофиг что, главное чтобы легко переносилось с платформы на платформу, но не С++

shty ★★★★★ ()
Ответ на: комментарий от MKuznetsov

в рамки одной машины невлезет

сто задач по 1 секунде процессорного времени в минуту это 100/60=1.6 ядра. Ну, с учётом оверхедов какой-нить четырёхядерник прокатит. Если, конечно, не запускать виртуалку, но это, имхо, оверкилл. Вполне selinux/apparmor/cgroups/whatever хватит.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

сто задач по 1 секунде процессорного времени в минуту это 100/60=1.6 ядра. Ну, с учётом оверхедов какой-нить четырёхядерник прокатит. Если, конечно, не запускать виртуалку, но это, имхо, оверкилл. Вполне selinux/apparmor/cgroups/whatever хватит.

?? незабывайте - для всех задач равноценные условия (гарантированный CPU,IO) и скорее всего для борьбы с погрешностями - неоднократный запуск. Кстати производительность ОС и число ядер процессора - как бы две разные вселенные и редко пересекающиеся. Ради интереса можете запустить на своей N-процессорной системе 100 HelloWord`ов параллельно и посмотреть затраченное время.

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

Ну так и 1 секунда CPU это тоже сферический конь в вакууме из-за кэшей, различных фоновых процессов итп. В любом случае будет погрешность.

И про многократный прогон там не было ни слова. Я предполагаю что задачи будут равномерно поступать а не наплывами. Да даже если наплывами надо просто будет очередь на исполнение создать.

Короче, я пока твёрдо верю в силы одной тачки. Тут вопрос не в том что она не справится а как правильно посчитать затраченное время.

true_admin ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.