Безопасный способ запуска кода других людей (песочница) на моем сервере? - PullRequest
19 голосов
/ 27 апреля 2009

Я хочу создать веб-сервис, который будет запускать код других людей локально ... Естественно, я хочу ограничить доступ их кода определенным каталогом «песочницы», и чтобы они не могли подключаться к другим частям моего сервера (БД, основной веб-сервер и т. Д.)

Какой лучший способ сделать это?

Запустите VMware / Virtualbox:

(+) Полагаю, это настолько безопасно, насколько это возможно ... даже если кому-то удастся взломать ... они взломают только гостевую машину

(+) может ограничить процессор и память, используемую процессом

(+) прост в настройке .. просто создайте ВМ

(-) сложнее «подключить» каталог песочницы с хоста к гостю

(-) тратить лишнюю память и процессор на управление виртуальной машиной

Запустить привилегированного пользователя:

(+) не тратит лишних ресурсов

(+) каталог песочницы - это просто каталог

(?) Не могу ограничить процессор и память?

(?) Не знаю, достаточно ли это безопасно ...

Любой другой способ?

Сервер под управлением Fedora Core 8, «другие» коды написаны на Java & C ++

Ответы [ 9 ]

14 голосов
/ 10 мая 2009

Чтобы ограничить процессор и память, вы хотите установить ограничения для групп процессов (ограничения ресурсов POSIX применяются только к отдельным процессам). Вы можете сделать это с помощью cgroups.

Например, чтобы ограничить запуск памяти путем монтирования файловой системы cgroups памяти:

# mount cgroup -t cgroup -o memory /cgroups/memory

Затем создайте новый подкаталог для каждой группы, например,

# mkdir /cgroups/memory/my-users

Поместите процессы, которые вы хотите ограничить (процесс с PID "1234" здесь) в эту группу:

# cd /cgroups/memory/my-users
# echo 1234 >> tasks

Установить общий лимит памяти для группы:

# echo 1000000 > memory.limit_in_bytes

Если процессы в группе разветвляются дочерние процессы, они также будут в группе.

Вышеуказанная группа устанавливает ограничение резидентной памяти (т.е. ограниченные процессы начнут меняться вместо того, чтобы использовать больше памяти). Другие cgroups позволяют вам ограничивать другие вещи, такие как время процессора.

Вы можете либо поместить свой серверный процесс в группу (чтобы вся система со всеми ее пользователями попала под ограничения), либо заставить сервер помещать каждый новый сеанс в новую группу.

8 голосов
/ 28 апреля 2009

Чтение страницы codepad.org/about может дать вам несколько интересных идей.

http://codepad.org/about

7 голосов
/ 27 апреля 2009

chroot, тюрьма , контейнер , VServer / OpenVZ / и т. Д., Как правило, более безопасен, чем непривилегированный пользователь, но легче, чем полная виртуализация ОС.

Кроме того, для Java вы можете доверять встроенной изолированной программной среде JVM, а для компиляции C ++ NaCl заявляет, что может выполнять песочницу для кода x86.

Но, как говорится в ответе Шекера, доказано, что возможно нанести злонамеренный ущерб практически из любой «песочницы» в прошлом, и я ожидаю, что в будущем будет постоянно обнаруживаться (и, будем надеяться, исправляться) больше дыр. Вы действительно хотите использовать ненадежный код?

3 голосов
/ 27 апреля 2009
  1. Запуск под непривилегированным пользователем все еще позволяет локальному злоумышленнику использовать уязвимости для повышения привилегий .
  2. Разрешение на выполнение кода на ВМ также может быть небезопасным; злоумышленник может получить доступ к хост-системе, как показал недавний отчет об уязвимости VMWare .

По моему мнению, разрешить запуск собственного кода в вашей системе в первую очередь не очень хорошая идея с точки зрения безопасности. Возможно, вам следует пересмотреть возможность запуска нативного кода, это, безусловно, уменьшит риск.

2 голосов
/ 15 января 2011

попробуйте использовать lxc в качестве контейнера для вашего сервера apache

1 голос
/ 11 августа 2010

Использование Ideone API - самый простой способ.

1 голос
/ 10 мая 2009

Попробуйте немного узнать о настройке политик для SELinux. Если вы работаете в Red Hat Box, вы можете использовать его в дистрибутиве по умолчанию.

Это будет полезно, если вы знаете вещи, к которым у кода не должно быть доступа. Или вы можете поступить наоборот и предоставить доступ только к определенным вещам.

Однако эти политики сложны и могут потребовать больше инвестиций во времени, чем вы, возможно, пожелаете.

1 голос
/ 27 апреля 2009

Проверьте ulimit и друзей о способах ограничения возможностей обездоленного пользователя для DOS машины.

0 голосов
/ 10 мая 2009

Не уверен, сколько усилий вы хотите приложить к этой вещи, но не могли бы вы запустить Xen, как веб-хосты VPS там?

http://www.xen.org/

Это позволило бы получить полный root-доступ на их маленьком кусочке сервера, не ставя под угрозу других пользователей или базовую систему.

...